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

--- Comment #11 from Martin Sebor <msebor at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #3)
> (In reply to Martin Sebor from comment #1)
> > The false positive is not due a shortcoming of the warning but rather due to
> > GCC not having a sufficiently sophisticated analysis of relationships of
> > pointers into the same objects.  The same warning (and probably a numbers as
> > well) can be reproduced with a simpler example.
> > 
> > $ cat pr94675.c && gcc -O2 -S -Wall -fdump-tree-vrp=/dev/stdout pr94675.c
> > unsigned char c, n;
> > 
> > int f (void)
> > {
> >   if (n <= 7) return 0;
> > 
> >   unsigned char *p = &c, *q = p + n;
> > 
> >   if (q - p <= 7)   // not eliminated
> >     return 0;
> 
> Not sure why you write not eliminated - it is eliminated.  I believe
> your testcase is bogus - why would the p[7] access never happen?
> Because p + n is invoking undefined behavior?

I may not have entirely accurately describe what happens in the small test case
but yes, p + n is undefined for values of n > 1, so the test (either of them)
can be assumed to be true and the dereference can be eliminated.  The following
might be better:

unsigned char c, n;

int f (void)
{
  unsigned char *p = &c, *q = p + n;

  if (q - p <= 7)   // not eliminated but could be
    return 0;

  return p[7];      // spurious -Warray-bounds
}

Reply via email to