编译器可以在使用未初始化的值时发出警告吗?
所以,让我说我粗心大意,做一个愚蠢的错字..这个文件:
test.c的
#include int main() { int x = x; printf("%d\n",x); }
编译好:
mymachine:~ oll$ gcc test.c mymachine:~ oll$ ./a.out 1782198366
显然int x = x
是一个错误,但编译器在没有警告的情况下接受了这个错误。 我浪费了几个小时来尝试这个错误。
有一个编译器标志,并且可以用于gcc / g ++,当我使用未初始化的堆栈变量时,编译器会给我一个警告吗? 这有可能在将来节省我很多时间。
我试过gcc -O -Wuninitialized test.c
– gcc -O -Wuninitialized test.c
。
提前致谢
编辑:我试过-Wall
,没有提到x
mymachine:~ oll$ gcc -Wall test.c test.c: In function 'main': test.c:7: warning: control reaches end of non-void function
编辑:找到解决方案
似乎在OS X 10.8中使用命令行工具gcc
和g++
不会发出此警告,使用clang
工作:
mymachine:~ oll$ clang -Wall test.c test.c:5:10: warning: variable 'x' is uninitialized when used within its own initialization [-Wuninitialized] int x = x; ~ ^ 1 warning generated.
看起来你想要的警告标志是-Wuninitialized -Winit-self
( 看到它的实时 ):
警告用自己初始化的未初始化变量。 请注意,此选项只能与-Wuninitialized选项一起使用。
例如,GCC仅在指定-Winit-self时警告我在以下代码段中未初始化:
int f() { int i = i; return i; }
此警告由-Wall在C ++中启用。
根据以下评论,可能存在一些版本依赖性。 请注意, clang
仅使用-Wall
为此生成警告,这对我来说更合理:
warning: variable 'x' is uninitialized when used within its own initialization [-Wuninitialized] int x = x; ~ ^
我上面链接的实例还包括一个注释掉的clang
命令行。
另请参阅为什么-Winit-self与-Wuninitialized分开 。
通常,对于任何编译器,积极的优化选项将生成在正常编译期间未发出的警告,包括在此问题中描述的更复杂情况下未初始化或可能未初始化的变量。
由于执行优化所需的执行分析,这是可能的。 因此,作为一般性建议,值得在最高级别(例如-O3
)应用优化,作为一种“穷人的静态分析”,即使您不打算在该级别进行优化部署。