c++ - 更好的编译器警告?

标签 c++ g++ compiler-warnings

是否可以向 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但没有触发。 (“痒痒的!”正如我在下面了解到的。)

最佳答案

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

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

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


那说...(是的,有一个“说”)...我似乎无法用 gcc 的这个功能来解决错误,它在 http://gcc.godbolt.org 上可用。 .

使用 -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).

Warnings with gcc 4.9.0

但是,

clang 版本 3.4.1 会针对 bz

使用这些命令行选项产生警告

Warnings with clang 3.4.1

虽然 -Wall-Wextra 应该 产生您想要的警告,但出于某种原因它们不会产生所需的警告gcc 4.9.0 中的这段特定代码

关于c++ - 更好的编译器警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25962028/

相关文章:

c++ - 在 gcc 和 g++ include 和 lib 路径中指定顺序

c++ - 在C++编译器中编译C程序

我可以为自定义日志记录功能启用格式警告吗?

java - 参数 'foo' 不应该被赋值——有什么害处?

c - 无法编译链表程序

Java加载一个DLL,该DLL从JNI中的另一个DLL导出方法

c++ - 模板模板函数定义

c++ - 我以前在 c++ 中从未遇到过的奇怪错误,有人知道这是什么意思吗?

c++ - 如何将int转换为字符串

c++ - 使作用域枚举与基础类型相当