如何获取有关分配给但不再使用的变量的警告?

时间:2012-01-05 16:54:47

标签: c gcc compiler-warnings clang

以下文件foo.c是我在代码中找到的更微妙错误的简化版本。

int b;

void bar(int a);

void foo(int a)
{
  bar(a);
  a = 42;
}

a = 42实际上是我的代码中的拼写错误:我的意思是b = 42。我不希望编译器检测到我输错了,但是我希望得到一个警告,我将分配给不再使用的局部变量(或函数参数)。如果我用

编译这个文件
% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c

我绝对没有警告。检查生成的代码表明未执行赋值a = 42,因此gcc非常清楚此指令是无用的(因此可能是假的)。评论对bar(a);的调用确实会产生警告warning: parameter ‘a’ set but not used [-Wunused-but-set-parameter],因此只要gcc在函数的某处使用a似乎就不会发出警告,即使它是之前作业。

我的问题:

  1. 有没有办法告诉GCC或Clang对此类案件发出警告? (即使删除了bar,我也无法通过clang 3.0发出任何警告。)
  2. 有实际行为的原因吗?即,有些情况下,实际上是否需要分配将被优化器抛弃的局部变量?

2 个答案:

答案 0 :(得分:4)

我的知识中没有gccclang选项可以警告这个无用的作业。

另一方面,

PC-Lint能够在这种情况下发出警告。

  

警告438分配给变量'符号'的最后一个值未使用 - 有一个值   已分配给随后未使用的变量。该   消息是在退货声明或结束时发出的   当变量超出范围时阻止。

答案 1 :(得分:-1)

编译器将检测到这是死代码并且无论如何都要优化它。如果您查看汇编列表(假设您告诉gcc进行优化),那么您将发现该分配不存在。