在 CompareScalarExtend 函数第394行,CompareScalar 的源操作数使用了 src_tmp[cnt],但数据在第392行通过 DataCopy(src_tmp[0], src[cnt], left_cnt) 被复制到了 src_tmp[0]。cnt 是源 tensor 的累计偏移量(在循环中每轮累加 max_block_cnt),而非临时缓冲区 src_tmp 的偏移量。当 cnt 超过 src_tmp 的有效大小时(src_tmp 是 tmp_buf 的子视图,大小受限于 UB 缓冲区),src_tmp[cnt] 构成数组越界访问。正确写法应为 src_tmp[0]。
核查1(模式成立):第392行 DataCopy(src_tmp[0], src[cnt], left_cnt) 将数据复制到 src_tmp[0],但第394行 CompareScalar(compare_out[0], src_tmp[cnt], ...) 使用 src_tmp[cnt] 作为源操作数。 cnt 是源 tensor src 的累计偏移(循环中每轮累加 max_block_cnt,可达数千),而 src_tmp 是 tmp_buf 的子视图(大小受限于 UB 缓冲区),src_tmp[cnt] 远超 src_tmp 有效边界,数组越界访问模式成立。 核查2(防护无效):第390行 if(left_cnt*sizeof(T)<256) 仅判断是否走小数据路径,无对 cnt 与 src_tmp 大小关系的校验,无有效防护。 核查3(函数可达):Grep 确认 compare_api_call.cpp:73 和 compare_v2_api_call.cpp:138/144 通过 codegen 生成对本函数的调用,函数可达。 核查4(触发可满足):触发条件为 left_cnt*sizeof(T)<256(第390行),当总数据量非块对齐时常见满足,触发可满足。 四项均成立,确认缺陷。
Source(问题源头) autofuse/ascendc/api/compare.h:367 行 const uint32_t cal_cnt 作为函数入参传入(外部决定计算量大小,决定 cnt 累积上限)
Source(问题源头)
autofuse/ascendc/api/compare.h:367 行 const uint32_t cal_cnt 作为函数入参传入(外部决定计算量大小,决定 cnt 累积上限)
Sink(问题爆发点) autofuse/ascendc/api/compare.h:394 行 CompareScalar(compare_out[0], src_tmp[cnt], ...) 使用 src_tmp[cnt] 作为源操作数(cnt 为源 tensor 偏移而非临时缓冲区偏移,越界访问 sink)
Sink(问题爆发点)
autofuse/ascendc/api/compare.h:394 行 CompareScalar(compare_out[0], src_tmp[cnt], ...) 使用 src_tmp[cnt] 作为源操作数(cnt 为源 tensor 偏移而非临时缓冲区偏移,越界访问 sink)
传播路径:
可达调用链1 起点:(entry functions) → 终点:CompareScalarExtend 深度:0
(entry functions)
CompareScalarExtend
CompareScalar(compare_out[0], src_tmp[0], constant_y, mode, 256 / sizeof(T));
你好,感谢建议, 后续分析处理
缺陷信息
缺陷描述
在 CompareScalarExtend 函数第394行,CompareScalar 的源操作数使用了 src_tmp[cnt],但数据在第392行通过 DataCopy(src_tmp[0], src[cnt], left_cnt) 被复制到了 src_tmp[0]。cnt 是源 tensor 的累计偏移量(在循环中每轮累加 max_block_cnt),而非临时缓冲区 src_tmp 的偏移量。当 cnt 超过 src_tmp 的有效大小时(src_tmp 是 tmp_buf 的子视图,大小受限于 UB 缓冲区),src_tmp[cnt] 构成数组越界访问。正确写法应为 src_tmp[0]。
事实核查
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:CompareScalarExtend深度:0修复建议
CompareScalar(compare_out[0], src_tmp[0], constant_y, mode, 256 / sizeof(T));