【发布时间】:2013-01-29 08:56:03
【问题描述】:
我想找出 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 启用,但实际上似乎并非如此,所以我可能遗漏了一些东西...
【问题讨论】:
-
“这种组合不能识别诸如 double 被传递给需要 int 的函数之类的问题”——这不是错误,只是缩小转换 (
-Wconversion)。不幸的是,gcc 赋予“迂腐”一词(特别是关于标准一致性)的含义,这与您在问题中使用它的方式不同;-) 您是否想要一种联合世界上每个编译器作者的每个警告曾经发行过吗?通常的程序是通读 gcc 手册并选择你喜欢的。 -
那是
-Weverything(来自Clang)如此有趣的时候,它可能无法识别您需要的所有内容(如果未实现,则未检测到),但至少您没有追着旗帜跑…… -
最好是用不同的编译器版本编译,看看它们是否编译。这可以作为 CI 工作来完成
-
@fritzone:所以如果你使用 clang,那么你会从
-Weverything开始,发现来自 Qt 标头的一些警告是难以处理的,最后是-Weverything -Wno-conversion -Wno-something-else。在这种情况下,答案是否定的,gcc 没有让你这样工作的选项。 -
@fritzone:警告不需要同步。如果其中任何个警告,那么你注意警告直到它被解决。警告(标准要求的诊断除外)是编译器提出的可能需要注意的意见。通过使用多个编译器/配置,您正在征求更多意见。不同的编译器(甚至同一个编译器的不同版本)有不同的看法是很自然的。因此,如果您可以使用 clang 编译您的代码,那么您可以将其用作警告源。
标签: c++ g++ error-checking