You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:27:20