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

Jea*_*bre 14 c gcc compiler-warnings

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

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

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

#include <stdio.h>

int main()
{

  int i,len=12;

  /* printf("%d\n",i); */

  while(i!=len-1)
  {

    i++;
    len--;
  }

 return 0;
 }
Run Code Online (Sandbox Code Playgroud)

使用gcc4.7.3和6.2.1 编译时

gcc -Wall -Wextra -pedantic
Run Code Online (Sandbox Code Playgroud)

我没有得到任何警告,而iwhile循环中使用之前公然没有初始化.

现在如果我取消注释printf我得到的陈述:

warning: 'i' is used uninitialized in this function [-Wuninitialized]
Run Code Online (Sandbox Code Playgroud)

那么,为什么经过时发出警告,iprintf,但不是在while考验?

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

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

小智 7

很难说它是一个错误,因为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++;
      ^
Run Code Online (Sandbox Code Playgroud)

所以,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.
Run Code Online (Sandbox Code Playgroud)

  • 已有一个错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 18501 (2认同)
  • @bolov:从您的链接"嘿伙计们,今年将是这个错误的10周年.我们应该点蛋糕!" :)现在我饿了.感谢大家的答案.看起来gcc创作者对UB并不太在意:) (2认同)