为什么我在这个琐碎的例子中没有得到gcc的“未使用的未初始化”警告?

如何在序列反转程序中修复此分段错误再次出现了一个愚蠢的未初始化变量错误? 。

所以我打算重复“请使用-Wall flags”评论,但是当我测试代码反对警告时,我发现没有任何警告报告给我的惊喜。

所以我把它修改为下面这个(这段代码对于执行目的毫无意义,但它说明了我想要展示的内容):

 #include  int main() { int i,len=12; /* printf("%d\n",i); */ while(i!=len-1) { i++; len--; } return 0; } 

使用gcc 4.7.3和6.2.1编译时

 gcc -Wall -Wextra -pedantic 

我没有得到任何警告,而在使用while循环之前, i公然没有初始化。

现在,如果我取消注释printf语句,我得到:

 warning: 'i' is used uninitialized in this function [-Wuninitialized] 

那么为什么在将i传递给printf而不是在while测试时发出警告?

(不同的gcc没有警告未初始化的变量,因为在我的情况下,没有分支)

(听起来像一个小虫,但它是如此微不足道,我想知道我是不是错过了一些巨大的东西。)

很难说这是一个错误 ,因为gcc混合了代码以进行优化和创建警告,甚至还记录了这个特定的警告:

-Wuninitialized
如果在没有首先初始化的情况下使用自动变量或者如果变量可能被setjmp调用破坏,则发出警告。 […]
由于这些警告取决于优化,因此存在警告的确切变量或元素取决于所使用的GCC的精确优化选项和版本。

(从GCC docs 选项到请求或抑制警告 ,强调我的)

你在这里找到了一个非常愚蠢的恕我直言。 试试-O1 ,你会得到一个意想不到的警告:

 warn.c: In function 'main': warn.c:13:6: warning: 'i' may be used uninitialized in this function [-Wmaybe-uninitialized] i++; ^ 

所以, gcc仍然错过了第一次未初始化的使用,但找到了第二个! 尝试-O0-O2 ,警告再次消失……

您仍然可以尝试提交有关此问题的错误。 注意clang是正确的:

 warn.c:10:9: warning: variable 'i' is uninitialized when used here [-Wuninitialized] while(i!=len-1) ^ warn.c:6:8: note: initialize the variable 'i' to silence this warning int i,len=12; ^ = 0 1 warning generated.