clang-tidy 13为何未像12版本一样忽略系统头文件?如何解决
问题原因
clang-tidy 13版本对-header-filter参数的匹配优先级做了上游逻辑调整:
- 12及更早版本中,被
-isystem标记的系统路径下的头文件,无论是否匹配-header-filter的正则规则,默认都会被跳过,不会输出诊断信息。 - 13及之后版本中,
-header-filter的匹配优先级高于系统头文件判定规则:只要头文件路径匹配-header-filter设置的正则,哪怕该文件位于-isystem标记的系统路径下,clang-tidy也会输出对应的报错。
你之前使用的-header-filter=.*会匹配所有路径下的头文件,升级后自然会把外部库系统头文件的报错全部输出,该问题和Alpine镜像的打包版本无直接关联,是版本迭代带来的预期行为变更。
可行配置方案
根据使用场景选择任意一种方案即可:
- 收紧
-header-filter的正则匹配范围,放弃全路径匹配,仅匹配自有代码路径。例如自有头文件存放在/my_include目录、项目源码存放在./src目录时,将参数调整为-header-filter=^/my_include/|^./src/,仅对匹配到的自有头文件输出诊断,外部库路径会被自动排除。 - 显式添加
--system-headers=false参数,强制clang-tidy跳过所有系统头文件的诊断。该参数会覆盖-header-filter对系统头文件的匹配逻辑,保持和12及更早版本一致的行为,命令示例:
clang-tidy --system-headers=false -header-filter=.* ./src/example.cpp -p=./
- 如果通过CMake内置的
CMAKE_CXX_CLANG_TIDY选项直接调用clang-tidy,在传参列表中加入上述任意一种配置即可,示例:
set(CMAKE_CXX_CLANG_TIDY clang-tidy --system-headers=false -header-filter=${PROJECT_SOURCE_DIR}/.* )
注意:不要为了过滤报错将外部库的引入方式从
-isystem改为-I,该操作会让C++编译器本身也对外部库头文件输出编译警告,引入更多无关问题。
内容的提问来源于stack exchange,提问作者R. N
相关产品推荐
相关产品推荐

