编译器可以在使用未初始化的值时发出警告吗?

OLL*_*OLL 9 c gcc warnings

所以,让我说我粗心大意并犯了一个愚蠢的错字..这个档案:

test.c的

#include <stdio.h>

int main()
{
    int x = x;
    printf("%d\n",x);
}
Run Code Online (Sandbox Code Playgroud)

编译好:

mymachine:~ oll$ gcc test.c 
mymachine:~ oll$ ./a.out 
1782198366
Run Code Online (Sandbox Code Playgroud)

显然int x = x是一个错误,但编译器在没有警告的情况下接受了这个.我浪费了几个小时来尝试这个错误.

是否有一个编译器标志,并且可以用于gcc/g ++以使编译器在使用未初始化的堆栈变量时给出警告?这可能会为我节省很多时间.

我试过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
Run Code Online (Sandbox Code Playgroud)

编辑:找到解决方案

似乎使用命令行工具gccg++在OS X 10.8中没有提供此警告,使用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.
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 9

它看起来像你想要的警告标志-Wuninitialized -Winit-self(见它现场):

警告用自己初始化的未初始化变量.请注意,此选项只能与-Wuninitialized选项一起使用.

例如,GCC仅在指定-Winit-self时警告我在以下代码段中未初始化:

int f()
{
    int i = i;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

此警告由-Wall在C++中启用.

根据以下评论,可能存在一些版本依赖性.请注意,clang这只是使用生成警告,这-Wall对我来说更合理:

warning: variable 'x' is uninitialized when used within its own initialization [-Wuninitialized]
int x = x;
    ~   ^
Run Code Online (Sandbox Code Playgroud)

我上面链接的实例还包括一个注释掉的clang命令行.

另请参阅为什么-Winit-self与-Wuninitialized分开.