【问题标题】:#pragma(* diagnostic) when mixing Clang analyzers with a GCC compiler#pragma(* diagnostic) 将 Clang 分析器与 GCC 编译器混合使用
【发布时间】:2019-02-28 07:35:26
【问题描述】:

我在 Linux 上使用 GCC 进行编译,但 CMake 足以生成与 Clang 兼容的编译数据库。这意味着我可以在我的代码库上运行基于 Clang 的花哨的现代工具,并且这些工具完全了解每个文件的构建方式(标志、定义、包含路径等)。到目前为止一切都很好。

但是今天我的 IDE 中基于 Clang 的静态分析开始显示 Clang 特定警告。我不认为这对我的问题特别重要,它是哪个警告,但它是warning: disabled expansion of recursive macro,由-Wdisabled-macro-expansion 生成。此特定宏由第三方提供,因此无法修复警告,但我想禁止它,因为它在相关文件中多次出现。

我正在努力解决的是如何在基于 Clang 的分析工具中抑制警告,而不会在 GCC 构建中引起新的警告。

  • 添加 #pragma clang diagnostic ignored "-Wdisabled-macro-expansion" 会抑制 Clang 工具的警告,但会导致 GCC 发出 warning: ignoring #pragma clang diagnostic [-Wunknown-pragmas]
  • 同样,添加 #pragma GCC diagnostic ignored "-Wdisabled-macro-expansion" 会抑制 Clang 警告(因为 Clang 尝试与 GCC 诊断兼容),但会导致 GCC 发出 warning: unknown option after ‘#pragma GCC diagnostic’ kind [-Wpragmas]
  • #ifdef __clang__ 包装上述任何一个都可以使GCC 满意,但不会抑制Clang 警告,因为该工具足够聪明,可以知道代码不是用__clang__ 编译的,而是用__GNUC__ 编译的.

有没有办法让诊断#pragma 对 Clang 工具可见,但对 GCC 不可见?

【问题讨论】:

    标签: c++ gcc clang compiler-warnings suppress-warnings


    【解决方案1】:

    工具足够聪明,可以知道代码不是用__clang__ 编译的,而是用__GNUC__ 编译的

    如果它报告了一个仅限 clang 的警告,但 没有 认为 __clang__ 已定义,这听起来像是工具的问题。如果它试图在歪曲自己方面变得那么聪明,那么您可能会陷入困境……但您也应该首先向工具作者抱怨造成这种情况。

    也就是说,你可以试试:

    #if defined(__has_warning)
    #  if __has_warning("-Wdisabled-macro-expansion")
    #    pragma GCC diagnostic ignored "-Wdisabled-macro-expansion"
    #  endif
    #endif
    

    我不确定这是否可行...这取决于工具假装不是 clang 的难度(__has_warning 是一个仅适用于 clang 的扩展)。

    【讨论】:

    • 有趣的是,仅#if defined(__has_warning) 就足以满足我的目的,因为它仅在 Clang 工具或 Clang 本身下通过。当然,如果我依赖它,如果 GCC 或 MSVC 决定实现 __has_warning,它会彻底崩溃。
    • 预处理器有逻辑短路,所以可以将内层#if和外层#if defined(__has_warning) && __has_warning("-Wdisabled-macro-expansion")合并成#if defined(__has_warning) && __has_warning("-Wdisabled-macro-expansion")
    • @Ruslan,Matthew 最初将其发布为单个 #if,但我将其编辑为两个,因为 g++ 8.2.1 拒绝单行版本,error: missing binary operator before token "(" 指向 (__hasWarning之后。
    猜你喜欢
    • 2020-11-15
    • 2011-02-02
    • 2020-01-17
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多