【发布时间】:2012-01-05 16:54:47
【问题描述】:
以下文件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 在函数中的某处使用,即使它是之前那作业。
我的问题:
- 有没有办法告诉 GCC 或 Clang 针对这种情况产生警告? (即使删除了对
bar的调用,我也无法让 clang 3.0 产生任何警告。) - 实际行为是否有原因?即,在某些情况下,实际上是否希望分配给将被优化器丢弃的局部变量?
【问题讨论】:
-
将函数参数设为
const,编译器会报错:void foo(int const a) { /* ... whatever ... */ } -
@pmg:更改源不是一种选择:我想在现有代码库中检测类似的无用分配。
标签: c gcc compiler-warnings clang