On Thu, 22 Dec 2022, Qing Zhao wrote: > > > > 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?
I wonder if that function should check DECL_NOT_FLEXARRAY? > > > > 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? I think the main information is preserved in diagnosing the flex vs. non-flex array assumption. > > > >>> 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? I think in similar situations we try to DWIM, but in some cases it will result in "garbage" behavior. I don't think there's anything we can do here besides trying to diagnose such mismatches with -flto at the WPA stage. Richard.