Merged
[enhancement] hcomm 仓新增 .clang-tidy 增量拦截脚本 + build.sh 集成 #4438
严正行Add on Aug 5
[enhancement] hcomm 仓新增 .clang-tidy 增量拦截脚本 + build.sh 集成 #4438
Merged
Pull Request has been successfully merged by CANN-robot.
(Thank you for 严正行's contribution.)Aug 5 Associated issue: [Question|问题咨询]: build.sh --ut/st是否没有开编译任务并行,[增强建议] 为 HCCL/HCOMM 仓库新增函数复杂度控制类静态检查,[enhancement] hcomm 仓新增 .clang-tidy 函数复杂度控制配置
Aug 5 Associated issue: [Question|问题咨询]: build.sh --ut/st是否没有开编译任务并行,[增强建议] 为 HCCL/HCOMM 仓库新增函数复杂度控制类静态检查,[enhancement] hcomm 仓新增 .clang-tidy 函数复杂度控制配置
atomgit-bot
Aug 5 Comments:
Aug 5 Comments:
变更摘要
此次变更为 hcomm 仓库根目录新增 .clang-tidy 配置文件,启用 readability-function-size 与 readability-function-cognitive-complexity 两个检查器,函数规模阈值遵循华为 C/C++ 编程规范(行数 ≤ 50、参数 ≤ 6、嵌套 ≤ 4 层)。采用渐进式告警模式(WarningsAsErrors 留空),不阻塞编译、不修改源码,仅作为 infrastructure CI 后续接入 clang-tidy 检查的配套配置。
主要改动
- 新增
.clang-tidy配置文件:在仓库根目录新增该文件(+52 行),作为 hcomm 项目函数复杂度静态检查的统一配置入口。 - 启用两项核心检查器:
Checks字段配置为readability-function-size和readability-function-cognitive-complexity,分别覆盖函数规模与认知复杂度两类检查。 - 函数规模阈值设置:
CheckOptions中配置LineThreshold: 50、StatementThreshold: 50、BranchThreshold: 15、ParameterThreshold: 6、NestingThreshold: 4、VariableThreshold: 10,对齐华为编程规范。 - 认知复杂度控制与宏豁免:
readability-function-cognitive-complexity.Threshold设为25,同时IgnoreMacros设为true忽略宏展开导致的复杂度误报。 - 检查范围限定与告警模式:
HeaderFilterRegex限定为src/.*|include/.*|pkg_inc/.*,仅检查项目自身头文件;WarningsAsErrors留空,告警不升级为错误、不阻断编译。


Incorrect?
atomgit-bot
Aug 5 Comments:
Aug 5 Comments:
Aug 5 Added label: cann-cla/yes
287 messages are collapsed here。 See more
12 days ago Removed label: ci-pipeline-running
12 days ago Added label: ci-pipeline-passed
CANN-robot
12 days ago Comments:
12 days ago Comments:
/ai review force


atomgit-bot
12 days ago Comments:
12 days ago Comments:
🤖 AI 代码检视正在进行中,请稍候…


Incorrect?
12 days ago Merged pull request
描述
本 PR 在 hcomm 仓新增
.clang-tidy函数复杂度控制配置 +scripts/clang_tidy_check.py增量拦截脚本 +build.sh集成,实现新增代码的函数复杂度真正拦截(存量代码不阻塞)。配置文件
.clang-tidy启用
readability-function-size+readability-function-cognitive-complexity,阈值遵循华为 C/C++ 编程规范:函数行 50 / 语句 50 / 分支 15 / 参数 6 / 嵌套 4 / 认知复杂度 25。WarningsAsErrors留空(脚本控制阻断)。增量拦截脚本
scripts/clang_tidy_check.py+.shgit diff TARGET_BRANCH...HEAD找变更文件 + 新增行号clang-tidy -p build <变更文件>跑(带 compile_commands.json)build.sh 集成
构建后调用
clang_tidy_check.sh,ENABLE_CLANG_TIDY_CHECK环境变量控制(默认 on)。拦截语义
变更类型
关联的Issue
测试
已完成的测试用例和场景:
exception_callback_mgr.cc加 7 参数函数 → 脚本检测违规 + exit 1 ✅补充的UT用例:NA(脚本是构建工具,非库代码)
文档更新
.clang-tidy配置文件内含详细注释(英文,Scope/Local verification/CI integration 说明)。scripts/clang_tidy_check.py含模块级 docstring。合入检查
CI 拦截说明
本 PR 的 build.sh 集成会在 CI Compile 任务构建后跑 clang-tidy 增量检查。若 CI Compile 镜像未装 clang-tidy,脚本 fallback 跳过(exit 0,不阻断)。真正 CI 拦截需 infrastructure 在 Compile 镜像预装 clang-tidy(issue #229 范围)。
检视意见修复(第 2 轮,2026-10-20)
针对本 PR 六条检视意见(1 HIGH + 3 MEDIUM + 2 LOW)逐一修复:
git rev-parse --show-toplevel)并os.chdir,git pathspec 与os.path.isfile均以仓库根解析,build/ 目录下调用不再漏检run_clang_tidy返回(output, returncode),分析失败(rc!=0)打印醒目 WARNING 并计入汇总,不再静默 PASSupstream→origin顺序尝试,分支名从 TARGET_BRANCH 或默认 base-ref 派生,fetch 用显式 refspec 真正更新 remote-tracking ref(^|[/\])(src|include|pkg_inc|test|experimental)[/\],兼容相对路径与 compile database 绝对路径,锚定到路径段边界scripts/clang_tidy_check_test.py(8 用例:-U0 hunk 解析含纯删除、cwd 无关性、告警 file/line/check 解析、compile db 归一化),接入 build.sh UT 流程新增发现并修复(拦截生效关键):两仓 CMake 均未导出 compile_commands.json,构建不产出该文件导致检查从未真正执行;已加
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON。特殊情况屏蔽(豁免):
// NOLINT(check)/// NOLINTNEXTLINE(check)原生抑制(.clang-tidy注释说明用法)-x c++模式分析,新增复杂度仍被拦截测试:本机 python 单测 8/8 通过(Windows python 3.14 + Linux python 3.10 双验证);WSL clang-tidy 14.0.1 真实验证 8 场景全通过(新增 7 参函数拦截 exit 1 / NOLINT 与 NOLINTNEXTLINE 豁免 exit 0 / 存量行告警过滤 / 第三方文件跳过 / 头文件 50+ 行 standalone 拦截 / build 子目录调用 cwd 无关 / 配置 dump 解析通过)。
交叉验证修复(2026-10-20 晚,glm-5.3 独立模型交叉检视后)
(^|[/\])(src|include|pkg_inc|test|experimental)[/\]。WSL 真实场景验证:被检源文件 include 的违规头文件告警现在正确出现(修复前被整体抑制),且被脚本按文件归一化比对正确过滤不误拦,新增违规头文件仍被拦截。set -e下bash ... ; if [ $? -ne 0 ]的失败日志永不打印,改为if ! bash ...; then log ...; exit 1; fi,退出码语义不变、错误信息可见。+++行排除条件(new_start守卫已覆盖文件头),docstring 补充头文件 standalone 无 -I 的告警语义。未采纳说明(记录为设计边界):增量检查挂在默认构建分支(CI Compile 任务走默认 build.sh 入口,见流水线任务表);头文件 standalone 无 -I 路径(失败仅告警不阻断);ENABLE_CLANG_TIDY_CHECK 仅环境变量开关(与仓内 env 开关惯例一致)。
第三轮(2026-10-21,检视意见 jiyuanhao + 可读性/验证要求)
scripts/clang-tidy/(避免与 scripts/ 打包脚本混淆),build.sh 与 .clang-tidy 引用同步更新bash build.sh --pkg后真实执行Running clang-tidy incremental check (ENABLE_CLANG_TIDY_CHECK=on),当前镜像无 clang-tidy 按设计 WARNING 跳过Ran 9 tests in 0.116s / OK——单测在 UT 流程最先执行并通过第四轮(2026-10-21,作者要求:基线加固 + 豁免政策)
upstream/<目标分支>(CI 的 TARGET_BRANCH 只选分支名,不再产生裸本地分支名,杜绝"本地过期分支被当基线");resolve_base_ref使用前从 remote fetch 刷新(upstream→origin 回退);docstring 与 .clang-tidy 注释写明三点 diff 语义——新增行永远指"本分支相对 gitcode 上游最新目标分支的新增",上游新增行不会归属到本分支.clang-tidy注释重写为原则上禁止屏蔽("complex functions get split, not silenced",豁免行与代码同等检视,无理由的豁免会被拒绝);示例隐晦化——机制只指向 clang-tidy 官方文档,不再给出可照抄的完整 NOLINT 样板;自测配方保留一个泛化写法(// NOLINT(<FAIL 行报告的检查名>))并注明仅限自测