最近我开始尝试使用LLVM的clang-tidy
工具。现在,我想尝试抑制第三方库代码中的错误警告。为此,我想使用命令行选项 -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
我想要抑制的警告的第一行看起来像这样:
.../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>
选项。文档上说:
-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=<string>
选项。文档中指出,必须提供一个正则表达式,该表达式匹配要显示诊断信息的所有头文件。好吧,我想,让我们使用一个正则表达式,它与分析的.cpp文件所在文件夹中的所有内容匹配。虽然这可能会消除由于我错误地使用外部标头而产生的警告,但我可以接受这一点。在这里,我不确定正则表达式是否必须与完整(绝对)文件名匹配,还是只需与文件名的一部分匹配。我尝试了:
-header-filter=.*\/CodeAssistant\/.*.h
该模式匹配CodeAssistant文件夹中所有绝对标头文件名,但未抑制gmock-spec-builders.h文件中的警告。
因此,最好逐个抑制每个警告,这样我可以确定每个警告是否是真正的问题,但如果不可能,我也可以抑制整个外部标头文件的警告。
感谢您的时间。
return function_mocker_->AddNewExpectation( // NOLINT
。 - Knitschi