On Thu, 2015-04-16 at 13:55 +0200, Richard Biener wrote:
> The following applies the patch produced earlier this year, applying
> TLC to array bound warnings and catching a few more cases.
> 
> Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
> 
> Richard.
> 
> 2015-04-16  Richard Biener  <rguent...@suse.de>
> 
>       PR tree-optimization/64277
>       * tree-vrp.c (check_array_ref): Fix anti-range handling,
>       simplify upper bound handling.
>       (search_for_addr_array): Simplify.
>       (check_array_bounds): Handle ADDR_EXPRs here.
>       (check_all_array_refs): Simplify.

This caused an interesting build failure of glibc when using the latest
GCC.  Here is a cut down case from elf/dl-open.c:

        extern void foo(void);
        struct s { int n; } v[1];
        int bar (int i)
        {
                if ((i != 0 && i != -1 && i != -2) && (v[i].n == 0))
                        foo ();
                return 0;
        }
        int baz (int i)
        {
                if ((i != 0 && i != -2) && (v[i].n == 0))
                        foo ();
                return 0;
        }

When compiled with -O2 -Wall -Werror, I now get an error about v[i]
being out-of-bounds in bar.  But I do not get this error in baz (where
we don't check for -1.  In reality, in glibc, we know that i can only be
0, -1, or -2.  GCC of course doesn't know that.  Does this error/warning
seem right?  The difference in behavior between bar and baz seems odd.

Steve Ellcey
sell...@imgtec.com

Reply via email to