已合并
add precommit #1339
add precommit #1339
已合并
duanpengliang创建于 3月31日
duanpengliang
duanpengliang成员
3月31日

描述

add precommit for git hook

关联的Issue

测试

文档更新

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 duanpengliang 的贡献)
duanpengliangduanpengliang成员
3月31日 创建了 pull request,commit b013e596
CANN-robot
CANN-robot成员
3月31日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/runtime wangtao43, yanmingxiang (2/2) wangtao43 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

duanpengliang, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
3月31日 添加了label:cann-cla/yes
CANN-robotCANN-robot成员
3月31日 将wangtao43,zhangpengpeng8,yanmingxiang,Reyn52166,derekxu,tingwood设为评审人
CANN-robotCANN-robot成员
3月31日 将wangtao43,zhangpengpeng8,yanmingxiang,Reyn52166,derekxu,tingwood设为审查人
duanpengliangduanpengliang成员
3月31日 修改了pull request 的描述
duanpengliangduanpengliang成员
3月31日 修改了pull request 的描述
CANN-robot
CANN-robot成员
3月31日 评论:

🤖 CANN 代码审查报告

PR: #1339 - add precommit
严重性: ✅ Low
审查时间: 2026-03-31 15:21


📊 审查结论

✅ 建议合入

  • 严重性: Low
  • 代码质量: 良好
  • 内存安全: ✅ 无风险(配置文件和脚本,无动态内存操作)
  • 安全性: ✅ 无漏洞(输入验证充分,错误处理完善)
  • 测试覆盖: NA(基础设施代码)
  • 文档完整性: 完整(详细的中文提示信息)

这是一个添加 Git pre-commit hooks 的基础设施变更,目的是在代码提交前自动进行代码格式检查和合规性扫描。代码结构清晰,错误处理完善,具有良好的用户体验。


📋 修改概述

本次 PR 添加了 pre-commit 框架支持,用于在代码提交前自动检查:

  1. 代码格式(clang-format)
  2. OAT 合规性(二进制文件和许可证头)
  • 修改文件: 3个 (+501行, -2行)
  • 核心变更:
    • .clang-format: 优化代码格式配置
    • .pre-commit-config.yaml: 新增 pre-commit 配置文件
    • scripts/oat_check.sh: 新增 OAT 合规性检查脚本

🔍 代码质量检查

1. 内存安全 ✅

  • 内存泄漏: ✅ 无风险(纯 Shell 脚本,无动态内存分配)
  • 指针操作: NA
  • 动态分配: NA
  • 资源管理: ✅ 良好(正确使用临时文件,有清理逻辑)

2. 安全性 ✅

  • 输入验证: ✅ 完整

    • 检查命令是否存在(command -v
    • 验证文件路径(相对路径转绝对路径)
    • 检查 Java/Maven 安装结果
  • 边界检查: ✅ 良好

    • 文件列表为空时跳过检查
    • 使用 set -e 避免错误累积
  • 潜在漏洞: ✅ 无明显漏洞

    • 使用 git rev-parse 安全获取仓库根目录
    • 临时文件在固定目录(oat_reports),有清理机制

3. 可读性 ✅

  • 代码清晰度: ✅ 优秀

    • 结构清晰,分步骤注释(7个步骤)
    • 使用有意义的变量名
    • 进度提示信息友好
  • 命名规范: ✅ 符合

    • 变量名使用大写(REPO_ROOT, OAT_DIR)
    • 函数式命名(JAVA_INSTALLED, MAVEN_INSTALLED)
  • 注释完整性: ✅ 完整

    • 每个步骤都有清晰的注释
    • 详细的中文提示信息
    • 错误情况有解决建议

4. 逻辑正确性 ✅

  • 算法逻辑: ✅ 正确

    • 增量扫描模式,只检查暂存文件
    • 自动安装依赖(Java, Maven)的逻辑完善
    • 优雅降级(安装失败时跳过检查)
  • 边界条件: ✅ 处理完整

    • 无文件时跳过检查
    • Java/Maven 未安装时自动安装
    • 打包失败时提供详细建议
    • Windows 系统提供手动安装指南
  • 影响范围: ✅ 明确

    • 仅影响 Git 提交流程
    • 使用 --no-verify 可跳过检查
    • 不影响现有代码逻辑

💡 改进建议

  1. 性能优化: 考虑在 OAT 扫描时添加进度提示,对于大量文件可能耗时较长

    echo "[OAT] Scanning files: $(echo $FILE_LIST | tr '|' '\n' | wc -l) files..."
    
  2. 配置灵活性: 可考虑将 OAT_POLICY 作为可配置项,允许不同项目定制策略

    OAT_POLICY="${OAT_POLICY:-filetype:!binary~must|!archive~must;license:*@.*}"
    
  3. 日志增强: 建议添加时间戳到日志,便于问题排查

    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [OAT] Running scan..."
    
  4. clang-format 版本: .pre-commit-config.yaml 中使用 clang-format v16.0.0,建议确认与项目其他工具链版本兼容

  5. Shell 兼容性: 脚本使用 #!/bin/sh,但使用了 set -e 和部分 bash 特性,建议明确指定 #!/bin/bash 或测试 POSIX 兼容性


✅ 代码亮点

  • 用户体验优秀: 详细的中文提示信息,自动安装依赖,优雅降级处理
  • 错误处理完善: 对 Java/Maven 未安装、打包失败、扫描失败等情况都有详细处理
  • 跨平台支持: 对 Linux、macOS、Windows 提供不同的安装方案
  • 增量扫描: 只检查暂存文件,提高效率
  • 清理机制: 自动清理冗余的 PlainReport 文件,保持报告目录整洁
  • 配置合理: clang-format 配置优化(允许短函数单行,改善可读性)

总体评价: 这是一个高质量的基础设施变更,代码结构清晰,错误处理完善,用户体验友好。建议合入后可以在团队中推广使用,提高代码质量和合规性。


⚠️ 声明: 本审查报告由 AI 自动生成,仅供参考。建议人工复核后再做最终决定。

likedislike
CANN-robot
CANN-robot成员
3月31日 评论:

🤖 CANN 代码审查报告

PR: #1339 - add precommit
严重性: ⚠️ Medium
审查时间: 2026-03-31 15:32


📊 审查结论

⚠️ 建议修改后合入

  • 严重性: Medium
  • 代码质量: 良好
  • 内存安全: ✅ 无风险
  • 安全性: ⚠️ 有隐患
  • 测试覆盖: 部分覆盖
  • 文档完整性: 完整

PR 为 CANN 项目添加了 pre-commit 框架支持,用于自动代码格式化和开源合规性检查。整体设计合理,但存在 Shell 脚本安全隐患需要修复。


📋 修改概述

本次 PR 为 CANN 项目添加了 pre-commit 钩子框架支持,包括:

  • 修改文件: 3个 (+501行, -2行)
  • 核心变更:
    • .clang-format: 调整代码格式化规则(允许更紧凑的格式)
    • .pre-commit-config.yaml: 新增 pre-commit 配置文件
    • scripts/oat_check.sh: 新增 OAT 开源合规性检查脚本(480行)

🔍 代码质量检查

1. 内存安全 ✅

  • 内存泄漏: ✅ 无风险(Shell 脚本不涉及动态内存管理)
  • 指针操作: ✅ 无风险
  • 动态分配: ✅ 无风险
  • 资源管理: ✅ 合理(使用临时文件和目录)

结论: Shell 脚本不涉及内存管理,无内存泄漏风险。

2. 安全性 ⚠️

  • 输入验证: ⚠️ 部分缺失
  • 边界检查: ✅ 有检查
  • 潜在漏洞: ⚠️ 存在命令注入风险

⚠️ 发现的安全隐患:

  1. 命令注入风险(Medium) - scripts/oat_check.sh 第 43-52 行:
# 危险:变量未加引号,可能导致分词和通配符扩展
for file in $STAGED_FILES; do  # 应该是 "$STAGED_FILES"
    if [ -z "$FILE_LIST" ]; then
        FILE_LIST="$file"
    else
        FILE_LIST="$FILE_LIST|$file"  # 直接拼接文件名
    fi
done

问题分析

  • 文件名可能包含特殊字符(空格、分号、管道符等)
  • 未加引号的变量会进行分词和通配符扩展
  • 直接拼接到 FILE_LIST 后传递给 OAT 工具,可能导致命令注入

建议修复

# 方案1:使用数组存储文件列表
FILE_ARRAY=()
for file in $STAGED_FILES; do
    FILE_ARRAY+=("$file")
done

# 方案2:正确使用引号
for file in "$@"; do
    # 转义特殊字符
    escaped_file=$(printf '%q' "$file")
    if [ -z "$FILE_LIST" ]; then
        FILE_LIST="$escaped_file"
    else
        FILE_LIST="$FILE_LIST|$escaped_file"
    fi
done
  1. 自动安装依赖的权限问题(Low)

    • 脚本会自动安装 Java 和 Maven(使用 sudo)
    • 可能修改系统环境,在 CI/CD 环境中可能不合适
    • 建议:添加配置选项,允许禁用自动安装
  2. 外部命令执行(Low)

    • 脚本会克隆外部仓库并执行 Maven 构建
    • 如果外部仓库被篡改,可能存在供应链攻击风险
    • 建议:添加仓库完整性检查(例如 git commit hash 验证)

3. 可读性 ✅

  • 代码清晰度: ✅ 优秀
  • 命名规范: ✅ 符合规范
  • 注释完整性: ✅ 完整

代码亮点

  • 脚本结构清晰,分为多个逻辑块(文件检查、环境检查、OAT 扫描等)
  • 中英文注释详细,易于理解
  • 错误提示友好,包含解决方案

4. 逻辑正确性 ✅

  • 算法逻辑: ✅ 正确
  • 边界条件: ✅ 处理完整
  • 影响范围: ✅ 明确(仅影响提交钩子)

逻辑分析

  • 脚本正确处理了文件列表、环境检查、OAT 构建和扫描流程
  • 边界条件处理完善(无文件时跳过、安装失败时跳过)
  • 影响范围明确,不会影响现有代码

💡 改进建议

高优先级(建议修复)

  1. 修复命令注入风险
    • scripts/oat_check.sh 中为所有变量添加引号
    • 使用数组或正确的转义方法处理文件列表
    • 示例代码已在上文提供

中优先级(建议优化)

  1. 增加配置选项

    • 添加环境变量 OAT_SKIP_AUTO_INSTALL=1 禁用自动安装
    • 添加 OAT_SKIP_ON_ERROR=1 允许在错误时继续提交
    • 示例:
      if [ "$OAT_SKIP_AUTO_INSTALL" = "1" ]; then
          echo "[OAT] 自动安装已禁用,跳过检查"
          exit 0
      fi
      
  2. 优化错误处理

    • set -e 前添加 trap 捕获错误
    • 提供更详细的错误日志
    • 示例:
      set -e
      trap 'echo "[OAT] Error on line $LINENO. Exit code: $?"' ERR
      

低优先级(可选)

  1. 添加单元测试

    • oat_check.sh 添加测试用例
    • 测试不同场景(有/无文件、有/无 Java、有/无 Maven)
    • 测试文件名包含特殊字符的情况
  2. 优化性能

    • 缓存 OAT JAR 路径到环境变量或配置文件
    • 避免每次提交都检查 OAT JAR 是否存在
    • 示例:
      OAT_JAR_CACHE="$REPO_ROOT/.oat_jar_path"
      if [ -f "$OAT_JAR_CACHE" ]; then
          OAT_JAR=$(cat "$OAT_JAR_CACHE")
      fi
      
  3. 添加仓库完整性检查

    • 验证 tools_oat 仓库的 commit hash
    • 防止供应链攻击
    • 示例:
      EXPECTED_OAT_COMMIT="abc123..."
      ACTUAL_COMMIT=$(cd "$OAT_DIR" && git rev-parse HEAD)
      if [ "$ACTUAL_COMMIT" != "$EXPECTED_OAT_COMMIT" ]; then
          echo "[OAT] Error: tools_oat commit hash mismatch"
          exit 1
      fi
      

✅ 代码亮点

  1. 自动化程度高

    • 自动检测并安装 Java 和 Maven
    • 自动克隆并构建 OAT 工具
    • 降低了开发者的使用门槛
  2. 错误处理友好

    • 安装失败时提供详细的手动安装指南
    • 扫描失败时允许跳过检查(不阻塞提交)
    • 提供清晰的错误提示和解决方案
  3. 代码格式化统一

    • 使用 clang-format 自动格式化代码
    • 确保团队代码风格一致
  4. 开源合规性保障

    • 使用 OAT 工具检查文件类型和许可证头
    • 确保代码符合开源规范
  5. 文档完整

    • PR 描述清晰(新特性)
    • 脚本注释详细
    • 中英文混合,易于理解
  6. 设计合理

    • 使用增量模式扫描(只扫描待提交文件)
    • 避免全量扫描,提高效率
    • 清理冗余报告文件,保持仓库整洁

🧪 测试建议

建议在合入前进行以下测试:

  1. 功能测试

    • 测试无 Java 环境时的自动安装(Linux/macOS)
    • 测试无 Maven 环境时的自动安装
    • 测试 OAT 扫描通过和失败的场景
  2. 安全性测试

    • 提交包含特殊字符的文件名(空格、分号、管道符等)
    • 验证命令注入防护措施
  3. 性能测试

    • 提交大量文件时的扫描性能
    • 首次运行(需要安装依赖)和后续运行的性能对比
  4. 兼容性测试

    • 在 Linux、macOS、Windows(Git Bash)上测试
    • 在 CI/CD 环境中测试

📌 总体评价

优点

  • 为 CANN 项目引入了 pre-commit 框架,提高了代码质量和开源合规性
  • 自动化程度高,降低了开发者使用门槛
  • 错误处理友好,不阻塞提交流程
  • 代码可读性优秀,注释详细

需要改进

  • 存在 Shell 脚本安全隐患(命令注入风险),需要修复
  • 建议增加配置选项和更完善的错误处理
  • 建议添加测试用例和性能优化

建议
修复命令注入问题后即可合入。其他改进建议可以在后续 PR 中逐步完善。


⚠️ 声明: 本审查报告由 AI 自动生成,仅供参考。建议人工复核后再做最终决定。

likedislike
duanpengliang
duanpengliang成员
3月31日 评论:

compile

likedislike
CANN-robotCANN-robot成员
3月31日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
3月31日 评论:

流水线任务触发成功
任务链接 [640e5d36d51b4993a8ab660d57a5548e][流水线指导]

任务名称状态日志下载链接
codecheck ❌ FAILED >>>>>
SCA ✅ SUCCESS >>>>>
anti_virus ✅ SUCCESS >>>>>
Check_Pr ✅ SUCCESS >>>>>
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>>
UT_Test_acl ⚪ ABORTED >>>>>
UT_Test_rts ⚪ ABORTED >>>>>
UT_Test_rts_c ⚪ ABORTED >>>>>
UT_Test_platform ⚪ ABORTED >>>>>
UT_Test_qs ⚪ ABORTED >>>>>
UT_Test_aicpusd ⚪ ABORTED >>>>>
UT_Test_tsd ⚪ ABORTED >>>>>
UT_Test_dfx ⚪ ABORTED >>>>>
API_Check ⚪ ABORTED >>>>>
UT_Test_mmpa ⚪ ABORTED >>>>>

[2026-03-31 16:39:59]    CI执行失败

likedislike
CANN-robotCANN-robot成员
3月31日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
3月31日 添加了label:ci-pipeline-failed
duanpengliangduanpengliang成员
4月1日 update merge request[project id: 8810053, iid: 1339, commit_id: b85c6aa9ac41dfcb1a4a473fd5ae5743620839fb] virtual merging success
duanpengliangduanpengliang成员
4月1日 强制推送  1 个提交:eff23725-add precommit
duanpengliangduanpengliang成员
4月1日 update merge request[project id: 8810053, iid: 1339, commit_id: aeb164e3cf6e9ff7366fd8e9cfa9ecefda0103b0] virtual merging success
duanpengliang
duanpengliang成员
4月1日 评论:

compile

likedislike
CANN-robotCANN-robot成员
4月1日 删除了label:ci-pipeline-failed
CANN-robotCANN-robot成员
4月1日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
4月1日 评论:

流水线任务触发成功
任务链接 [51e637b7cfa6494a8bbf616622212790][流水线指导]

任务名称状态日志下载链接
codecheck ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
anti_virus ✅ SUCCESS >>>>>
Check_Pr ✅ SUCCESS >>>>>
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>>
codecheck_style ✅ SUCCESS
UT_Test_acl ✅ SUCCESS >>>>>
UT_Test_rts ✅ SUCCESS >>>>>
UT_Test_rts_c ✅ SUCCESS >>>>>
UT_Test_platform ✅ SUCCESS >>>>>
UT_Test_qs ✅ SUCCESS >>>>>
UT_Test_aicpusd ✅ SUCCESS >>>>>
UT_Test_tsd ✅ SUCCESS >>>>>
UT_Test_dfx ✅ SUCCESS >>>>>
API_Check ✅ SUCCESS >>>>>
UT_Test_mmpa ✅ SUCCESS >>>>>

[2026-04-01 17:02:11]    CI执行结束

likedislike
CANN-robotCANN-robot成员
4月1日 添加了label:api-check-pass
此处折叠了5条事件消息 查看更多
CANN-robotCANN-robot成员
4月2日 删除了label:ci-pipeline-passed
CANN-robot
CANN-robot成员
4月2日 评论:

Notification

This pull request source branch has changed, so removes the following label(s): ci-pipeline-passed.

likedislike
duanpengliang
duanpengliang成员
4月2日 评论:

compile

likedislike
CANN-robotCANN-robot成员
4月2日 添加了label:ci-pipeline-running
CANN-robotCANN-robot成员
4月2日 删除了label:api-check-pass
CANN-robot
CANN-robot成员
4月2日 评论:

流水线任务触发成功
任务链接 [afebb46dc0f7451ca4326ee21faa999c][流水线指导]

任务名称状态日志下载链接
codecheck ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
anti_virus ✅ SUCCESS >>>>>
Check_Pr ✅ SUCCESS >>>>>
Compile_Ascend_X86 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM ✅ SUCCESS >>>>> >>>>>
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>>
codecheck_style ✅ SUCCESS
UT_Test_acl ✅ SUCCESS >>>>>
UT_Test_rts ✅ SUCCESS >>>>>
UT_Test_rts_c ✅ SUCCESS >>>>>
UT_Test_platform ✅ SUCCESS >>>>>
UT_Test_qs ✅ SUCCESS >>>>>
UT_Test_aicpusd ✅ SUCCESS >>>>>
UT_Test_tsd ✅ SUCCESS >>>>>
UT_Test_dfx ✅ SUCCESS >>>>>
API_Check ✅ SUCCESS >>>>>
UT_Test_mmpa ✅ SUCCESS >>>>>

[2026-04-02 10:03:20]    CI执行结束

likedislike
CANN-robotCANN-robot成员
4月2日 添加了label:api-check-pass
CANN-robotCANN-robot成员
4月2日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
4月2日 添加了label:ci-pipeline-passed
wangtao成员
4月2日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
4月2日 添加了label:approved
yanmingxiang成员
4月2日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
4月2日 添加了label:lgtm
CANN-robot
CANN-robot成员
4月2日 评论:

Review Guide

This pull-request passes review.
Committers who wrote a comment of /approve are: wangtao43.
Reviewers who wrote a comment of /lgtm are: wangtao43, yanmingxiang.

likedislike
CANN-robotCANN-robot成员
4月2日 合入了pull request