我正在使用gcc 4.9.0,我希望看到编译器警告我有关超出数组范围的问题。如果我编译这个
int main()
{
int table[5]={0};
table[8] = 1234;
int x = table[10];
}
使用g++ -O2 -Wall main.cpp -o main.exe我只会收到有关未使用x的警告:
main.cpp: In function 'int main()':
main.cpp:8:7: warning: unused variable 'x' [-Wunused-variable]
int x = table[10];
^
从gcc文档(https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options)中,我看到-O2与-Wall一起应启用-Warray-bounds = 1检查。如果我尝试添加-Warray-bounds,情况不会改变。实际上,编译器甚至无法识别-Warray-bounds = 1:
g++: error: unrecognized command line option '-Warray-bounds=1'
现在,为什么编译器不发出任何关于错误地写入/读取数组的警告?为何编译器无法识别“-Warray-bounds = 1”?
最佳答案
我怀疑缺少警告是由于优化。编译器很容易看到,您编写的所有行都没有对程序的行为产生任何影响,因此可能选择了跳过这些行。
似乎检查绑定(bind)时间已知的编译时间的阶段恰好是在删除未使用的代码之后执行的,因此GCC从未看到您的错误。
防止这种优化的简单方法是声明数组volatile
。编译器必须将对volatile
对象的任何写入或读取视为副作用,因此无法对其进行优化。