Kni*_*chi 12 suppress-warnings clang-static-analyzer clang-tidy
我最近开始尝试clang-tidyllvm 的工具.现在我试图压制来自第三方库代码的错误警告.为此,我想使用命令行选项
-header-filter=<string> 要么 -line-filter=<string>
但到目前为止没有成功.所以对于时间有限的人,我会在开头提出这个问题,然后再解释我已经尝试过的问题.
我需要为clang-tidy工具提供什么选项来抑制来自某个行和文件的警告?
如果这是不可能的
什么选项可以抑制外部头文件的警告?
我对clang-tidy的原始调用看起来像这样
clang-tidy-3.8 -checks=-*,clang-analyzer-*,-clang-analyzer-alpha* -p Generated/LinuxMakeClangNoPCH Sources/CodeAssistant/ModuleListsFileManipulator_fixtures.cpp
Run Code Online (Sandbox Code Playgroud)
我要压制的产生警告的第一行看起来像这样
.../gmock/gmock-spec-builders.h:1272:5: warning: Use of memory after it is freed [clang-analyzer-cplusplus.NewDelete]
return function_mocker_->AddNewExpectation(
Run Code Online (Sandbox Code Playgroud)
gmock人告诉我,这是一个误报,所以我想压制它.首先,我尝试使用该-line-filter=<string>选项.文件说:
-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"}
]
Run Code Online (Sandbox Code Playgroud)
我假设过滤掉了给定行中的警告.但doc doesent表示如果它们被过滤掉或者已经过滤了.在一些fiddeling arround之后我创建了一个包含内容的.json文件
[
{"name":"gmock-spec-builders.h","lines":[[1272,1272]]}
]
Run Code Online (Sandbox Code Playgroud)
并将命令行修改为
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
Run Code Online (Sandbox Code Playgroud)
它将文件的内容写入参数.这会抑制警告,但不仅是此警告,而是来自ModuleListsFileManipulator_fixtures.cpp文件的所有警告.我尝试了更多的东西,但我无法使它工作.
所以我尝试了这个-header-filter=<string>选项.这里的文档指出,必须提供一个正则表达式,该表达式匹配应显示诊断的所有头文件.好吧,我想,让我们使用一个regualar表达式来匹配与分析的.cpp文件在同一文件夹中的所有内容.我可以忍受这一点,虽然它可能会删除因使用外部标头错误导致的警告.
在这里,我不确定正则表达式是否必须匹配完整(绝对)文件名或只是文件名的一部分.我试过了
-header-filter=.*\/CodeAssistant\/.*.h
Run Code Online (Sandbox Code Playgroud)
它匹配CodeAssistant文件夹中的所有绝对头文件名,但它没有抑制gmock-spec-builders.h文件中的警告.
因此,我希望单独抑制每个警告,以便我可以确定每个警告是否是真正的问题,但如果这是不可能的,我也可以抑制来自整个外部标题的警告.
感谢您的时间.
小智 7
我通过在gmock-spec-builders.h的第 1790行添加// NOLINT解决了这个问题
这是差异:
--- 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_
Run Code Online (Sandbox Code Playgroud)
最好是上游这个补丁(我在代码中看到其他 NOLINT)或与 clang-tidy 人员一起发布错误报告。
我发现了另一种非侵入性(不添加// NOLINT到第三方库)的方法来抑制警告。例如,当前版本的 Google Test 未通过某些cppcoreguidelines-*检查。以下代码允许您验证当前差异,不包括包含 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
Run Code Online (Sandbox Code Playgroud)
它假定该文件build/compile_commands.json是之前生成的并且clang-tidy-diff.py可从您的环境中获得。recountdiff并interdiff从patchutils用于操纵补丁的标准工具。
该脚本的工作原理如下:
git diff -U3 生成一个带有 3 个上下文行的补丁。sed ...+从不需要的行中删除前缀,即将它们转换为上下文。recountdiff 块头中的正确偏移量(在第一个范围内)。interdiff -U0 /dev/null /dev/stdin只是从补丁中删除所有上下文行。结果,它分裂了最初的大块头。clang-tidy-diff.py仅从块头读取第二个范围并将它们传递给clang-tidyvia-line-filter选项。UPD:提供interdiff足够数量的上下文行很重要,否则可能会在结果中产生一些工件。见引文man interdiff:
为了获得最佳结果,差异必须至少包含三行上下文。
特别是,我发现在拆分块后会git diff -U0 | ... | interdiff生成一些虚假文字$!otj。
| 归档时间: |
|
| 查看次数: |
8546 次 |
| 最近记录: |