This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Re: why -> warning: array subscript is above array bounds
- From: Jim Wilson <jim dot wilson at linaro dot org>
- To: çé <syokandake at gmail dot com>, gcc-bugs at gcc dot gnu dot org
- Date: Fri, 29 May 2015 15:09:27 -0700
- Subject: Re: why -> warning: array subscript is above array bounds
- Authentication-results: sourceware.org; auth=none
- References: <55676F54 dot 2080108 at gmail dot com>
On 05/28/2015 12:41 PM, çé wrote:
> gcc is, in this code, or put out a warning?
> -O4 only???
-O3 and higher enables more aggressive loop unrolling. This happens in
the pass_complete_unrolli function. With -O3 or higher, the inner loop
is unrolled 12 times because the array size is 12. The array bounds
checking code then notices that the last 6 copies of the unrolled loop
body access past the end of the loop and emits warnings for them. Thus
you get 6 warnings. Without the unrolling, we don't have enough info to
generate any warnings. This is odd behaviour, but I'm not sure if it
should be a bug or not. Perhaps just an enhancement request to make it
work better.
> + cat -n bug.c
> 1 #include <stdio.h>
> 2 int ary[2][12] ;
> 3 void func(int x,int y)
> 4 {
> 5 int i,j ;
> 6 for(i = 0 ; i < x ; i++) {
> 7 for(j = 0 ; j < y ; j++) {
> 8 ary[i][j + y] = 0 ;
> 9 }
> 10 }
> 11 }
The code is potentially unsafe, because there are no array bounds checks
in here. If I add a line
assert (x <= 2 && y <= 6);
and include assert.h then the warnings go away at -O3.
FYI This mailing list is primarily for email from our bugzilla bug
database. It is better to file a bug into bugzilla than to send email
here, as email here isn't tracked.
Jim