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 位)中的一个小故障?
4

2 回答 2

3

编译器需要进行额外的检查才能执行一些优化,这会导致它发出额外的警告。在An Introduction to 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]

于 2012-05-20T07:37:32.497 回答
1

对于更高的优化级别,编译器会注意到您将非初始化变量等同起来。所以警告。

于 2012-05-20T07:15:28.943 回答