首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >整洁:如何压制警告?

整洁:如何压制警告?
EN

Stack Overflow用户
提问于 2016-09-16 08:41:46
回答 4查看 22.3K关注 0票数 19

我最近开始尝试使用clang-tidy工具llvm。现在,我试图阻止来自第三方库代码的错误警告。为此,我想使用命令行选项

-header-filter=<string>-line-filter=<string>

但到目前为止没有成功。因此,对于时间有限的人,我将在这里提出这个问题,并在稍后解释我已经尝试了什么。

问题

clang-tidy ,我需要给工具什么选项来抑制来自特定行和文件的警告?

如果这不可能

什么选项可以抑制来自外部头文件的警告?

我至今所做的一切

我最初对clang的调用是这样的。

代码语言:javascript
运行
复制
clang-tidy-3.8 -checks=-*,clang-analyzer-*,-clang-analyzer-alpha* -p Generated/LinuxMakeClangNoPCH Sources/CodeAssistant/ModuleListsFileManipulator_fixtures.cpp

生成的警告的第一行如下所示:

代码语言:javascript
运行
复制
.../gmock/gmock-spec-builders.h:1272:5: warning: Use of memory after it is freed [clang-analyzer-cplusplus.NewDelete]
    return function_mocker_->AddNewExpectation(

gmock人告诉我这是个假阳性所以我想抑制它。首先,我尝试使用-line-filter=<string>选项。文件上说:

代码语言:javascript
运行
复制
  -line-filter=<string>      - List of files with line ranges to filter the
                               warnings. Can be used together with
                               -header-filter. The format of the list is a JSON
                               array of objects:
                                 [
                                   {"name":"file1.cpp","lines":[[1,3],[5,7]]},
                                   {"name":"file2.h"}
                                 ]

我假设给定行中的警告会被过滤掉。但是医生没有说他们是被过滤掉的还是进去的。在做了一些修改之后,我创建了一个包含以下内容的.json文件

代码语言:javascript
运行
复制
[
  {"name":"gmock-spec-builders.h","lines":[[1272,1272]]}
]

并将命令行修改为

代码语言:javascript
运行
复制
clang-tidy-3.8 -checks=-*,clang-analyzer-*,-clang-analyzer-alpha* -p Generated/LinuxMakeClangNoPCH -line-filter="$(< Sources/CodeAssistant/CodeAssistant_ClangTidySuppressions.json)" Sources/CodeAssistant/ModuleListsFileManipulator_fixtures.cpp

它将文件的内容写入参数。这将取消警告,但不仅仅是此警告,而是ModuleListsFileManipulator_fixtures.cpp文件中的所有警告。我尝试了更多的东西,但我无法使它工作。

所以我尝试了-header-filter=<string>选项。在这里,文档声明必须给出一个正则表达式,该表达式与显示诊断信息的所有头文件匹配。好的,我想,让我们使用一个regualar表达式来匹配与分析的.cpp文件在同一个文件夹中的所有内容。我可以接受这一点,尽管它可能会删除由于我使用外部标头错误而产生的警告。

在这里,我不确定正则表达式是否必须与完整(绝对)文件名匹配,还是只匹配文件名的一部分。我试过了

代码语言:javascript
运行
复制
-header-filter=.*\/CodeAssistant\/.*.h

它与CodeAssistant文件夹中的所有绝对头文件名匹配,但它没有禁止gmok-spec-builders.h文件中的警告。

因此,最好是逐个抑制每个警告,这样我就可以确定每个警告是否是真正的问题,但如果这是不可能的,我也可以忍受抑制来自整个外部标头的警告。

谢谢您抽时间见我。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-09-17 07:51:13

我通过将// NOLINT添加到gmock builders.h的第1790行解决了这个问题。

这是区别:

代码语言:javascript
运行
复制
--- gmock-spec-builders.orig.h  2016-09-17 09:46:48.527313088 +0200
+++ gmock-spec-builders.h       2016-09-17 09:46:58.958353697 +0200
@@ -1787,7 +1787,7 @@
 #define ON_CALL(obj, call) GMOCK_ON_CALL_IMPL_(obj, call)

 #define GMOCK_EXPECT_CALL_IMPL_(obj, call) \
-    ((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call)
+    ((obj).gmock_##call).InternalExpectedAt(__FILE__, __LINE__, #obj, #call) // NOLINT
 #define EXPECT_CALL(obj, call) GMOCK_EXPECT_CALL_IMPL_(obj, call)

 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_

最好是在这个补丁的上游(我在代码中看到了其他的NOLINT ),或者和那些整洁的人一起发布一个bug报告。

票数 5
EN

Stack Overflow用户

发布于 2019-02-27 10:12:27

我找到了另一种非侵入性(不向第三方库添加// NOLINT )的方法来抑制警告。例如,当前版本的Google无法通过一些cppcoreguidelines-*检查。以下代码允许您验证当前的差异(不包括包含gtest宏的行):

代码语言:javascript
运行
复制
git diff -U3 | sed '
    s/^+\( *TEST(\)/ \1/;
    s/^+\( *EXPECT_[A-Z]*(\)/ \1/;
    s/^+\( *ASSERT_[A-Z]*(\)/ \1/;
' | recountdiff | interdiff -U0 /dev/null /dev/stdin | clang-tidy-diff.py -p1 -path build

它假设文件build/compile_commands.json是在生成之前生成的,并且clang-tidy-diff.py可以从您的环境中获得。recountdiff和来自片状interdiff是操纵补丁的标准工具。

该脚本的工作方式如下:

  1. git diff -U3生成一个带有3条上下文行的修补程序。
  2. sed ...从不需要的行中删除前缀+,即将它们转换为上下文。
  3. recountdiff纠正块头中的偏移量(在第一个范围内)。
  4. interdiff -U0 /dev/null /dev/stdin只是删除修补程序中的所有上下文行。因此,它分裂了最初的大块头。
  5. clang-tidy-diff.py只读取从块头到clang-tidy的第二个范围,并通过-line-filter选项将它们传递给clang-tidy

UPD: --为interdiff提供足够数量的上下文行很重要,否则它可能会在结果中产生一些工件。参见man interdiff的引文

为了获得最好的结果,差异必须至少有三行上下文。

特别是,我发现git diff -U0 | ... | interdiff在分割块之后生成了一些伪文本$!otj

票数 5
EN

Stack Overflow用户

发布于 2020-11-28 19:12:20

使用-isystem而不是-I来设置系统和第三方包含路径。-I只应用于包含正在构建的项目的一部分的代码。

这是使clang-tidy忽略外部代码中所有错误所需的唯一条件。所有其他的答案(在写作的时候)都是一些用-isystem完美解决的糟糕的解决方法。

如果您使用像CMake或Meson这样的构建系统,它将自动为您设置-I-isystem

-isystem也是一种机制,用于告诉编译器,至少GCC和Clang,什么不是您的代码。如果您开始使用-isystem,您还可以启用更多编译器警告,而无需从外部代码中获得“误报”。

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

https://stackoverflow.com/questions/39527160

复制
相关文章

相似问题

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