On Tue, Jun 5, 2018 at 1:39 AM Martin Sebor <mse...@gmail.com> wrote: > > GCC silently (without -Wpedantic) accepts declarations of zero > length arrays that are followed by other members in the same > struct, such as in: > > struct A { char a, b[0], c; }; > > Is it intended that accesses to elements of such arrays that > alias other members be well-defined?
The middle-end assumes that fields in a structure do not overlap. For overlaps you have to use a union. In C++ I guess the rule that sizeof() of anything is at least 1 saves you here so IMHO this is a C FE bug and we should probably simply reject non-trailing empty arrays. Note since b has size zero there isn't any real overlap, so ... > In my tests, GCC assumes that neither read nor write accesses > to elements of internal zero-length arrays alias other members, > so assuming those aren't bugs I wonder if the documentation > should be updated to make that clear and a warning added for > such declarations (and perhaps also accesses). > > For example, the test in the following function is eliminated, > implying that GCC assumes that the access to p->b does not modify > p->c, even though with i set to 0 it would: > > void f (struct A *p, int i) > { > int x = p->c; > p->b[i] = 1; > if (x != p->c) > __builtin_abort (); ... your testcase simply invokes undefined behavior by accessing b out of bounds. Richard. > } > > Martin