【问题标题】:More warnings with -Os-Os 的更多警告
【发布时间】:2012-05-27 03:23:37
【问题描述】:

这个程序

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

如果你编译它,编译时不会出现警告或错误

g++ -Wall test.cpp

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

g++ -Wall -Os test.cpp

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

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

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

【问题讨论】:

  • 确实在各种最新的 GCC 版本上使用您的第一个编译行收到警告,请参阅下面的答案。
  • 您是否在某处设置了将 O 级别默认为 2 或更高的设置?如果手动输入 -O0 会发生什么?否则,也许我的 gcc 版本已经过时了。但这是我的存储库附带的版本......我知道,我已经过期了一个新系统。
  • 我明确使用了-O0

标签: c++ gcc compiler-construction warnings warning-level


【解决方案1】:

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

【讨论】:

  • 谢谢。该页面至少确实说“它仅在程序经过优化编译时才有效,以便启用数据流分析。”所以我知道不只是我。但它没有解释为什么。为什么编译器不优化就不能做数据流分析?
  • @MrLister 我想这是一个优化。如果不需要,为什么还要花时间做某事?另一方面,人们会期望-Wall 涵盖这一点。不幸的是,我无法重现该问题,以找出发出警告所需的标志组合。
  • 我不同意“如果不需要”部分。它需要的!在上面的程序中,无论您是否使用优化进行编译,它都是一样糟糕的错误,产生同样糟糕的结果。
  • @MrLister 在这种情况下,我同意,但不幸的是,GCC 上什么应该是警告和什么是错误的定义相当反复无常。如果有的话,Wall 是用词不当。
  • 不能不同意这一点。你确实回答了我的大部分问题,而且似乎新版本的编译器可以按照我想要的方式工作,所以我真的不能要求更多。
【解决方案2】:

使用更高优化级别的编译器通知您将非初始化变量等同起来。所以警告。

【讨论】:

  • 你确定是这样吗?我的意思是,-Wall 确实包括 -Wuninitialized 和 -Wmaybe-uninitialized。也许我应该读读那些。
  • @mrlister :我同意你的看法!-Wall 开启 -Wmaybe-uninitialized 和 -wuninitialized。但我说的是等同于两个未初始化变量的警告。
  • 但显然,情况就是这样。请参阅 juanchopanza 的答案,其中解释了更多。但不是原因。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多