c++ - 使用 #pragma 删除基于 clang 检查的 clang 警告

标签 c++ clang clang++ clang-static-analyzer clang-tidy

我想删除/忽略代码块的叮当警告,并找到了如何为此使用 pragamas 的多个示例。例如,如果警告是 unused-variable您可以使用以下方法禁用它:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"

int a;

#pragma clang diagnostic pop
然而问题是我在构建存储库时没有在输出中收到警告,我只知道是哪个叮当检查发出警告......而且我找不到任何其他问题或文档,这是案件。这是我的输出:
warning: Use of memory after it is freed [clang-analyzer-cplusplus.NewDelete]
我已经尝试了数百种如何忽略这一点的不同组合,但没有任何效果(使用 // NOLINT 不是一个可行的选择)。在我尝试过的事情中,这里有一些:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Winline-new-delete"
#pragma clang diagnostic ignored "-Wmost"
#pragma clang diagnostic ignored "-Weverything"
#pragma clang diagnostic ignored "clang-analyzer-cplusplus.NewDelete"
#pragma clang diagnostic ignored "-Wclang-analyzer-cplusplus.NewDelete"
#pragma clang diagnostic ignored "-clang-analyzer-cplusplus.NewDelete"
#pragma clang diagnostic ignored "-W-NewDelete"
#pragma clang diagnostic ignored "-W-new-delete"

// code

#pragma clang diagnostic pop
请注意,“修复”代码也不是一种选择,因为它是第三方代码。

最佳答案

正如评论中提到的 #pragma clang diagnostic方法只能用来压制编译器警告。您提到的警告来自 clang-static-analyzer,它现在是 clang-tidy 的一部分。
通过代码禁用特定 clang-tidy 检查的唯一两个选项是 //NOLINT//NOLINTNEXTLINE宏。
正如您提到的,有问题的代码是第三方的,我假设您根本没有兴趣分析它。由于您使用的是 CMake,这很容易通过 .clang-tidy 完成。文件。您可以放置​​一个 .clang-tidy项目根目录中的文件,并在那里列出/配置所需的检查,如下所示:

Checks: '-*,cppcoreguidelines-*'
(这将启用所有 Cpp 核心指南检查)。
然后在放置第三方代码的目录中,您可以通过 .clang-tidy 禁用 clang-tidy 分析。文件放在那个目录下。如 .clang-tidy文件不能为空或不指定任何检查,您可以通过“错误配置”这样的检查来做到这一点:
Checks: '-*,misc-definitions-in-headers'
CheckOptions:
  - { key: HeaderFileExtensions,          value: "x" }
有关此方法的更多详细信息,请参阅 this answer .
或者,您可以使用 .clang-tidy第三方目录中的文件以仅禁用某些检查。

关于c++ - 使用 #pragma 删除基于 clang 检查的 clang 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68116417/

相关文章:

clang - (clang) 如何自己解析宏,尽可能获得 ast?

c++ - 系统 libc 文件的 Clang 工具链失败

c++ - UWP C# 应用程序调用用 C++ 编写的 Windows 运行时组件

c++ - 使用指向具有指针c++的对象的指针 vector

c++ - 我可以使用 LLVM 来加速构建并减少 GCC 编译时间吗?

performance - 为什么 32 字节的循环对齐会使代码更快?

gcc - 使用特定的 gcc 工具链从源代码构建 clang

c++ - 在带有转换运算符的初始化程序的情况下,复制列表初始化的假定行为是什么?

C++ SFINAE void_t 不工作

c++ - Linux 上的用户界面