合并受阻
变更摘要
本 PR 为 CANN 代码侦探挑战赛(Challenge01-DivCustom)提交了一个 DivCustom 自定义算子的代码样例框架。新增的算子骨架文件 div_custom.asc 定义了向量逐元素除法的算子类 KernelDiv、Tiling 数据结构 DivCustomTilingData、验证函数 VerifyResult 以及测试主函数,但核心的 Init、Process、CopyIn、Compute、CopyOut 等方法体均为占位符(标记"请补充……"),供参赛者完善实现。同时提供了配套的 run.sh 构建脚本。
主要改动
- 新增
div_custom.asc算子骨架文件:定义了KernelDiv类(包含Init/Process/CopyIn/Compute/CopyOut五个待实现方法)、全局核函数div_custom、DivCustomTilingDatatiling 结构体,以及kernel_div、VerifyResult和main函数,构成了完整的算子开发模板 - 新增
run.sh构建运行脚本:用于激活 CANN 工具链环境、创建 build 目录、执行 cmake 编译并运行div_test测试可执行文件 - 引入测试验证逻辑:
main函数中构造了长度为8*2048的测试向量,VerifyResult通过std::equal逐个比较输出与 golden 值,并输出通过/失败信息及前 20 个元素


代码审查
审查总结
| 文件 | 审查结果 |
|---|---|
CMakeLists.txt |
无问题 — CMake 配置与 Template 一致,find_package/project/add_executable 及 target_compile_options 用法正确 |
div_custom.asc |
发现 1 个问题(P2):VerifyResult 中 std::equal 缺少长度检查 |
run.sh |
发现 1 个问题(P2):缺少 set -euo pipefail,环境变量未设置时错误被静默吞没 |
- P0: 0 个
- P1: 0 个
- P2: 2 个
- P3: 0 个
整体风险判断:中等。两个 P2 问题均属于边界条件下的可靠性缺陷,不会在当前正常使用路径(环境变量正确配置、output 与 golden 长度相同)下触发,但在异常场景下可能导致未定义行为或混淆的错误信息。std::equal 的越界风险在参与者提交的代码实际运行时可能暴露(取决于参与者是否正确填充了 output 的长度),建议在合入 Template 之前修复。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 3 |
💬 仅评论


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
⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-cann/cann-outreach | ❌ (0/2)(You can also ask: yanyawen, shaoyf, li-shengxian3, 王艳秋, Carolina_yuan) | ❌ (0/1)(You can also ask: yanhf, luzx66, yanyawen, 田晓亮, jxlang) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
guest_shao, thanks for your pull request. All authors of the commits have signed the CLA. 👍


🟡 Medium Priority
变更行:div_custom.asc 第 74 行 std::equal(golden.begin(), golden.end(), output.begin())。
std::equal(first1, last1, first2) 仅比较 [first1, last1) 范围内的元素是否与从 first2 开始的元素一一相等,不检查两个区间的长度是否相同。因此:
- 越界读(UB):若
output.size() < golden.size(),output.begin()迭代器前进超过golden.size()步时会超出output的合法范围,触发未定义行为。 - 漏检(false positive):若
output.size() > golden.size()且前golden.size()个元素恰好匹配,std::equal返回true,output尾部多余的(可能错误)元素被完全忽略,精度验证形同虚设。
VerifyResult 不在 README 列出的"你需要完成的内容"中,是挑战提供方应保证正确的函数,此缺陷会直接影响所有参与者的验证结果可信度。
| 74
| - if (std::equal(golden.begin(), golden.end(), output.begin())) { |
|
74 | + if (golden.size() == output.size() && std::equal(golden.begin(), golden.end(), output.begin())) { |


🟡 Medium Priority
变更行:run.sh 整体(新增的 9 行脚本)。
脚本缺少 set -euo pipefail(或至少 set -eu),导致以下可靠性问题:
- 第 3 行
source "$ASCEND_TOOLKIT_HOME/set_env.sh":若ASCEND_TOOLKIT_HOME环境变量未设置或为空,bash 会将此展开为source "/set_env.sh",尝试 source 根目录下的文件。虽然该文件大概率不存在(会报错),但由于没有set -e,脚本不会在此退出,而是继续执行后续命令。 - 第 5 行
export ASC_DIR="$ASCEND_HOME_PATH/...":同理,若ASCEND_HOME_PATH未设置,ASC_DIR会指向/aarch64-linux/...(绝对路径从根开始),后续 cmake 会因找不到 ASC 包而失败,但错误信息不直观。 - 第 6–9 行的
&&链提供了部分保护,但第 3–5 行的命令不受保护。
set -euo pipefail 会在任何命令失败(-e)、使用未定义变量(-u)、管道中任意命令失败(-o pipefail)时立即退出,是 shell 脚本的基本安全网。
建议:在 #!/bin/bash 之后新增一行 set -euo pipefail
| 1
| - #!/bin/bash |
|
1 | + #!/bin/bash |
|
2 | + set -euo pipefail |


🟡 Medium Priority
run.sh 脚本缺少 set -euo pipefail(或至少 set -e),具体影响如下:
source失败被静默忽略(第 3 行):若$ASCEND_TOOLKIT_HOME/set_env.sh不存在或有错误,source返回非零退出码,脚本继续执行,后续cmake/make在不完整的环境中运行。mkdir -p build失败被静默忽略(第 4 行):无set -e且无&&保护,若因权限等问题失败,脚本仍继续执行cd build/。- 未定义变量静默展开为空:
ASCEND_TOOLKIT_HOME或ASCEND_HOME_PATH未设置时,分别导致source "/set_env.sh"和ASC_DIR="/aarch64-linux/...",产生错误路径。
触发条件:运行环境中 ASCEND_TOOLKIT_HOME 或 ASCEND_HOME_PATH 未正确设置,或 set_env.sh 不存在/执行失败。
建议在 #!/bin/bash 之后立即添加 set -euo pipefail,使得任何命令失败或未定义变量引用时脚本立即退出。
建议:在 #!/bin/bash 之后添加 set -euo pipefail,使脚本在任何命令失败、引用未定义变量、或管道中任一命令失败时立即退出。
| 2
| - # |
|
2 | + #!/bin/bash |
|
3 | + set -euo pipefail |


变更描述 / Description
新增DivCustom代码样例
改动类型 / Change Type
关联 Issue / Related Issues
测试信息 / Testing
检查清单 / Checklist