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 初始化偏移量
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), ...) 使用错误累积的偏移量进行指针算术,导致越界访问
Sink(问题爆发点)
impl/basic_api/dav_l311/kernel_operator_data_copy_impl.h:564 行 DataCopyUB2GMImpl(dst + offsetDst / sizeof(T), src + offsetSrc / sizeof(T), ...) 使用错误累积的偏移量进行指针算术,导致越界访问
传播路径:
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}); }
缺陷信息
缺陷描述
DataCopySliceUB2GMImpl 中偏移量累积公式 offsetSrc = offsetSrc + i * (blockLen * ONE_BLK_SIZE + srcStride) 存在与 DataCopySliceGm2UBImpl 相同的错误:每次迭代累加 i*stride 导致三角数增长,当 blockCount>=3 时偏移量超出预期,导致 dst + offsetDst/sizeof(T) 和 src + offsetSrc/sizeof(T) 指针越界访问。
数据流证据
传播路径:
修复建议
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}); }