首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用#杂注消除基于clang检查的clang警告

使用#杂注消除基于clang检查的clang警告
EN

Stack Overflow用户
提问于 2021-06-24 13:07:43
回答 3查看 1.1K关注 0票数 4

我希望删除/忽略代码块的clang警告,并找到了如何使用pragamas的多个示例。例如,如果警告为unused-variable,则可以通过以下方法禁用它:

代码语言:javascript
运行
复制
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"

int a;

#pragma clang diagnostic pop

但是问题是,在构建存储库时,我没有在输出中得到警告,我只知道发出警告的是哪个clang检查.在这种情况下,我找不到任何其他问题或文件。这就是我的输出:

代码语言:javascript
运行
复制
warning: Use of memory after it is freed [clang-analyzer-cplusplus.NewDelete]

我已经尝试了数百种不同的组合来忽略这一点,但是没有什么效果(使用// NOLINT不是一个可行的选择)。在我尝试过的事情中,有一些:

代码语言:javascript
运行
复制
#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

注意,“修复”代码也不是一个选项,因为它是第三方代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-01 09:17:48

正如注释中提到的,#pragma clang diagnostic方法只能用于抑制编译器警告。你提到的警告来自clang-静态分析器,它现在是clang的一部分。

通过代码禁用特定clang检查的唯一两个选项是//NOLINT//NOLINTNEXTLINE宏。

正如您提到的,所讨论的代码是第三方的,我将假设您对分析它一点也不感兴趣。由于您正在使用CMake,这很容易通过.clang-tidy文件完成。您可以在项目的根目录中放置一个.clang-tidy文件,并在那里列出/配置所需的检查,如下所示:

代码语言:javascript
运行
复制
Checks: '-*,cppcoreguidelines-*'

(这将允许对Cpp核心准则进行所有检查)。

然后,在放置第三方代码的目录中,您可以通过放置在该目录中的.clang-tidy文件禁用clang分析。由于.clang-tidy文件不能为空或不指定任何检查,因此可以通过“错误配置”这样的检查来做到这一点:

代码语言:javascript
运行
复制
Checks: '-*,misc-definitions-in-headers'
CheckOptions:
  - { key: HeaderFileExtensions,          value: "x" }

有关此方法的详细信息,请参阅这个答案

或者,您可以使用第三方目录中的.clang-tidy文件来禁用一些检查。

票数 3
EN

Stack Overflow用户

发布于 2021-06-24 13:16:33

根据,对于Clang,您必须使用:

代码语言:javascript
运行
复制
#ifndef __clang_analyzer__
// code
#endif
票数 2
EN

Stack Overflow用户

发布于 2021-06-24 13:48:00

在我看来,最好的方法就是有点依赖于您的构建系统。让我们假设您有如下示例代码:

主文件:

代码语言:javascript
运行
复制
int main()
{
    // ...
    int *a = new int;
    *a = 10;
    delete a;

    if (::rand() < 10) {
        std::cout  << *a; //<-- clang tidy warning here
    }
    //...
}

这将在上述行中创建clang整洁警告。现在你能做什么?将代码分成两个文件:

文件A:

代码语言:javascript
运行
复制
void foo() {
    int *a = new int;
    *a = 10;
    delete a;

    if (::rand() < 10) {
        std::cout  << *a; //<-- clang tidy warning here
    }
}

主文件:

代码语言:javascript
运行
复制
int main()
{
    // ...
    foo();
    //...
}

现在禁用cland-tidy以获取文件A。这是个样本,但我想你明白我的大致想法。您不能禁用clang-tidy,因为它位于另一个库中,而且您无法触摸该代码,原因有几点。//NOLINT也不适用于函数。因此,只需在单个文件中创建一个包装器,用于使用该库,并在该包装文件中禁用整个文件的clang-tidy

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68116417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档