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

            Bug ID: 92936
           Summary: missing warning on a past-the-end store to a PHI
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

Out of bounds stores to destinations that are the results of conditionals like
the one in g() below are not diagnosed.  They should be both by -Warray-bounds
and by -Wstringop-overflow (without duplicates) but they're not because PHI
expressions aren't handled.

$ cat b.c && gcc -O2 -S -Wall b.c
void sink (void*);

void f (int n)
{
  char a3[3], a5[5], *p;

  if (n <= 3)
    {
      n = 3;
      p = a3;
      p[n] = 0;   // -Warray-bounds
    }
  else
    {
      n = 5;
      p = a5;
      p[n] = 0;   // -Warray-bounds
    }

  sink (p);
}

void g (int n)
{
  char a3[3], a5[5], *p;

  if (n <= 3)
    {
      n = 3;
      p = a3;
    }
  else
    {
      n = 5;
      p = a5;
    }

  p[n] = 0;       // missing warning
  p[n + 1] = 1;   // missing warning
  p[n + 9] = 2;   // missing warning
  p[12345] = 3;   // missing warning

  sink (p);
}

b.c: In function ‘f’:
b.c:17:8: warning: array subscript 5 is outside array bounds of ‘char[5]’
[-Warray-bounds]
   17 |       p[n] = 0;   // -Warray-bounds
      |       ~^~~
b.c:5:15: note: while referencing ‘a5’
    5 |   char a3[3], a5[5], *p;
      |               ^~
b.c:11:8: warning: array subscript 3 is outside array bounds of ‘char[3]’
[-Warray-bounds]
   11 |       p[n] = 0;   // -Warray-bounds
      |       ~^~~
b.c:5:8: note: while referencing ‘a3’
    5 |   char a3[3], a5[5], *p;
      |        ^~

Reply via email to