我有这个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++;
}
我希望这两个错误:
error: variable ‘unused’ set but not used [-Werror=unused-but-set-variable]
。error: ‘unused’ and ‘x’ are used uninitialized [-Werror=uninitialized]
在bar( unused );
循环强制for
上方添加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]
行的警告。所有其他优化级别都不会产生任何警告。
答案 0 :(得分:2)
编译器不使用变量。只有在声明了局部变量(并最终初始化它)但从不在任何语句中使用此变量时,才会触发此警告。
因此,在您的示例中,变量unused
被声明,初始化(在第一个示例中)并在第二个语句中使用(此处用于读取和写入)。变量x
也被声明和使用(但未初始化)。
在第二个示例中,编译器应该为变量x
显示“未初始化”警告。如果仅针对-O1
显示此警告,则可能是编译器错误?
答案 1 :(得分:0)
这是一个5岁半的小虫。