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

            Bug ID: 85788
           Summary: False positive of -Wstringop-overflow= warning
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: marxin at gcc dot gnu.org
                CC: msebor at gcc dot gnu.org
  Target Milestone: ---

Probably a know scenario, but I'll report that anyway. It's reduced from
cuneiform package:

$ cat tc2.i
int b;
int *d = 0, *e;
void a(void *k, long l) {
  long f = __builtin_object_size(k, 0);
  __builtin___memset_chk(k, b, l, f);
}
typedef struct {
  int g;
  int h;
  char i[8000 * 8];
} j;
static int make_str_raster(j *k) {
  int *c = d;
  for (; c; c = e)
    k->g = k->h = 32767;

  a(k->i, k->g / 8 * k->h);
  for (; d;)
    ;
}
j m;
void n() { make_str_raster(&m); }

$ gcc tc2.i -O2
In function ‘a’,
    inlined from ‘make_str_raster.constprop’ at tc2.i:17:3,
    inlined from ‘n’ at tc2.i:22:12:
tc2.i:5:3: warning: ‘__builtin___memset_chk’ writing 134180865 bytes into a
region of size 64000 overflows the destination [-Wstringop-overflow=]
   __builtin___memset_chk(k, b, l, f);
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

As seen, d == 0, thus 'for (; c; c = e)' never executes. It's combination of
jump-threading and VRP that triggers the warning.

Reply via email to