当前位置: 首页 > 知识库问答 >
问题:

clang-tidy:如何抑制警告?

满增
2023-03-14

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

-标题-过滤器=

但迄今为止没有成功。因此,对于时间有限的人,我将在开始时把问题放在这里,稍后解释我已经尝试了什么。

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

如果这是不可能的

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

我最初的叮当声看起来像这样

clang-tidy-3.8 -checks=-*,clang-analyzer-*,-clang-analyzer-alpha* -p Generated/LinuxMakeClangNoPCH Sources/CodeAssistant/ModuleListsFileManipulator_fixtures.cpp

我想压制的第一行警告是这样的

.../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过滤器=

  -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文件

[
  {"name":"gmock-spec-builders.h","lines":[[1272,1272]]}
]

并将命令行修改为

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=

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

-header-filter=.*\/CodeAssistant\/.*.h

它匹配CodeAssistant文件夹中的所有绝对头文件名,但它没有抑制来自gmod-spe-builders. h文件的警告。

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

谢谢你抽出时间。


共有3个答案

曹沛
2023-03-14

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

这是使叮当声整洁忽略外部代码中的所有错误所需的唯一条件。所有其他答案(在撰写本文时)对于使用-isystem完美解决的问题来说都只是糟糕的解决方法

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

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

薛高澹
2023-03-14
匿名用户

我找到了另一种非侵入性(无需将 // NOLINT 添加到第三方库)方法来抑制警告。例如,当前版本的 Google 测试未通过某些命令行核心准则-* 检查。以下代码允许您验证当前差异,排除包含 gtest 宏的行:

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

它假定filebuild/compile_commands。json在clang-tidy-diff之前生成。py可从您的环境中获得 retaildiff和interdiff是操作补丁的标准工具。

脚本的工作原理如下:

  1. git diff-U3生成一个包含3行上下文的补丁
  2. sed…从不需要的行中删除前缀,即将它们转换为上下文
  3. retaildiff更正区块标头中的偏移量(在第一个范围内)
  4. interdiff-U0/dev/null/dev/stdin只是从补丁中删除所有上下文行。因此,它分割了最初的大块
  5. clang-tidy-diff(叮当声)。py只读取来自块头的第二个范围,并通过-line-filteroption将它们传递给clang-tidy

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

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

特别是,我发现git diff-U0|…|interdiff在拆分块后生成一些虚假的文字$! otj

隆谦
2023-03-14

我通过将 // NOLINT 添加到 gmock 规范构建器的第 1790 行中解决了这个问题。

区别在于:

--- 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)或与clang-tidy的人一起发布错误报告。

 类似资料:
  • 我有一个.h文件,该文件包含在C和C源文件中。其内容被包装在 然而,当我将它包含在. cpp文件中时,clang-tidy会发出特定于C的消息,比如 < li >警告:在C #中包含“stdbool.h”没有任何效果;请考虑删除它[hicpp-deprecated-headers,genesize-deprecated-headers] < li >警告:包含不推荐使用的C头文件“stdlib .

  • 问题内容: 每次我都会收到警告: 抑制它的最佳方法是什么?所有软件包都是最新的。 Conf: OSX带有Brew Python 2.7.10(默认,2015年7月13日,12:05:58),pandas == 0.17.0和matplotlib == 1.5.0 问题答案: 您可以禁止所有警告:

  • 问题内容: 我的pip版本已关闭-每个pip命令都说: 而且我不喜欢这里给出的答案:如何摆脱从pip升级的警告?因为他们都希望与RH版本不同步。 因此,我尝试使用此VagrantFile安装干净的系统: 但是后来我得到了: 因此,似乎我使用了错误的命令进行安装。使用正确的命令是什么? 问题答案: 创建一个pip配置文件并设置为true 在许多linux上,pip配置文件的默认位置是。Windows

  • 问题内容: 当我运行程序时,Pandas每次都会发出如下“未来警告”。 我得到了味精,但我只是想一次又一次地停止Pandas显示此类味精,是否可以设置任何buildin参数以使Pandas不会弹出“未来警告”? 问题答案: 在github上发现了这个…

  • IDEA不断弹出一个消息“渲染问题缺少样式。为这个布局选择了正确的主题吗?...” 是的,一切都正确,IDEA只是没有从AppCompat库中看到一些符号。 是否可以抑制这些警告?因为它非常烦人。(我希望IDEA“闭嘴”并尽其所能渲染一切,忽略可能的错误。)

  • 在我的应用程序中,我有一个由第三方开发的库,不幸的是,它包含相当多的lint和javac警告。我想忽略这两种类型的警告,因为它们无法由我们的团队修复,并且它们会污染我们的构建日志。我尝试将以下内容添加到库build.gradle文件中: 在Android块中 我还在build.gradle文件末尾添加了以下内容: 不幸的是,每当“:compileDebugJavaWithJavac”运行时,它仍然