C++ 使用-Os的更多警告
这个节目C++ 使用-Os的更多警告,c++,gcc,compiler-construction,warnings,warning-level,C++,Gcc,Compiler Construction,Warnings,Warning Level,这个节目 int main() { int a, b; a = b; return 0; } 如果使用编译,则编译时不会出现警告或错误 g++-Wall test.cpp 但是,如果您在编译时启用了优化,即使在相同的警告级别上也是如此 g++-Wall-Os-test.cpp 然后它会开始抱怨您使用了未初始化的变量 (注意:实际的程序稍微长一点,并且没有像这里这个小例子那样清楚地暴露问题。) 我曾尝试用谷歌搜索,但要么我没有使用正确的搜索词,要么这不是一个已知的现象。总
int main()
{
int a, b;
a = b;
return 0;
}
如果使用编译,则编译时不会出现警告或错误
g++-Wall test.cpp
但是,如果您在编译时启用了优化,即使在相同的警告级别上也是如此
g++-Wall-Os-test.cpp
然后它会开始抱怨您使用了未初始化的变量(注意:实际的程序稍微长一点,并且没有像这里这个小例子那样清楚地暴露问题。) 我曾尝试用谷歌搜索,但要么我没有使用正确的搜索词,要么这不是一个已知的现象。总之,我的问题基本上是
- 为什么编译器会使用-Os发出此警告,而不使用-O0发出此警告,即使警告级别相同?(如果有什么不同的话,我希望这个小例子正好相反,因为变量可以完全优化掉,然后问题就会消失。)
- 是否有其他编译器选项会触发像这样的意外警告?因为我对使我的程序无bug感兴趣,所以我喜欢看所有的程序李>
- 这是已知的特征吗?如果是,我在哪里可以找到它?我确实试过搜索
- 或者这只是我特定版本的编译器(GCC4.3.2-1.1,Linux,32位)中的一个小故障
编译器需要进行额外的检查才能执行一些优化,这会导致它发出额外的警告。本章相关章节对此作了简要说明 顺便说一句,在我的平台(x86上的32位ubuntu 12.04)上,代码使用gcc 4.6.3、gcc 4.7.0和gcc 4.8快照生成警告: uninitialized.cpp:在函数“int main()”中: 未初始化。cpp:3:9:警告:变量“a”已设置但未使用[-Wunused但已设置变量] 未初始化。cpp:4:10:警告:“b”在此函数中未初始化使用[-Wuninitialized]
你确定就这样吗?我的意思是,-Wall确实包括-Wuninitialized和-Wmaybe uninitialized。也许我应该读一下。@lister先生:我同意你的看法-墙上的开关打开-Wmaybe未初始化和-WUNINInitialized。但我说的是两个未初始化变量相等时的警告。但显然,这就是发生的情况。参见juanchopanza的答案,这解释了更多。但不是为什么,你确定是这样吗?我的意思是,-Wall确实包括-Wuninitialized和-Wmaybe uninitialized。也许我应该读一下。@lister先生:我同意你的看法-墙上的开关打开-Wmaybe未初始化和-WUNINInitialized。但我说的是两个未初始化变量相等时的警告。但显然,这就是发生的情况。参见juanchopanza的答案,这解释了更多。但不是原因。我确实在各种最新的GCC版本中使用您的第一个编译行收到警告,请参见下面的答案。您是否有将O级别默认为2或更高的设置?如果手动输入-O0会发生什么情况?否则,可能我的gcc版本已经过时了。但这是我的存储库附带的版本。。。我知道,我早该换一个新系统了。我明确使用了
-O0
。我确实在各种最新的GCC版本上使用您的第一行编译得到了警告,请参阅下面的答案。您是否有将O级别默认为2或更高的设置?如果手动输入-O0会发生什么情况?否则,可能我的gcc版本已经过时了。但这是我的存储库附带的版本。。。我知道,我早该买新系统了。我明确使用了-O0
。谢谢。这一页至少说了“它只在程序经过优化编译时才起作用,所以数据流分析是启用的。”所以我知道这不仅仅是我自己。但这并不能解释为什么。为什么编译器不能在没有优化的情况下进行数据流分析?@MrLister我想这是一个优化。如果不需要,为什么要花时间去做?另一方面,人们希望-Wall
能够涵盖这一点。不幸的是,我无法重现这个问题,以便找出启动警告所需的标志组合。我不同意“如果不需要”部分。这是需要的!在上面的程序中,无论您是否使用优化进行编译,这都是一个同样糟糕的错误,结果同样糟糕。@MrLister在这种情况下,我同意,但不幸的是,GCC上的警告和错误的定义相当反复无常。如果有墙的话,Wall
是一个用词不当的词。我不能不同意这一点。你确实回答了我的大部分问题,而且新版本的编译器似乎能按我所希望的方式工作,所以我不能要求更多。谢谢。这一页至少说了“它只在程序经过优化编译时才起作用,所以数据流分析是启用的。”所以我知道这不仅仅是我自己。但这并不能解释为什么。为什么编译器不能在没有优化的情况下进行数据流分析?@MrLister我想这是一个优化。如果不需要,为什么要花时间去做?另一方面,人们希望-Wall
能够涵盖这一点。不幸的是,我无法重现这个问题,以找出警告生效所需的标志组合