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

            Bug ID: 84079
           Summary: missing -Warray-bounds taking the address of a
                    multidimensional array element
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

The -Warray-bounds checker correctly diagnoses the out-of-bounds references in
the first two functions in the test case below but misses the third, even
though the referenced (nonexistent) element is at the same offset from the end
of the array in both g() and h().  (It's valid to take address of a[2] when a
has just two elements, but it is invalid to take the address of an element of
the subarray a[2].)

$ cat t.c && gcc -O2 -S -Warray-bounds=2 t.c
int a[2][3];

int f (void)
{
  return a[2][0];   // -Warray-bounds (good)
}

int* g (void)
{
  return &a[3][2];   // -Warray-bounds (good)
}

int* h (void)
{
  return &a[2][3];   // missing -Warray-bounds
}
t.c: In function ‘f’:
t.c:5:11: warning: array subscript 2 is above array bounds of ‘int[2][3]’
[-Warray-bounds]
   return a[2][0];   // -Warray-bounds (good)
          ~^~~
t.c: In function ‘g’:
t.c:10:10: warning: array subscript 3 is above array bounds of ‘int[2][3]’
[-Warray-bounds]
   return &a[3][2];   // -Warray-bounds (good)
          ^~~~~~~~

Reply via email to