已开启
【代码侦探Challenge01-DivCustom】新增DivCustom代码提交PR样例 #1052
【代码侦探Challenge01-DivCustom】新增DivCustom代码提交PR样例 #1052
已开启
guest_shao创建于 7月16日
guest_shao
7月16日

变更描述 / Description

新增DivCustom代码样例

改动类型 / Change Type

  • Closes #
  • References #

测试信息 / Testing

检查清单 / Checklist

likedislike
合并受阻
atomgit-bot
atomgit-bot
7月16日 评论:

变更摘要

本 PR 为 CANN 代码侦探挑战赛(Challenge01-DivCustom)提交了一个 DivCustom 自定义算子的代码样例框架。新增的算子骨架文件 div_custom.asc 定义了向量逐元素除法的算子类 KernelDiv、Tiling 数据结构 DivCustomTilingData、验证函数 VerifyResult 以及测试主函数,但核心的 InitProcessCopyInComputeCopyOut 等方法体均为占位符(标记"请补充……"),供参赛者完善实现。同时提供了配套的 run.sh 构建脚本。

主要改动

  • 新增 div_custom.asc 算子骨架文件:定义了 KernelDiv 类(包含 Init/Process/CopyIn/Compute/CopyOut 五个待实现方法)、全局核函数 div_customDivCustomTilingData tiling 结构体,以及 kernel_divVerifyResultmain 函数,构成了完整的算子开发模板
  • 新增 run.sh 构建运行脚本:用于激活 CANN 工具链环境、创建 build 目录、执行 cmake 编译并运行 div_test 测试可执行文件
  • 引入测试验证逻辑main 函数中构造了长度为 8*2048 的测试向量,VerifyResult 通过 std::equal 逐个比较输出与 golden 值,并输出通过/失败信息及前 20 个元素
likedislike
atomgit-bot
atomgit-bot
7月16日 评论:

代码审查

审查总结

文件 审查结果
CMakeLists.txt 无问题 — CMake 配置与 Template 一致,find_package/project/add_executabletarget_compile_options 用法正确
div_custom.asc 发现 1 个问题(P2):VerifyResultstd::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

💬 仅评论

likedislike
CANN-robotCANN-robot成员
7月16日 添加了label:cann-cla/yes
Gguest_shao
7月16日 修改了pull request 的描述
Gguest_shao
7月16日 修改了pull request 的描述
CANN-robot
CANN-robot成员
7月16日 评论:

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 /approve or /lgtm
  • Commenting /approve implies 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. 👍

likedislike
Gguest_shao
7月16日 修改了pull request 的描述
Gguest_shao
7月16日 修改了pull request 的描述
Gguest_shao
7月16日 修改了pull request 的描述
atomgit-bot
atomgit-bot7月16日进行代码检视1
2026/CANN-Code-Detective/Challenge01-DivCustom/guest_shao/DivCustom/div_custom.asc
@@ -0,0 +71,4 @@
71+ };
72+ printTensor(output, "Output");
73+ printTensor(golden, "Golden");
74+ if (std::equal(golden.begin(), golden.end(), output.begin())) {
atomgit-bot
atomgit-bot7月16日评论:

🟡 Medium Priority

变更行:div_custom.asc 第 74 行 std::equal(golden.begin(), golden.end(), output.begin())

std::equal(first1, last1, first2) 仅比较 [first1, last1) 范围内的元素是否与从 first2 开始的元素一一相等,不检查两个区间的长度是否相同。因此:

  1. 越界读(UB):若 output.size() < golden.size()output.begin() 迭代器前进超过 golden.size() 步时会超出 output 的合法范围,触发未定义行为。
  2. 漏检(false positive):若 output.size() > golden.size() 且前 golden.size() 个元素恰好匹配,std::equal 返回 trueoutput 尾部多余的(可能错误)元素被完全忽略,精度验证形同虚设。

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())) {
应用建议
likedislike
atomgit-bot
atomgit-bot7月16日进行代码检视1
2026/CANN-Code-Detective/Challenge01-DivCustom/guest_shao/DivCustom/run.sh
@@ -0,0 +1,0 @@
1+#!/bin/bash
atomgit-bot
atomgit-bot7月16日评论:

🟡 Medium Priority

变更行:run.sh 整体(新增的 9 行脚本)。

脚本缺少 set -euo pipefail(或至少 set -eu),导致以下可靠性问题:

  1. 第 3 行 source "$ASCEND_TOOLKIT_HOME/set_env.sh":若 ASCEND_TOOLKIT_HOME 环境变量未设置或为空,bash 会将此展开为 source "/set_env.sh",尝试 source 根目录下的文件。虽然该文件大概率不存在(会报错),但由于没有 set -e,脚本不会在此退出,而是继续执行后续命令
  2. 第 5 行 export ASC_DIR="$ASCEND_HOME_PATH/...":同理,若 ASCEND_HOME_PATH 未设置,ASC_DIR 会指向 /aarch64-linux/...(绝对路径从根开始),后续 cmake 会因找不到 ASC 包而失败,但错误信息不直观。
  3. 第 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
应用建议
likedislike
atomgit-bot
atomgit-bot7月16日进行代码检视1
2026/CANN-Code-Detective/Challenge01-DivCustom/guest_shao/DivCustom/run.sh
@@ -0,0 +1,1 @@
1+#!/bin/bash
2+# 激活cann环境,可根据实际情况修改,在线环境一般不用修改,
atomgit-bot
atomgit-bot7月16日评论:

🟡 Medium Priority

run.sh 脚本缺少 set -euo pipefail(或至少 set -e),具体影响如下:

  1. source 失败被静默忽略(第 3 行):若 $ASCEND_TOOLKIT_HOME/set_env.sh 不存在或有错误,source 返回非零退出码,脚本继续执行,后续 cmake/make 在不完整的环境中运行。
  2. mkdir -p build 失败被静默忽略(第 4 行):无 set -e 且无 && 保护,若因权限等问题失败,脚本仍继续执行 cd build/
  3. 未定义变量静默展开为空ASCEND_TOOLKIT_HOMEASCEND_HOME_PATH 未设置时,分别导致 source "/set_env.sh"ASC_DIR="/aarch64-linux/...",产生错误路径。

触发条件:运行环境中 ASCEND_TOOLKIT_HOMEASCEND_HOME_PATH 未正确设置,或 set_env.sh 不存在/执行失败。

建议在 #!/bin/bash 之后立即添加 set -euo pipefail,使得任何命令失败或未定义变量引用时脚本立即退出。

建议:在 #!/bin/bash 之后添加 set -euo pipefail,使脚本在任何命令失败、引用未定义变量、或管道中任一命令失败时立即退出。

改动建议
2
- # 激活cann环境,可根据实际情况修改,在线环境一般不用修改,
2
+ #!/bin/bash
3
+ set -euo pipefail
应用建议
likedislike