The -fstrict-flex-arrays=3 is the most restrictive type of flex arrays.
No number, including 0, is allowed in the FAM. In the cases where a "0"
is used, the resulting size is the same as if a zero-sized object were
substituted.
This is needed for proper _FORTIFY_SOURCE coverage in the Linux kernel,
among other reasons. So while the only reason for specifying a
zero-length array at the end of a structure is for specify a FAM,
treating it as such will cause _FORTIFY_SOURCE not to work correctly;
__builtin_object_size will report -1 instead of 0 for a destination buffer
size to keep any kernel internals from using the deprecated members as
fake FAMs.
For example:
struct broken { int foo; int fake_fam[0]; struct something oops; };
There have been bugs where the above struct was created because "oops" was
added after "fake_fam" by someone not realizing. Under __FORTIFY_SOURCE, doing:
memcpy(p->fake_fam, src, len);
raises no warnings when __builtin_object_size(p->fake_fam, 1) returns -1 and
will stomp on "oops."
Omitting a warning when using the (invalid) zero-length array is how GCC
is treating -fstrict-flex-arrays=3. A warning in that situation is likely
an irritant, because requesting this option level is explicitly requesting
this behavior.
I think another way to phrase this is that level 3 only supports flexible array members as the feature is defined by the C standard, aka, this is standards-conforming mode. WDYT?