已开启
[PROMPT-CONSERVATIVE][source #6] [Bug-Report|缺陷反馈]: [工具检测]:DiagFlat 算子未初始化告警 #60
xujiachen8创建于 9月16日
xujiachen8
9月16日 评论:
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 标注的差异,请补充当时使用的源码提交号;该信息可帮助定位实际编译进入的实现。


本条为响应质量测试副本,来源 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 现象
对应的内存记录:
CopyIn读 32B3.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。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...
四、预期结果 (可选)
无未初始化异常告警
💡 备注(选填)