On Tue, Feb 9, 2021 at 1:04 AM Martin Sebor via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On 2/8/21 12:09 PM, Jeff Law wrote:
> >
> >
> > On 2/3/21 3:45 PM, Martin Sebor wrote:
> >> On 2/3/21 2:57 PM, Jeff Law wrote:
> >>>
> >>>
> >>> On 1/28/21 4:03 PM, Martin Sebor wrote:
> >>>> The GCC 11 -Warray-bounds enhancement to diagnose accesses whose
> >>>> leading offset is in bounds but whose trailing offset is not has
> >>>> been causing some confusion.  When the warning is issued for
> >>>> an access to an in-bounds member via a pointer to a struct that's
> >>>> larger than the pointed-to object, phrasing this strictly invalid
> >>>> access in terms of array subscripts can be misleading, especially
> >>>> when the source code doesn't involve any arrays or indexing.
> >>>>
> >>>> Since the problem boils down to an aliasing violation much more
> >>>> so than an actual out-of-bounds access, the attached patch adjusts
> >>>> the code to issue a -Wstrict-aliasing warning in these cases instead
> >>>> of -Warray-bounds.  In addition, since the aliasing assumptions in
> >>>> GCC can be disabled by -fno-strict-aliasing, the patch also makes
> >>>> these instances of the warning conditional on -fstrict-aliasing
> >>>> being in effect.
> >>>>
> >>>> Martin
> >>>>
> >>>> gcc-98503.diff
> >>>>
> >>>> PR middle-end/98503 -Warray-bounds when -Wstrict-aliasing would be
> >>>> more appropriate
> >>>>
> >>>> gcc/ChangeLog:
> >>>>
> >>>>      PR middle-end/98503
> >>>>      * gimple-array-bounds.cc (array_bounds_checker::check_mem_ref):
> >>>>      Issue -Wstrict-aliasing for a subset of violations.
> >>>>      (array_bounds_checker::check_array_bounds):  Set new member.
> >>>>      * gimple-array-bounds.h (array_bounds_checker::cref_of_mref): New
> >>>>      data member.
> >>>>
> >>>> gcc/testsuite/ChangeLog:
> >>>>
> >>>>      PR middle-end/98503
> >>>>      * g++.dg/warn/Warray-bounds-10.C: Adjust text of expected warnings.
> >>>>      * g++.dg/warn/Warray-bounds-11.C: Same.
> >>>>      * g++.dg/warn/Warray-bounds-12.C: Same.
> >>>>      * g++.dg/warn/Warray-bounds-13.C: Same.
> >>>>      * gcc.dg/Warray-bounds-63.c: Avoid -Wstrict-aliasing.  Adjust text
> >>>>      of expected warnings.
> >>>>      * gcc.dg/Warray-bounds-66.c: Adjust text of expected warnings.
> >>>>      * gcc.dg/Wstrict-aliasing-2.c: New test.
> >>>>      * gcc.dg/Wstrict-aliasing-3.c: New test.
> >>> What I don't like here is the strict-aliasing warnings inside the file
> >>> and analysis phase for array bounds checking.
> >>>
> >>> ISTM that catching this at cast time would be better.  So perhaps in
> >>> build_c_cast and the C++ equivalent?
> >>>
> >>> It would mean we're warning at the cast site rather than the
> >>> dereference, but that may ultimately be better for the warning anyway.
> >>> I'm not sure.
> >>
> >> I had actually experimented with a this (in the middle end, and only
> >> for accesses) but even that caused so many warnings that I abandoned
> >> it, at least for now.  -Warray-bounds has the benefit of flow analysis
> >> (and dead code elimination).  In the front end it would have neither
> >> and be both excessively noisy and ineffective at the same time.  For
> >> example:
> > I think we agree that this really is an aliasing issue and I would go
> > further and claim that it has nothing to do with array bounds checking.
> > Therefore warning for it within gimple-array-bounds just seems wrong.
> >
> > I realize that you like having DCE run and the ability to look at
> > offsets and such, but it really feels like the wrong place to do this.
> > Aliasing issues are also more of a front-end thing since the language
> > defines what is and what is not valid aliasing -- one might even argue
> > that any aliasing warning needs to be identified by the front-ends
> > exclusively (though possibly pruned away later).
>
> The aliasing restrictions are on accesses, which are [defined in
> C as] execution-time actions on objects.  Analyzing execution-time
> actions unavoidably depends on flow analysis which the front ends
> have only very limited support for (simple expressions only).
> I gave one example showing how the current -Wstrict-aliasing in
> the front end is ineffective against all but the most simplistic
> bugs, but there are many more.  For instance:
>
>    int i;
>    void *p = &i;    // valid
>    float *q = p;    // valid
>    *q = 0;          // aliasing violation
>
> This bug is easily detectable in the middle end but impossible
> to do in the front end (same as all other invalid accesses).

But the code is valid in GIMPLE which allows to re-use the 'int i' storage
with storing using a different type.

> Whether this is done in gimple-array-bounds or some other pass seems
> to me like a minor implementation detail.  It naturally came out of
> an enhancement I implemented there (which would detect the above
> with float replaced by any larger type as an out-of-bounds access)
> but I have no problem with moving this subset to some other pass
> (or duplicating it there).  In fact, as I said, I'd like to enhance
> -Wstrict-aliasing to detect more bugs at some point, so that might
> be a good time to move this instance of the warning there as well.
> But the enhancement I'm thinking of is in the middle end, not in
> the front end.
>
> In any event, the warning is valid, just the phrasing is misleading
> since there in the case of the struct member there isn't necessarily
> any subscripting involved or even an access to members beyond the end
> of the accessed object.  Issuing it under -Warray-bounds and with
> -fno-strict-aliasing compounds the problem.  I put together this
> patch in response to the feedback I got from you and from the reporter
> in PR 98503 where you both made this point, so I'm not sure why
> improving it as both of you suggested is an issue.
>
> Martin

Reply via email to