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