1

我有这个 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]

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

为什么在两个 MCVE 中都gcc 4.9.3 没有抱怨?

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

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

4

2 回答 2

2

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

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

在您的第二个示例中,编译器应为变量显示“未初始化”警告x。如果仅显示此警告,可能是编译器错误-O1

于 2016-02-08T12:25:58.927 回答
0

这是一个 5 1/2 岁的虫子。

请参阅 GCC Bugzilla – 错误 44677

于 2016-02-09T08:17:41.533 回答