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?

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:

Attachment: 0001-PR101836-Add-a-new-option-fstrict-flex-array-n.patch
Description: 0001-PR101836-Add-a-new-option-fstrict-flex-array-n.patch

Reply via email to