【问题标题】:How to get warnings about variables assigned to, but not used anymore?如何获得有关分配给但不再使用的变量的警告?
【发布时间】: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 在函数中的某处使用,即使它是之前那作业。

我的问题:

  1. 有没有办法告诉 GCC 或 Clang 针对这种情况产生警告? (即使删除了对 bar 的调用,我也无法让 clang 3.0 产生任何警告。)
  2. 实际行为是否有原因?即,在某些情况下,实际上是否希望分配给将被优化器丢弃的局部变量?

【问题讨论】:

  • 将函数参数设为const,编译器会报错:void foo(int const a) { /* ... whatever ... */ }
  • @pmg:更改源不是一种选择:我想在现有代码库中检测类似的无用分配。

标签: c gcc compiler-warnings clang


【解决方案1】:

据我所知,没有gccclang 选项可以警告这个无用的分配。

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

警告 438 分配给变量 'Symbol' 的最后一个值未使用 -- 一个值有 已分配给随后未使用的变量。这 消息在返回语句或结束时发出 当变量超出范围时阻塞。

【讨论】:

    【解决方案2】:

    编译器会检测到这是死代码并优化它。如果您查看程序集清单(前提是您告诉 gcc 进行优化),那么您会发现该分配不存在。

    【讨论】:

    • 如原始问题中所述,我已经告诉gcc 进行优化,并且我已经注意到它优化的分配。问题是为什么编译器不会让我知道我写了一些没用的东西,或者我如何配置它让我知道。
    • 你没有回答这个问题。他希望编译器在程序员没有注意到错误时检测到此类代码(因此不会深入研究列表文件)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2016-05-21
    • 2023-04-06
    • 2017-04-09
    • 2012-08-29
    • 2018-07-17
    相关资源
    最近更新 更多