https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100256

            Bug ID: 100256
           Summary: spurious stringop-overflow warning with memset(...,
                    sizeof(dest)) on variable-length array at -O3
           Product: gcc
           Version: 10.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gandalf at winds dot org
  Target Milestone: ---

When 'j_degree' is unknown per the function below, -O3 causes a
stringop-overflow warning to be emitted on memset() with strange region sizes.
The code snapshot below is the result of trying to simplify/remove as many
lines as I could while still causing the warning to generate.

GCC 10.3.0 and GCC 11.0.1 commit a6f018fcc6ce9236ff37eac33b01a0a80103c9f6,
running on x86_64-pc-linux-gnu (Gentoo):

---

typedef long unsigned int size_t;

extern void *memset (void *__s, int __c, size_t __n) __attribute__
((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));

extern void *calloc (size_t __nmemb, size_t __size)
     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__malloc__))
__attribute__ ((__alloc_size__ (1, 2))) ;

static void setup_matrix(double **ppd_xx, double *pd_xy, int j_degree)
{
  int kk;
  double ad_xsum[j_degree*2 + 1];

  memset(ad_xsum,0,sizeof(ad_xsum));

  for(kk=0; kk < j_degree*2 + 1; kk++) {
    ad_xsum[kk]++;
    if(kk < j_degree + 1)
      pd_xy[kk]++;
  }
}

void polyfit(int j_degree, double ad_coef[], double *pd_xy, double **ppd_xx)
{
  int jj;

  for(jj=0;jj<j_degree+1;jj++)
    if(!(ppd_xx[jj] = calloc(j_degree+1,sizeof(double))))
      return;

  setup_matrix(ppd_xx,pd_xy,j_degree);
}

---

gcc-10.3.0 -O3 -c bound.c

In function ‘setup_matrix’,
    inlined from ‘polyfit’ at bound.c:30:3:
bound.c:13:3: warning: ‘memset’ writing between 18446744056529682440 and
18446744073709551608 bytes into a region of size between 18446744056529682440
and 18446744073709551608 [-Wstringop-overflow=]
bound.c: In function ‘polyfit’:
bound.c:11:10: note: at offset 0 to an object with size between
18446744056529682440 and 18446744073709551608 declared here

---

gcc-11.0.1 -O3 -c bound.c

In function ‘setup_matrix’,
    inlined from ‘polyfit’ at bound.c:30:3:
bound.c:13:3: warning: ‘memset’ writing between 18446744056529682440 and
18446744073709551608 bytes into a region of size 9223372036854775807
[-Wstringop-overflow=]
bound.c: In function ‘polyfit’:
bound.c:11:10: note: destination object ‘ad_xsum’ of size 9223372036854775807

Reply via email to