已开启
[PROMPT-CONSERVATIVE][source #6] [Bug-Report|缺陷反馈]: [工具检测]:DiagFlat 算子未初始化告警 #60
xujiachen8创建于  9月16日
xujiachen8成员
9月16日 创建

本条为响应质量测试副本,来源 https://gitcode.com/xujiachen8/ops-math/issues/6 。

本 Issue 仅用于 gitcode-issue-handler 调试。原始来源:https://gitcode.com/cann/ops-math/issues/3176。以下保留原始描述。

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

一、问题描述 (必填)

尾部输入越界读(uninitialized read)

3.1 现象

====== ERROR: uninitialized read of size 24
======    at 0x120000017000 on GM in DiagFlat_...i32_high_performance_101
======    in block aiv(0) on device 3 at pc current 0x44fc (serialNo:175)
======    #0 diag_flat_nd_to_2d_with_few.h:205 (CopyIn: DataCopy)
======    #1 diag_flat_nd_to_2d_with_few.h:301 (CopyIn(loopSize-1, rollback))
======    #2 diag_flat.cpp:36

对应的内存记录:

serialNo 操作 地址 大小 含义
1 MALLOC 0x120000017000 32B 输入 GM 分配 32B
2 STORE 0x120000017000 8B host→device 拷贝写入 8B
175 MOV_ALIGN_V2 (读) 0x120000017000 32B 内核 CopyIn 读 32B

3.2 根因

  • ONCE_HANDLE_NUM = ONE_BLK_SIZE / sizeof(T),i32 时 ONE_BLK_SIZE=32 → ONCE_HANDLE_NUM=8。
  • 例子里输入 selfShape={1,2}、selfHostData={2,5} 即 inputNum_=2,输入只初始化了 8B。
  • CopyIn 无条件读满一个 ONCE_HANDLE_NUM(=8) 整块:
DataCopy(ubInput, gmInput_[iter * ONCE_HANDLE_NUM - rollback], ONCE_HANDLE_NUM);
  • 由于 inputNum_=2 ≤ ONCE_HANDLE_NUM,rollback 不生效(rollback 只在 inputNum_ > ONCE_HANDLE_NUM 时计算),loopSize=1 只迭代一次,CopyIn(0,0) 读下标 0..7;但有效输入只有 0..1,后 6 个元素(24B,正好 32−8)读到同块 malloc 内、从未写过的内存 → uninitialized read of size 24。

结论:非误报,属尾部越界(OOB)读 / 未定义行为。多读到的值最终只落入 CopyOutTail 会丢弃的输出位置,数值上无害,但被 sanitizer 正确捕获。

3.3 修复

让尾部 CopyIn 只读实际剩余的元素个数,例如:

int64_t readNum = std::min<int64_t>(ONCE_HANDLE_NUM,
                                    inputNum_ - (iter * ONCE_HANDLE_NUM - rollback));
DataCopy(ubInput, gmInput_[iter * ONCE_HANDLE_NUM - rollback], readNum);

或对输入尾部使用 DataCopyPad 按实际块长截断,避免每次读满整块。

二、环境信息 (可选)

A5
ops-math仓9.1.0分支

三、重现步骤 (可选)

mssanitizer -t initcheck --log-level=error -- ./build/test_aclnn...

四、预期结果 (可选)

无未初始化异常告警

💡 备注(选填)

likedislike
xujiachen8成员
9月16日 评论:

您好,感谢反馈!

问题分析

我们核对了当前 xujiachen8/ops-math 仓库提交 63d11ee0efd1912bf21ddccac750a3f157924a2a。Issue 堆栈涉及 conversion/diag_flat/op_kernel/diag_flat_nd_to_2d_with_few.h,由同目录 diag_flat.cpp 的小输入分支调用。该故障实现位于 arch35/ 之外,按实现目录属于 A2/A3 旧路径,与报告中的 A5 标注不一致,不能据此认定为 A5 实现缺陷。该实现中,ONCE_HANDLE_NUM 按 32B 块大小和元素类型计算;CopyIn 当前无条件以该数量调用 DataCopy。处理尾块时,rollback 只在输入元素数大于一个块且不整除时计算;当输入元素数小于一个块时仍会读取整块。以 Issue 给出的 int32、2 个元素为例,实际初始化数据是 2 个元素(8B),但一次读取 8 个元素(32B),后 6 个元素对应的未初始化区域会触发 initcheck 告警。

处理方向

一个可行方向是为尾部 CopyIn 按剩余有效元素数量限制读取长度,或在支持的架构上使用按实际长度的 DataCopyPad,同时保持 UB 计算、循环次数、尾部 CopyOutTail 和不同数据类型的对齐约束一致。修复后需要覆盖输入少于一个块、非整块和整块的情况,并用 initcheck 确认不再访问未初始化输入。为核对这条堆栈与 A5 标注的差异,请补充当时使用的源码提交号;该信息可帮助定位实际编译进入的实现。

likedislike