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

adl*_*adl 9 c gcc clang compiler-warnings

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

int b;

void bar(int a);

void foo(int a)
{
  bar(a);
  a = 42;
}
Run Code Online (Sandbox Code Playgroud)

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

% gcc-4.6 -Wall -Wextra -pedantic -O3 -c foo.c
Run Code Online (Sandbox Code Playgroud)

我完全没有警告.检查生成的代码表明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. 实际行为有原因吗?即,有些情况下,实际上是否需要分配将被优化器丢弃的局部变量?

oua*_*uah 5

据我所知,没有gcc任何clang选项可以警告这个无用的作业。

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

警告 438 未使用分配给变量“符号”的最后一个值-- 已将值分配给随后未使用的变量。当变量超出范围时,该消息会在 return 语句处或块末尾发出。