【问题标题】:Being extremely pedantic with the way your code is compiled对代码的编译方式极其迂腐
【发布时间】: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


【解决方案1】:

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

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

至于你提到的具体问题:

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

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

【讨论】:

  • 有很多旧编译器不接受而新编译器接受的东西,例如冲突的专用模板之间的歧义解决......我们也有很多这样的:)
  • @fritzone:是的。但它们是旧编译器中的错误。并且编译器通常不会为正确的事情提供警告,但在该编译器的旧版本中不起作用,因此对于这种情况,您必须使用旧版本进行测试。
  • @fritzone:或者至少 gcc 不提供此类警告。我在 MSVC 中至少看到过一个这样的警告。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-04-30
    • 2020-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    相关资源
    最近更新 更多