On 6/28/22 01:16, Richard Biener wrote:
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 ... :/)

The conservative array_at_struct_end_p has historically been used
for codegen.  component_ref_size was added as a separate function
with more flexible (including stricter) semantics to implement
warnings without running the risk of interfering with codegen.

Martin


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