更多警告 -Os

问题描述 投票:0回答:2

这个节目

int main()
{
    int a, b;
    a = b;
    return 0;
}

如果您使用

编译,则编译不会出现警告或错误

g++ -Wall test.cpp

但是,如果您在优化的情况下编译它,即使处于相同的警告级别

g++ -Wall -Os test.cpp

然后它会开始抱怨你正在使用未初始化的变量!
(注意:实际的程序稍微长一些,并且没有像这里的这个小例子那样清楚地暴露问题。)

我尝试使用谷歌进行搜索,但要么我没有使用正确的搜索词,要么这不是一个已知的现象。无论如何,我的问题基本上是

  • 为什么编译器会在使用 -Os 时给出此警告,而在使用 -O0 时不会给出此警告,即使在相同的警告级别下也是如此? (如果有的话,我希望这个小例子是相反的,因为变量可以完全优化掉,然后问题就会消失。)
  • 还有其他编译器选项会触发这样的意外警告吗?因为我有兴趣让我的程序没有错误,所以我喜欢看到所有这些!
  • 这是一个已知功能吗?如果有的话,我在哪里可以找到它?我确实尝试过搜索。
  • 或者这只是我的特定版本的编译器(gcc 4.3.2-1.1,Linux,32 位)中的一个故障?
c++ gcc warnings warning-level
2个回答
3
投票

编译器需要进行额外的检查才能执行一些优化,这会导致它发出额外的警告。 GCC简介的相关章节里有简单的解释。

顺便说一句,在我的平台(x86 上的 32 位 ubuntu 12.04)上,代码会使用 gcc 4.6.3、gcc 4.7.0 和 gcc 4.8 快照生成警告:

uninitialized.cpp:在函数“int main()”中: uninitialized.cpp:3:9:警告:变量“a”已设置但未使用 [-Wunused-but-set-variable] uninitialized.cpp:4:10:警告:在此函数中使用未初始化的“b”[-Wuninitialized]


1
投票

使用更高的优化级别编译器注意到您正在等同未初始化的变量。等等警告。

© www.soinside.com 2019 - 2024. All rights reserved.