以下文件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
似乎就不会发出警告,即使它是之前作业。
我的问题:
bar
,我也无法通过clang 3.0发出任何警告。)答案 0 :(得分:4)
我的知识中没有gcc
或clang
选项可以警告这个无用的作业。
PC-Lint
能够在这种情况下发出警告。
警告438分配给变量'符号'的最后一个值未使用 - 有一个值 已分配给随后未使用的变量。该 消息是在退货声明或结束时发出的 当变量超出范围时阻止。
答案 1 :(得分:-1)
编译器将检测到这是死代码并且无论如何都要优化它。如果您查看汇编列表(假设您告诉gcc进行优化),那么您将发现该分配不存在。