> On Dec 22, 2022, at 2:09 AM, Richard Biener <rguent...@suse.de> wrote:
> 
> On Wed, 21 Dec 2022, Qing Zhao wrote:
> 
>> Hi, Richard,
>> 
>> Thanks a lot for your comments.
>> 
>>> On Dec 21, 2022, at 2:12 AM, Richard Biener <rguent...@suse.de> wrote:
>>> 
>>> On Tue, 20 Dec 2022, Qing Zhao wrote:
>>> 
>>>> Hi,
>>>> 
>>>> This is the patch for mentioning -fstrict-flex-arrays and -Warray-bounds=2 
>>>> changes in gcc-13/changes.html.
>>>> 
>>>> Let me know if you have any comment or suggestions.
>>> 
>>> Some copy editing below
>>> 
>>>> Thanks.
>>>> 
>>>> Qing.
>>>> 
>>>> =======================================
>>>> From c022076169b4f1990b91f7daf4cc52c6c5535228 Mon Sep 17 00:00:00 2001
>>>> From: Qing Zhao <qing.z...@oracle.com>
>>>> Date: Tue, 20 Dec 2022 16:13:04 +0000
>>>> Subject: [PATCH] gcc-13/changes: Mention -fstrict-flex-arrays and its 
>>>> impact.
>>>> 
>>>> ---
>>>> htdocs/gcc-13/changes.html | 15 +++++++++++++++
>>>> 1 file changed, 15 insertions(+)
>>>> 
>>>> diff --git a/htdocs/gcc-13/changes.html b/htdocs/gcc-13/changes.html
>>>> index 689178f9..47b3d40f 100644
>>>> --- a/htdocs/gcc-13/changes.html
>>>> +++ b/htdocs/gcc-13/changes.html
>>>> @@ -39,6 +39,10 @@ a work-in-progress.</p>
>>>>    <li>Legacy debug info compression option <code>-gz=zlib-gnu</code> was 
>>>> removed
>>>>      and the option is ignored right now.</li>
>>>>    <li>New debug info compression option value <code>-gz=zstd</code> has 
>>>> been added.</li>
>>>> +    <li><code>-Warray-bounds=2</code> will no longer issue warnings for 
>>>> out of bounds
>>>> +      accesses to trailing struct members of one-element array type 
>>>> anymore. Please
>>>> +      add <code>-fstrict-flex-arrays=level</code> to control how the 
>>>> compiler treat
>>>> +      trailing arrays of structures as flexible array members. </li>
>>> 
>>> "Instead it diagnoses accesses to trailing arrays according to 
>>> <code>-fstrict-flex-arrays</code>."
>> 
>> Okay.
>>> 
>>>> </ul>
>>>> 
>>>> 
>>>> @@ -409,6 +413,17 @@ a work-in-progress.</p>
>>>> <h2>Other significant improvements</h2>
>>>> 
>>>> <!-- <h3 id="uninitialized">Eliminating uninitialized variables</h3> -->
>>>> +<h3 id="flexible array">Treating trailing arrays as flexible array 
>>>> members</h3>
>>>> +
>>>> +<ul>
>>>> + <li>GCC can now control when to treat the trailing array of a structure 
>>>> as a 
>>>> +     flexible array member for the purpose of accessing the elements of 
>>>> such
>>>> +     an array. By default, all trailing arrays of structures are treated 
>>>> as
>>> 
>>> all trailing arrays in aggregates are treated
>> Okay.
>>> 
>>>> +     flexible array members. Use the new command-line option
>>>> +     <code>-fstrict-flex-array=level</code> to control how GCC treats the 
>>>> trailing
>>>> +     array of a structure as a flexible array member at different levels.
>>> 
>>> <code>-fstrict-flex-arrays</code> to control which trailing array
>>> members are streated as flexible arrays.
>> 
>> Okay.
>> 
>>> 
>>> I've also just now noticed that there's now a flag_strict_flex_arrays
>>> check in the middle-end (in array bound diagnostics) but this option
>>> isn't streamed or handled with LTO.  I think you want to replace that
>>> with the appropriate DECL_NOT_FLEXARRAY check.
>> 
>> We need to know the level value of the strict_flex_arrays on the struct 
>> field to issue proper warnings at different levels. DECL_NOT_FLEXARRAY 
>> does not include such info. So, what should I do? Streaming the 
>> flag_strict_flex_arrays with LTO?
> 
> But you do
> 
>  if (compref)
>    {
>      /* Try to determine special array member type for this 
> COMPONENT_REF.  */
>      sam = component_ref_sam_type (arg);
>      /* Get the level of strict_flex_array for this array field.  */
>      tree afield_decl = TREE_OPERAND (arg, 1);
>      strict_flex_array_level = strict_flex_array_level_of (afield_decl);
> 
> I see that function doesn't look at DECL_NOT_FLEXARRAY but just
> checks attributes (those are streamed in LTO).

Yes, checked both flag_strict_flex_arrays and attributes. 

There are two places in middle end calling “strict_flex_array_level_of” 
function, 
one inside “array_bounds_checker::check_array_ref”, another one inside 
“component_ref_size”.
Shall we check DECL_NOT_FLEXARRAY field instead of calling 
“strict_flex_array_level_of” in both places?

> 
> OK, so I suppose the diagnostic itself would become just less precise
> as in "trailing array %qT should not be used as a flexible array member"
> without the "for level N and above" part of the diagnostic?

Yes, that might be the major impact.

If only check DECL_NOT_FLEXARRAY, we will lose such information. Does that 
matter?

> 
>>> We might also want
>>> to see how inlining accesses from TUs with different -fstrict-flex-arrays
>>> setting behaves when accessing the same structure (and whether we might
>>> want to issue an ODR style diagnostic there).
> 
> This mixing also means streaming -fstrict-flex-arrays won't be of much
> help in general.

Then under such situation, i.e, different -fstrict-flex-arrays levels for the 
same structure from different TUs, how should we handle it? 
> 
>> Yes, good point, I will check on this part.
>> 
>> BTW, a stupid question: what does ODR mean?
> 
> It's the One-Definition-Rule (of C++).  Basically we'd diagnose
> same struct declarations with different -fstrict-flex-arrays setting.
> I see we miss comparing DECL_NOT_FLEXARRAY for tree merging, I'm
> testing a patch to fix that now.

Okay, thanks a lot for the help.

Qing
> 
> Richard.
> 
>> thanks.
>> 
>> Qing
>>> 
>>> Thanks,
>>> Richard.
>> 
>> 
> 
> -- 
> Richard Biener <rguent...@suse.de>
> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
> Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
> HRB 36809 (AG Nuernberg)

Reply via email to