On Mon, Jun 27, 2022 at 4:20 PM Qing Zhao via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Hi, > > Per our discussion in the bug report, I came up with the following patch: > > ======= > > PR101836: Add a new option -fstrict-flex-array[=n] > > Add the new option and use it in __builtin_object_size. > > Treat the trailing array of a structure as a flexible array member in a > stricter way. The value of 'n' controls the level of strictness. > 'n'=0 is the least strict, all trailing arrays of structures are treated > as flexible array members; This is the default behavior of GCC without specify > this option. > 'n'=3 is the strictest, only when the trailing array is declared as a > flexible array member per C99 standard onwards ([]), it is treated as a > flexible array member; > There are two more levels in between 0 and 3, which are provided to support > older codes that use GCC zero-length array extension ([0]), or one-size array > as > flexible array member ([1]): > When 'n' is 1, the trailing array is treated as a flexible array member > when it is declared as either [], [0], or [1]; > When 'n' is 2, the trailing array is treated as a flexible array member > when it is declared as either [], or [0]. > > There are other places in GCC that conservatively treat flexible array > members. > A follow-up patch will make -ftrict-flex-array option to control all these > places consistently. > > Bootstrapped and regression tested on both X86 and aarch64, no issues. > > Any comment and suggestion?
Since this aims at the C or C++ frontends but the middle-end eventually consumes this it would be much nicer to encode this in the types themselves. Since the least strict reading is the default right now it would be a flag (on the FIELD_DECL I suppose) like DECL_NOT_FLEXARRAY or DECL_FIXED_SIZE? Alternatively the flag could also be on the record type enclosing the trailing array member (but type sharing might make this more difficult in the end). There's also array_at_struct_end_p which is supposed to be the main query interface for this (but it seems people sneaked in more variants with eventually different semantics ... :/) Richard. > Okay for commit to Gcc13? > > thanks. > > Qing > > ======================= > > gcc/ > > PR tree-optimization/101836 > * common.opt (fstrict-flex-array, fstrict-flex-array=): New options. > * doc/invoke.texi (-fstrict-flex-array, -fstrict-flex-array=): > Document. > * tree-object-size.cc (addr_object_size): Call is_flexible_array_p to > check whether an array is a flexible array. > * tree.cc (special_array_member_type): New routine. > (is_flexible_array_p): New routine. > (component_ref_size): Call special_array_member_type to decide the > type of special array member. > * tree.h (enum struct special_array_member): Add is_vla, trail_flex. > (special_array_member_type): New prototype. > (is_flexible_array_p): New prototype. > > gcc/testsuite/ > > PR tree-optimization/101836 > * gcc.dg/pr101836.c: New test. > * gcc.dg/pr101836_1.c: New test. > * gcc.dg/pr101836_2.c: New test. > * gcc.dg/pr101836_3.c: New test. > * gcc.dg/pr101836_4.c: New test. > * gcc.dg/pr101836_5.c: New test. > > > The complete patch is: >