On April 17, 2015 8:01:42 PM GMT+02:00, Steve Ellcey <sell...@imgtec.com> wrote: >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?
Yes. Once you reach the array reference it will be out of bounds. The difference in behavior between bar and baz seems odd. > Yeah, I suppose VRP gets conservative in a way that's not helpful for consistency of this warning. ~[0,0] and ~[-2,-2] likely meet as VARYING and the warning code doesn't look at equivalences. Richard. >Steve Ellcey >sell...@imgtec.com