7

我想找出 g++ (4.7) 中最极端的错误检查标志组合。我们没有使用新的 C++11 规范,因为我们需要使用旧编译器交叉编译代码,而这些旧编译器(主要是 g++ 4.0)经常会导致 g++4.7 忽略的问题。

现在我们使用以下一组标志:

-Wall -Wcomment -Wformat -Winit-self -ansi -pedantic-errors \
-Wno-long-long -Wmissing-include-dirs -Werror -Wextra

但是这种组合不能识别诸如将 double 传递给需要 int 的函数的问题,或者有符号和无符号 int 之间的比较,这会导致旧编译器阻塞它。

我已经阅读了文档并且-Wsign-compare应该启用,-Wextra但实际上似乎并非如此,所以我可能错过了一些东西......

4

2 回答 2

3

是没有 GNU 扩展的默认标准的-ansi别名。我建议改为显式使用-std=c++98,但它应该是默认的g++ -ansi,所以并没有真正的不同。

但一般来说,我从未见过任何会被新 gcc 接受并被旧 gcc 以无效为由拒绝的东西。我怀疑任何此类问题都是旧编译器或其标准库中的错误。Gcc 对正确的事情没有警告,但不适用于旧版本,因此除了使用旧版本进行测试之外,您别无选择。

至于你提到的具体问题:

  • 将 double 传递给期望 int 的函数不是错误。虽然它可能是未定义的行为。-Wconversion应该有帮助。
  • 将有符号与无符号进行比较也定义明确,也始终按定义工作,并且在相等比较的情况下实际上会使程序员编写更糟糕的代码(将大于 int 的无符号变量与 -1 进行比较,而不是将其与 -1u 进行比较)。所以我实际上总是用-Wno-sign-compare.

-isystem编译器不应该为在给定目录中找到的头文件而不是打印警告-I,因此应该让您对 Qt 头文件的警告静音并为您自己的代码启用它。所以你应该可以使用-Wconversion.

于 2013-01-29T09:20:47.080 回答
1

除了编译器之外,还可以使用lint其他一些静态分析工具来检查代码。在我的 Linux 发行版上,apt-get install splint会得到slint,也许检查一下它是否已经为你的操作系统打包以便于安装。

于 2013-01-29T12:16:27.433 回答