【问题标题】:Better compiler warnings?更好的编译器警告?
【发布时间】:2014-11-15 16:59:11
【问题描述】:

是否可以向 g++ 添加额外的警告标志,以便它会警告我以下代码中未初始化的 b 变量?

#include <iostream>
using namespace std;
int main() {
  int a, b;
  cin >> a;
  while (a>0) b++;
  cout << a;
}

编辑:我忘了提到我已尝试打开另一个问题中列出的标志: Flags to enable thorough and verbose g++ warnings 但没有触发。 (“发痒!”正如我在下面了解到的那样。)

【问题讨论】:

  • 你试过g++ -Wall -Wextra吗?
  • 我的测试显示没有来自 GCC 的警告,其中包含大量警告组(-Wall、-Wextra、-pedantic),并且 Clang 发出警告。
  • 您可以添加编译标志,即。 -墙。 stackoverflow.com/questions/11714827/…
  • 什么优化级别?
  • 谷歌:GCC 警告

标签: c++ g++ compiler-warnings


【解决方案1】:

您选择的选项可能是-Wmaybe-uninitialized-Wuninitialized。这两个都是 -Wall 选项的一部分,该选项打开这些和许多其他警告(-Wxxx 选项与警告有关)。

gcc 警告选项的完整文档可在以下位置阅读:gcc 文档中的Options to Request or Suppress Warnings

您可能还会发现-Wextra 可能对您有用(单独使用或与-Wall 结合使用)。 -Wextra 也启用了-Wuninitialized,但它还有其他项目并不总是由-Wall 设置,并且是我喜欢看到的项目(比如-Wunused-parameter-Wunused-but-set-parameter)......虽然那不是特定于这段代码。


这就是说...(是的,有一个“那个说”)...我似乎无法使用http://gcc.godbolt.org 上提供的 gcc 解决此功能的错误。

使用-Wmaybe-uninitialized 的文档中专门描述的一些代码来扩展您的代码

#include <iostream>
using namespace std;
int main() {
  int a, b;
  int x, y, z;
  // warning: variable ‘y’ set but not used [-Wunused-but-set-variable]
  cin >> a;
  while (a>0) b++;
  switch(a) {
    case 1: x = 1; y = 1; z++; break;
    // warning: ‘z’ may be used uninitialized in this function [-Wmaybe-uninitialized]
    case 2: x = 4; y = 2; break;
    case 3: x = 5; y = 3;
  }
  cout << a;
  cout << b;
  cout << x;
}

这是对一些未使用和统一的警告的尝试。我能够得到z 变量来产生错误,但由于某种原因b++ 在那个while 循环中不会使用gcc 生成错误或警告(使用gcc 4.9.0 测试)。

不过,clang 3.4.1 版确实会使用这些命令行选项为bz 生成警告

虽然-Wall-Wextra 应该产生您所追求的警告,但由于某种原因,它们不会为 gcc 4.9.0 中的这段特定代码产生所需的警告 p>

【讨论】:

  • @chris #clang++ -std=c++1y ... 它不是 gcc。
  • # 是一条评论。看下面两行。保留一些我经常使用的东西并在它们之间切换而无需再次形成它们很容易。
  • 嗯……确实如此。 gcc.godbolt.org(另一个不错的在线编译器)可以显示其他各种错误,但是这个正在溜走。
  • @chris 所以,你确实是对的。我仍然坚持我的回答,对于一般情况,这些选项应该产生所需的警告,而某些其他代码位确实会产生错误。 daveagp 提供的这个特定的 SSCCE 似乎并没有用 gcc 来处理这些警告(尽管我可以让 other 位本质上相似的代码做到这一点)。我会很高兴发现什么不正常(这是我对标准的误解吗?gcc 中的错误?)。
  • 哦,当然。我也很惊讶没有发现任何警告。
【解决方案2】:

是的!!!您必须使用 -Wuninitialized。

https://gcc.gnu.org/wiki/Better_Uninitialized_Warnings

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多