已关闭
【缺陷报告】数组索引越界 - 文件kernel_operator_data_copy_impl.h - 函数DataCopySliceUB2GMImpl - 行号563 #1542
zhangjunkai9创建于  8月19日关闭于  8月19日
zhangjunkai9
8月19日 创建

缺陷信息

缺陷类型arrayIndexOutOfBounds (数组索引越界)
函数DataCopySliceUB2GMImpl
文件impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h
行号563

缺陷描述

DataCopySliceUB2GMImpl 中偏移量累积公式 offsetSrc = offsetSrc + i * (blockLen * ONE_BLK_SIZE + srcStride) 存在与 DataCopySliceGm2UBImpl 相同的错误:每次迭代累加 i*stride 导致三角数增长,当 blockCount>=3 时偏移量超出预期,导致 dst + offsetDst/sizeof(T) 和 src + offsetSrc/sizeof(T) 指针越界访问。

数据流证据

Source(问题源头)

impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h:559-560 行 uint32_t offsetSrc = 0; uint32_t offsetDst = 0 初始化偏移量

Sink(问题爆发点)

impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h:564 行 DataCopyUB2GMImpl(dst + offsetDst / sizeof(T), src + offsetSrc / sizeof(T), ...) 使用错误累积的偏移量进行指针算术,导致越界访问

传播路径:

# 文件 行号 说明
1 impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h 561 for (uint32_t i = 0; i < intriParams.blockCount; i++) 循环变量 i 从0递增
2 impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h 562 offsetSrc = offsetSrc + i * (blockLen * ONE_BLK_SIZE + srcStride) 错误累积:三角数增长
3 impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h 563 offsetDst = offsetDst + i * (blockLen * ONE_BLK_SIZE + dstStride) 同样错误累积
4 impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h 564 dst + offsetDst/sizeof(T) 和 src + offsetSrc/sizeof(T) 使用错误偏移量进行越界指针算术(sink)

修复建议

for (uint32_t i = 0; i < intriParams.blockCount; i++) {
    offsetSrc += intriParams.blockLen * ONE_BLK_SIZE + intriParams.srcStride;
    offsetDst += intriParams.blockLen * ONE_BLK_SIZE + intriParams.dstStride;
    DataCopyUB2GMImpl(dst + offsetDst / sizeof(T), src + offsetSrc / sizeof(T), {1, intriParams.blockLen, 0, 0});
}
likedislike
shaonaiteshaonaite成员
8月19日 将 zhudi22 设为负责人
Wwangrulong成员
8月19日 关联了pull request:偏移量累积公式修复
CANN-robotCANN-robot成员
8月19日 关闭了 issue
CANN-robotCANN-robot成员
8月19日 添加了label:resolved