如何让clang-tidy忽略特定头文件?已尝试-isystem与NOLINT均无效
我的项目里部分C++头文件会触发clang-tidy警告,但因为各种原因没法编辑这些文件(不管是修复警告还是加//NOLINT标记),现在想在编译包含这些文件的源码时把警告关掉。
我试过两种方法,但都没生效:
方法1:标记为系统包含目录
执行了以下命令:
$ clang-tidy --header-filter=".*" --extra-arg="-isystem /Users/me/work/server/framework/random" --extra-arg-before="--driver-mode=g++" rpp/finder.cpp
输出结果里还是出现了该目录下头文件的警告:
211720 warnings generated. 423440 warnings generated. /Users/me/work/server/framework/random/scale.h:51:37: warning: forwarding reference parameter 'gen' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward] 51 | static Result downScale(Generator&& gen, Result range) | ^ /Users/me/work/server/framework/random/shuffle.h:19:104: warning: forwarding reference parameter 'g' is never forwarded inside the function body [cppcoreguidelines-missing-std-forward] 19 | void shuffle(RandomAccessIterator first, RandomAccessIterator sentinel, UniformRandomNumberGenerator&& g) | ^ Suppressed 424918 warnings (423436 in non-user code, 1482 NOLINT). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
方法2:用NOLINTBEGIN/NOLINTEND包裹包含语句
在源码里这么写:
// NOLINTBEGIN #include "framework/random/scale.h" #include "framework/random/shuffle.h" // NOLINTEND
但同样没抑制住警告。
补充:我需要clang-tidy检查除这个特定目录外的所有头文件,所以用了--header-filter=".*"。请问问题出在哪?
关于-isystem失效的原因
你用的--header-filter=".*"会强制clang-tidy检查所有头文件(包括系统头文件),直接覆盖了默认忽略系统头文件的行为。从输出提示也能看出:Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.,说明这个参数会把系统目录下的文件也当作非系统文件来扫描。
解决办法:把--header-filter改成排除目标目录的正则表达式,比如:
--header-filter="^(?!.*framework/random).*"
这个正则会匹配所有不包含framework/random路径的头文件,既保留对其他所有头文件的检查,又跳过了目标目录的文件。
关于NOLINTBEGIN/NOLINTEND失效的原因
// NOLINTBEGIN和// NOLINTEND只能抑制当前源文件内的警告,而头文件里的警告是在头文件自身被解析时触发的,不属于包裹包含语句的源文件范围。clang-tidy的NOLINT标记必须直接放在产生警告的代码所在文件里才会生效,所以这种方法对外部头文件无效。
额外验证方法
可以加上--system-headers参数测试:如果添加后警告数量大幅增加,说明之前的-isystem已经生效,只是--header-filter=.*强制显示了这些系统目录的警告。
内容的提问来源于stack exchange,提问作者Alex O

