我希望删除/忽略代码块的clang警告,并找到了如何使用pragamas的多个示例。例如,如果警告为unused-variable
,则可以通过以下方法禁用它:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
int a;
#pragma clang diagnostic pop
但是问题是,在构建存储库时,我没有在输出中得到警告,我只知道发出警告的是哪个clang检查.在这种情况下,我找不到任何其他问题或文件。这就是我的输出:
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
注意,“修复”代码也不是一个选项,因为它是第三方代码。
发布于 2021-07-01 09:17:48
正如注释中提到的,#pragma clang diagnostic
方法只能用于抑制编译器警告。你提到的警告来自clang-静态分析器,它现在是clang的一部分。
通过代码禁用特定clang检查的唯一两个选项是//NOLINT
和//NOLINTNEXTLINE
宏。
正如您提到的,所讨论的代码是第三方的,我将假设您对分析它一点也不感兴趣。由于您正在使用CMake,这很容易通过.clang-tidy
文件完成。您可以在项目的根目录中放置一个.clang-tidy
文件,并在那里列出/配置所需的检查,如下所示:
Checks: '-*,cppcoreguidelines-*'
(这将允许对Cpp核心准则进行所有检查)。
然后,在放置第三方代码的目录中,您可以通过放置在该目录中的.clang-tidy
文件禁用clang分析。由于.clang-tidy
文件不能为空或不指定任何检查,因此可以通过“错误配置”这样的检查来做到这一点:
Checks: '-*,misc-definitions-in-headers'
CheckOptions:
- { key: HeaderFileExtensions, value: "x" }
有关此方法的详细信息,请参阅这个答案。
或者,您可以使用第三方目录中的.clang-tidy
文件来禁用一些检查。
发布于 2021-06-24 13:16:33
根据这,对于Clang,您必须使用:
#ifndef __clang_analyzer__
// code
#endif
发布于 2021-06-24 13:48:00
在我看来,最好的方法就是有点依赖于您的构建系统。让我们假设您有如下示例代码:
主文件:
int main()
{
// ...
int *a = new int;
*a = 10;
delete a;
if (::rand() < 10) {
std::cout << *a; //<-- clang tidy warning here
}
//...
}
这将在上述行中创建clang整洁警告。现在你能做什么?将代码分成两个文件:
文件A:
void foo() {
int *a = new int;
*a = 10;
delete a;
if (::rand() < 10) {
std::cout << *a; //<-- clang tidy warning here
}
}
主文件:
int main()
{
// ...
foo();
//...
}
现在禁用cland-tidy
以获取文件A。这是个样本,但我想你明白我的大致想法。您不能禁用clang-tidy
,因为它位于另一个库中,而且您无法触摸该代码,原因有几点。//NOLINT
也不适用于函数。因此,只需在单个文件中创建一个包装器,用于使用该库,并在该包装文件中禁用整个文件的clang-tidy
。
https://stackoverflow.com/questions/68116417
复制相似问题