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:
>

Reply via email to