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

时间:2014-04-09 13:02:21

标签: c gcc warnings

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

test.c的

#include <stdio.h>

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 - 没有工作。

提前致谢

修改:我已尝试-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中使用命令行工具gccg++并未发出此警告,使用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.

2 个答案:

答案 0 :(得分:9)

您想要的warning标记似乎是-Wuninitialized -Winit-self see it live ):

  

警告用自己初始化的未初始化变量。请注意,此选项只能与-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命令行。

另见Why is -Winit-self separate from -Wuninitialized

答案 1 :(得分:0)

通常,对于任何编译器,积极的优化选项都会生成在正常编译期间未发出的警告,包括在此问题中描述的更复杂情况下未初始化或可能未初始化的变量。

由于执行优化所需的执行分析,这是可能的。因此,作为一般性建议,值得在最高级别(例如-O3)应用优化,作为一种“穷人”的静态分析&#34;即使你做了不打算在该级别进行优化部署。