【发布时间】:2017-01-24 10:15:24
【问题描述】:
我最近开始尝试 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 文件的警告。
所以最好我想单独抑制每个警告,这样我就可以确定每个警告是否是一个真正的问题,但如果这不可能,我也可以抑制来自整个外部标题的警告。
感谢您的宝贵时间。
【问题讨论】:
标签: suppress-warnings clang-static-analyzer clang-tidy