https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119797

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2025-04-15

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Christoph RĂ¼thing from comment #3)
> @Andrew, thank you for checking. You mean in case r >= 16 we hit the
> dedicated path where "if (r >= 16)" is true and in this branch we know that
> we will access out of bounds and thus issue the warning?

Yes.

> When further thinking about this it makes sense like this, still it is a
> little bit unintuitive for a user to see this. Especially, since the warning
> goes away when changing the ordering. With
> 
>     const uint32_t ce = BUG[r];
> 
>     const uint32_t s = Test<0U>(r);
>     const uint32_t e = Test<1U>(r);
>    
>     const uint32_t cs = BUG[r];
> 
> the warning goes away.

Here 'cs' is CSEd to 'ce' and thus the access is before the if()s which
means that jump threading does not isolate the case of BUG[r] when r
is known >= 16.

Jump threading basically results in array-bound warnings that are given
because you don't constrain the index to the size of the array.  Similar
as to if we were to diagnose

uint32_t Bug(unt8_r r)
{
  return BUG[r];
}

with a "warning: BUG[r] might access BUG out-of-bounds" which wouldn't
be very useful.  In your case you do indirectly constrain the index,
and in one path you constrain it to be always out-of-bounds which is
why we warn.

We just fail to give you this extra information ...

So confirmed, but I'd say it's a duplicate of other instances of this kind.

Reply via email to