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

            Bug ID: 96346
           Summary: missing warning accessing an element of a non-trailing
                    zero length array
           Product: gcc
           Version: 10.1.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: ---

GCC treats trailing arrays of zero length as flexible array members provided
they are a) single-dimensional and b) not nested in another structure.  This is
reflected in the comments in array_at_struct_end_p():

      /* If the reference chain contains a component reference to a
         non-union type and there follows another field the reference
         is not at the end of a structure.  */
      if (TREE_CODE (ref) == COMPONENT_REF)
        {
          ...
        }
      /* If we have a multi-dimensional array we do not consider
         a non-innermost dimension as flex array if the whole
         multi-dimensional array is at struct end.
         Same for an array of aggregates with a trailing array
         member.  */

To help prevent bugs in code that assumes otherwise -Warray-bounds should
diagnose attempts to access elements of zero-length arrays that aren't treated
as "flexible array members," such as those in the test case below:

struct A { char n, a[0]; };
struct B { struct A a; };

int f (struct B *p)
{
  return p->a.a[0];    // missing warning
}

struct C { char a[0][1]; };

int g (struct C *p)
{
  return p->a[0][0];   // missing warning
}

Reply via email to