【问题标题】:gcc -Wall -Wuninitialized is not throwing warning for uninitialized variablegcc -Wall -Wuninitialized 不会对未初始化的变量发出警告
【发布时间】:2016-03-09 00:42:12
【问题描述】:

gcc 版本-gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

使用 -Wall -Wuninitialized 编译下面的代码会按预期抛出警告 警告:在此函数中未初始化使用“测试”[-Wuninitialized]

#include<stdio.h>
#include<stdlib.h>

void check (int test )
{
   printf("%d",test);
}

int
main()
{
   int test;
   check(test);
   return 0;
}

但是使用 -Wall -Wuninitialized 编译下面的代码不会引发警告

#include<stdio.h>
#include<stdlib.h>

void check (int test )
{
   printf("%d",test);
}

int
main()
{
   int test;
   int condition = 0;

   if(condition == 27)
      test = 10;

   check(test);
   return 0;
}

它不应该抛出警告吗?是否与编译器优化有关?

【问题讨论】:

  • 标准没有要求编译器必须警告这种类型的未定义行为。
  • 测试 = 10;我想它会使用变量,即使有一个路径单元化。
  • 根据here,gcc 从版本 4.9 开始对此发出警告。你也许可以升级你的编译器版本。
  • @M.M 我有 4.9.3 和 5.3.0 没有警告,即使有所有这些标志。

标签: c gcc


【解决方案1】:

用户理解为误报的内容可能因特定情况而有所不同 用户。一些用户对由于以下原因而隐藏的案例感兴趣 优化器的动作与当前环境相结合。 但是,许多用户不是,因为该案例是隐藏的,因为它 不能出现在编译的代码中。典型的例子是(MM05):

int x;
if (f ())
x = 3;
return x;

其中 'f' 对于当前环境总是返回非零值,并且 因此,它可能会被优化掉。在这里,一群用户想 得到一个未初始化的警告,因为 'f' 在编译时可能返回零 别处。然而,其他用户组会认为虚假警告 关于正在编译的可执行文件中不会出现的情况。

https://gcc.gnu.org/wiki/Better_Uninitialized_Warnings#Proposal


编辑:MMO5 已经修复

https://gcc.gnu.org/wiki/Better_Uninitialized_Warnings#MM05

【讨论】:

    【解决方案2】:

    是的,gcc 不会警告您,因为代码已被优化掉。有些人认为这是正确的,因为它可能是编译时配置值的方式。其他人认为这是错误的,因为它隐藏了可能的错误。

    您不是第一个注意到 GCC 的这个问题的人。 There's a whole proposal about it.

    clang with -Wall 检测到问题,甚至提出修复建议。

    $ make
    cc -Wall -g    test.c   -o test
    test.c:15:7: warning: variable 'test' is used uninitialized whenever 'if' condition is false
          [-Wsometimes-uninitialized]
       if(condition == 27)
          ^~~~~~~~~~~~~~~
    test.c:18:10: note: uninitialized use occurs here
       check(test);
             ^~~~
    test.c:15:4: note: remove the 'if' if its condition is always true
       if(condition == 27)
       ^~~~~~~~~~~~~~~~~~~
    test.c:12:12: note: initialize the variable 'test' to silence this warning
       int test;
               ^
                = 0
    1 warning generated.
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多