gcc 不警告 "variable set but not used"

gcc does not warn "variable set but not used"

我有这个 MCVE,它编译时没有任何警告:

auto foo() -> void
{
    int unused = 0;
    unused++;
}

对我来说,我希望 error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]

这个 MCVE 编译也没有任何警告:

auto foo() -> void
{
    int x;
    int unused;
    for ( ; x < 100; x++ )  unused++;
}

这里我会预料到这两个错误:

  1. error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable].
  2. error: ‘unused’ and ‘x’ are used uninitialized [-Werror=uninitialized]

for 循环上方添加 bar( unused ); 会强制 gcc 显示有关使用未初始化变量的警告。

为什么 gcc 4.9.3 没有 在两个 MCVE 中的任何一个中抱怨?

编译命令:g++ -O3 -c -Wall -Wextra -Werror -std=c++11 foo.cpp

-O1 编译它 我收到关于 for 行的警告:error: ‘x’ may be used uninitialized in this function [-Wmaybe-uninitialized]。所有其他优化级别不会产生任何警告。

这些变量并非未被编译器使用。仅当您声明了一个局部变量(并最终对其进行了初始化)但从不在任何语句中使用该变量时才会触发此警告。

因此,在您的示例中,变量 unused 被声明、初始化(在第一个示例中)并在第二条语句中使用(此处用于读取和写入)。变量 x 也被声明和使用(但未初始化)。

在您的第二个示例中,编译器应该对变量 x 显示 "uninitialized" 警告。如果此警告仅针对 -O1 显示,则可能是编译器错误?

这是一个 5 1/2 年前的错误。

See GCC Bugzilla – Bug 44677