C++ gcc不发出警告;变量集但未使用";
我有一个MCVE,在没有任何警告的情况下编译:C++ gcc不发出警告;变量集但未使用";,c++,gcc,gcc-warning,unused-variables,C++,Gcc,Gcc Warning,Unused Variables,我有一个MCVE,在没有任何警告的情况下编译: auto foo() -> void { int unused = 0; unused++; } auto foo() -> void { int x; int unused; for ( ; x < 100; x++ ) unused++; } 对我来说,我希望错误:变量“未使用”设置但未使用[-Werror=未使用但设置变量] 此MCVE编译时也没有任何警告: auto foo()
auto foo() -> void
{
int unused = 0;
unused++;
}
auto foo() -> void
{
int x;
int unused;
for ( ; x < 100; x++ ) unused++;
}
对我来说,我希望错误:变量“未使用”设置但未使用[-Werror=未使用但设置变量]
此MCVE编译时也没有任何警告:
auto foo() -> void
{
int unused = 0;
unused++;
}
auto foo() -> void
{
int x;
int unused;
for ( ; x < 100; x++ ) unused++;
}
auto foo()->void
{
int x;
int未使用;
对于(;x<100;x++)未使用的++;
}
在这里,我预计会出现以下两个错误:
错误:变量“未使用”已设置但未使用[-Werror=未使用但已设置变量]
错误:“未使用”和“x”未初始化使用[-Werror=uninitialized]
条(未使用)循环的for
上方的code>强制gcc
显示有关使用未初始化变量的警告
为什么gcc 4.9.3
在两个MCVE中都没有抱怨
编译命令:g++-O3-c-Wall-Wextra-Werror-std=c++11 foo.cpp
用-O1
编译它时,我在for
的行中得到了以下警告:错误:“x”可能未初始化地用于此函数[-Wmaybe uninitialized]
。所有其他优化级别不会产生任何警告。编译器不会使用这些变量。只有在声明局部变量(并最终初始化)但在任何语句中都不使用该变量时,才会触发此警告
因此,在您的示例中,变量unused
被声明、初始化(在第一个示例中)并在第二个语句中使用(这里用于读写)。变量x
也被声明和使用(但未初始化)
在第二个示例中,编译器应该为变量x
显示“未初始化”警告。如果仅针对-O1
显示此警告,则可能是编译器错误。这是一个5年半的错误
因为它不必这样做?编译器不是静态代码分析器。死代码消除可能发生在编译器内置的基本代码分析器有机会看到未使用的变量之前。这将是一个向Gnu人员提交的“功能请求”。@Revolver\u Ocelot是的,当然,但在我看来,警告并不一致。在第二种情况下,高于O1
的优化水平可能会将整个身体视为UB,并简单地(就像他们的右侧一样)将其移除-这意味着没有需要警告的变量。其他地方对此进行了非常有趣的讨论。只要说一句,有了优化和UB,所有的赌注都没有了。我不确定在不彻底改变分析器工作方式的情况下有什么简单的方法可以解决这个问题,这在目前看来可能是不可行的。只是一个有根据的猜测:在更高的优化级别下,编译器可能会看到该语句没有任何效果,并且根本不会生成任何代码。因此,没有“未初始化”警告,因为未使用该变量。@凯恩此MCVE来自一个有320行的函数。对于函数中其他位置的其他变量,已显示警告。无论如何,我想知道为什么这3行代码会保留这种情况。对我来说,这看起来像是一个gcc4.9.3
“bug”。@Kane这是可能的,但在我看来,警告应该在优化阶段之前生成(警告应该帮助开发人员找到潜在的bug,而优化器不应该试图隐藏它们)。所以我认为这是一个编译器错误。@ul90刚刚检查了汇编代码(gcc 5.3.1):如果使用-02
或-03
编译,它将完全删除循环。因此,编译器在技术上是正确的:变量在未初始化的情况下使用。@Kane,但警告的显示并不一致。正如我前面提到的,对于其他变量,会显示警告。我认为这是一个错误。注意:它来自一个320行函数。。。