已开启
[Bug-Report|缺陷反馈] check_kernel_ut.sh 解析多行 OPS_CATEGORY_LIST 恒空 + local_check.sh 管道吞错,全仓 kernel UT 检查形同虚设 #2
xujiachen8创建于 9月14日
xujiachen8
9月16日 评论:
9月16日 评论:
您好,感谢反馈!我们已按 Issue 中给出的 chunk_cat 文件列表和两个脚本逐项核对。
问题分析
在当前仓库版本 63d11ee0 中,check_kernel_ut.sh 仍用单行 grep 读取 OPS_CATEGORY_LIST,而 cmake/variables.cmake 的 math、conversion、random 声明跨多行。解析结果为空后,算子筛选列表为空,kernel UT 的构建循环不会进入,脚本会以成功码结束;这部分与 Issue 描述一致。
local_check.sh 当前文件头已经启用 set -euo pipefail,run_check 只暂时关闭 errexit,所以现版本的 Kernel UT 管道具备传递子命令失败码的基础,原文所述“未开 pipefail”与该版本代码不一致。关联 cann/ops-math!5511 仍为 open:它覆盖了多行解析和空列表保护,但其管道改动保存 kernel_ut_status 后又把 set +o pipefail 的返回码赋给 ret,失败状态没有真正用于判断,因此尚不能作为完整修复;该 PR 也尚未合入。
处理方向
维护侧将修正列表解析和空列表行为,并补充失败子命令、chunk_cat 文件列表及三种 SoC 执行路径的回归验证,同时保留真实管道返回码。该问题与来源 cann/ops-math#3105 同源;修复与验证由维护团队承接。


问题
ops-math 仓库的两个本地门禁脚本存在连锁缺陷,导致 kernel UT 检查在任何情况下都不会真正执行测试,且失败时仍显示 PASS:
缺陷一:check_kernel_ut.sh 的 OPS_CATEGORY_LIST 解析恒空
scripts/ci/check_kernel_ut.sh:21:op_category_list=$(grep -oP 'set\(OPS_CATEGORY_LIST\s*\K".*"' $current_dir/$variables_cmake | sed 's/"//g')而
cmake/variables.cmake:233-238的实际声明是多行格式:set(OPS_CATEGORY_LIST "math" "conversion" "random" )单行 grep 无法匹配多行 set(),
op_categories恒为空数组 →valid_dirs恒空 →ops_name恒空 → 循环零次,任何文件的 kernel UT 都不会被触发,脚本静默 exit 0。缺陷二:local_check.sh 管道后取 tee 退出码
scripts/ci/local_check.sh:931:"${cmd_array[@]}" 2>&1 | tee "${PROJECT_ROOT}/logs/ut_kernel.txt"由于未开 pipefail,后续
$?取的是tee的退出码(恒 0)——即使 check_kernel_ut.sh 内部 build 失败,Summary 仍显示Kernel UT PASS。复现(本地 CANN 9.2.0)
echo "conversion/chunk_cat/tests/ut/op_kernel/test_chunk_cat.cpp" > pr_filelist.txt bash scripts/ci/check_kernel_ut.sh pr_filelist.txt # 修复前:零输出,exit 0 bash scripts/ci/local_check.sh -f pr_filelist.txt --llt-kernel-ut # 修复前:2 秒"PASS"(logs/ut_kernel.txt 为空)影响
修复验证
修复后(sed 范围解析 + 空列表快速失败 + pipefail 局部开启):
ASCEND_3RD_LIB_PATH=$PWD/third_party bash scripts/ci/check_kernel_ut.sh pr_filelist.txt # [EXECUTE_COMMAND] bash build.sh -u --opkernel --ops=chunk_cat ... 真实执行 910b/310p/950 三 soc,exit 0,1 test PASSED修复 PR 见关联。