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

时间:2017-09-28 09:18:43

标签: c gcc compiler-warnings

How to fix this segmentation error in a sequence inverting program?中的一个愚蠢的未初始化变量错误。

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

所以我将其修改为下面的内容(此代码对于执行目的没有意义,但它说明了我想要显示的内容):

#include <stdio.h>

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

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

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

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

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

(它与gcc failing to warn of uninitialized variable不同,因为在我的情况下,没有分支)

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

1 个答案:

答案 0 :(得分:7)

很难说它是 bug ,因为gcc混合了代码以进行优化和创建警告,甚至还记录了此特定警告:

  

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

(来自GCC docs Options to Request or Suppress Warnings,强调我的)

你在这里发现了恕我直言。试试-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.