编写代码的方式非常迂腐

时间:2013-01-29 08:56:03

标签: c++ g++ error-checking

我想找出哪个是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的函数或者signed和unsigned int之间的比较之类的问题,这会导致旧编译器阻塞它。

我已阅读文档,而-Wsign-compare应由-Wextra启用,但在实践中似乎并非如此,所以我可能错过了一些内容......

2 个答案:

答案 0 :(得分:3)

-ansi是没有GNU扩展的默认标准的别名。我建议改为明确使用-std=c++98,但它应该是g++ -ansi的默认值,所以没有什么不同。

但一般来说,我从来没有见过任何被新gcc接受的东西,并且因为无效而被旧gcc拒绝。我怀疑任何这样的问题都是旧编译器或它的标准库中的错误。 Gcc没有针对正确的事情发出警告,但是不能使用旧版本的警告,因此您没有任何其他选择,只能使用旧版本进行测试。

至于你提到的具体问题:

  • 将double传递给期望int的函数不是错误。但它可能是未定义的行为。 -Wconversion应该有所帮助。
  • 使用unsigned进行比较也很明确,也总是按照定义进行工作,如果相等,比较实际上会使程序员编写更糟糕的代码(比较大于int的无符号变量和-1是除了将它与-1u比较。所以我实际上总是用-Wno-sign-compare编译。

编译器不应该打印在-isystem而不是-I给出的目录中找到的标题的警告,这样可以让您静音Qt标题的警告并为您自己的代码启用它。所以你应该可以使用-Wconversion

答案 1 :(得分:1)

除了编译器之外,还可以使用lintsome other static analysis tool来检查代码。在我的Linux发行版中,apt-get install splint将获得splint,也许会检查是否已为您的操作系统打包,以便于安装。