https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82608
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Known to fail| |10.1.0, 11.0, 8.4.0, 9.3.0 Last reconfirmed|2019-11-05 00:00:00 |2020-6-10 --- Comment #4 from Martin Sebor <msebor at gcc dot gnu.org> --- GCC 11 issues -Wuninitialized for all accesses but only because the test case isn't careful enough to initialize the arrays before using them: $ gcc -O2 -S -Wall -Wextra pr82608.c pr82608.c: In function ‘idx_negative’: pr82608.c:18:11: warning: ‘*(<unknown>)[-99]’ is used uninitialized [-Wuninitialized] 18 | return a[-99]; // -Warray-bounds (since GCC 8) | ~^~~~~ pr82608.c: In function ‘idx_cst_too_big’: pr82608.c:25:11: warning: ‘*(<unknown>)[<unknown>]’ is used uninitialized [-Wuninitialized] 25 | return a[n + 1]; // missing _Warray-bounds | ~^~~~~~~ pr82608.c: In function ‘idx_out_of_type_bounds’: pr82608.c:31:11: warning: ‘*(<unknown>)[2147483647]’ is used uninitialized [-Wuninitialized] 31 | return a[__INT_MAX__]; // missing -Warray-bounds | ~^~~~~~~~~~~~~ pr82608.c: In function ‘idx_var_too_big’: pr82608.c:37:11: warning: ‘*(<unknown>)[<unknown>]’ is used uninitialized [-Wuninitialized] 37 | return a[n + 1]; // missing -Warray-bounds | ~^~~~~~~ With -Wno-uninitialized or with the arrays initialized GCC still doesn't detect all the out-of-bounds accesses: $ cat pr82608.c && gcc -O2 -S -Wall -Wextra pr82608.c void sink (void*); int f (unsigned n) { if (n < 1 || n > 32) n = 32; char vla[n]; sink (vla); return vla[97]; // missing -Warray-bounds } int idx_negative (void) { int n = 4; char a[n]; sink (a); return a[-99]; // -Warray-bounds (since GCC 8) } int idx_cst_too_big (void) { int n = 4; char a[n]; sink (a); return a[n + 1]; // missing _Warray-bounds } int idx_out_of_type_bounds (unsigned char n) { char a[n]; sink (a); return a[__INT_MAX__]; // missing -Warray-bounds } int idx_var_too_big (int n) { char a[n]; sink (a); return a[n + 1]; // missing -Warray-bounds } pr82608.c: In function ‘idx_negative’: pr82608.c:17:11: warning: array subscript -99 is below array bounds of ‘char[<U3750> + 1]’ [-Warray-bounds] 17 | return a[-99]; // -Warray-bounds (since GCC 8) | ~^~~~~ pr82608.c:15:8: note: while referencing ‘a.16’ 15 | char a[n]; | ^ pr82608.c: In function ‘idx_cst_too_big’: pr82608.c:25:11: warning: array subscript 5 is above array bounds of ‘char[<U3ea0> + 1]’ [-Warray-bounds] 25 | return a[n + 1]; // missing _Warray-bounds | ~^~~~~~~ pr82608.c:23:8: note: while referencing ‘a.18’ 23 | char a[n]; | ^