已关闭
【缺陷报告】整数溢出 - 文件irfft1_d_fft.cpp - 函数aclfftIrfft1DFft - 行号144 #34
zhangjunkai9创建于  20 天前关闭于  18 天前
zhangjunkai9
20 天前 创建

缺陷信息

缺陷类型integerOverflow (整数溢出)
函数aclfftIrfft1DFft
文件src/irfft1_d/arch35/fft/irfft1_d_fft.cpp
行号144

缺陷描述

函数 aclfftIrfft1DFft 第144行计算 inputSize = batches * (n / 2 + 1) * sizeof(float) * 2,其中 batches 和 n 均为 uint32_t。表达式按左结合求值:batches*(n/2+1) 先在 uint32_t 算术中完成,当 n 和 batches 较大时溢出 uint32_t(如 n=65536、batches=131073 时 131073*32769>2^32),之后才提升为 size_t,且最终截断存入 uint32_t inputSize。溢出导致 inputSize 取错误值,第160行 aclrtMalloc 分配过小缓冲区,第176行 aclrtMemcpy 及内核访问越界。同理第145行 outputSize=batches*n*sizeof(float)、第149行 workspaceSize=2*batches*n*sizeof(float)*2 也存在相同溢出。上游 aclfftPlan1d(lib/fft_plan_api.cpp:47)仅校验 nx>0、batch>0(无上界),aclfftExecC2R_1D(arch35) 仅在 n>1024 且 radix==K_RADIX_MIX 时进入此路径(无上界),全程无保护。

详细解释

经复核源代码确认,第110行函数形参 n 和 batches 均为 uint32_t,第144行 inputSize = batches * (n / 2 + 1) * sizeof(float) * 2 按左结合求值,子表达式 batches*(n/2+1) 先在 uint32_t 算术中完成(可溢出,如 n=65536、batches=131073 时 131073*32769=4295541537>2^32),之后才提升为 size_t,最终截断存入 uint32_t inputSize。第145行 outputSize 和第149行 workspaceSize 存在相同溢出模式。溢出后的 inputSize 直接用于第160行 aclrtMalloc 分配设备内存和第176行 aclrtMemcpy 拷贝,导致分配过小、拷贝大小不匹配、内核越界访问。调用链经复核确认:irfft1_d_exec_api.cpp:15 定义 aclfftExecC2R_1D,第21-22行从 plan 读取 n 和 batch(int32_t 转 uint32_t 无上界校验),第38-41行在 n>1024 且 radix==K_RADIX_MIX 时调用 aclfftIrfft1DFft。上游 fft_plan_api.cpp:46-47 仅校验 nx>0、batch>0 无上界。缺陷真实存在且可达。

数据流证据

Source(污点源)

lib/fft_plan_api.cpp:47 行 ACLFFT_CHECK_PARAM(batch > 0, ACLFFT_INVALID_SIZE) aclfftPlan1d 仅校验 batch>0、nx>0(下界),无上界检查

Sink(污点汇聚点)

src/irfft1_d/arch35/fft/irfft1_d_fft.cpp:144 行 const uint32_t inputSize = batches * (n / 2 + 1) * sizeof(float) * 2 batches*(n/2+1) 在 uint32_t 中间运算溢出后才提升为 size_t,且截断存入 uint32_t

传播路径:

# 文件 行号 说明
1 lib/fft_plan_init_api.cpp 86-87 impl->lengths[0] = nx; impl->batch = batch n 和 batch 存入 handle(int32_t),无上界约束
2 src/irfft1_d/arch35/irfft1_d_exec_api.cpp 21-22 const uint32_t n = impl->lengths[0]; const uint32_t batch = impl->batch 从 handle 读取 n 和 batch(int32_t 转 uint32_t,无上界校验)
3 src/irfft1_d/arch35/irfft1_d_exec_api.cpp 39-41 aclfftIrfft1DFft(..., n, irfft_norm, batch, ...) 将 n 和 batch 传入 sink 函数(n>1024 且 radix==K_RADIX_MIX 时进入此路径,无上界)
4 src/irfft1_d/arch35/fft/irfft1_d_fft.cpp 110-111 uint32_t n, ..., uint32_t batches 作为函数形参接收,函数内无范围校验
5 src/irfft1_d/arch35/fft/irfft1_d_fft.cpp 144 const uint32_t inputSize = batches * (n / 2 + 1) * sizeof(float) * 2 batches*(n/2+1) 在 uint32_t 中溢出后才提升为 size_t,且截断存入 uint32_t(危险操作 sink)
6 src/irfft1_d/arch35/fft/irfft1_d_fft.cpp 160 CHECK_ACL(aclrtMalloc(&dev_input, inputSize, ...)) 使用溢出后的错误 inputSize 分配过小缓冲区

调用链

可达调用链1 起点:(entry functions) → 终点:aclfftIrfft1DFft 深度:1

# 文件 函数 函数起始行 调用点行
1 src/irfft1_d/arch35/irfft1_d_exec_api.cpp aclfftExecC2R_1D 15 39
2 src/irfft1_d/arch35/fft/irfft1_d_fft.cpp aclfftIrfft1DFft 110

修复建议

const size_t inputSize = static_cast<size_t>(batches) * (n / 2 + 1) * sizeof(float) * 2;
const size_t outputSize = static_cast<size_t>(batches) * n * sizeof(float);
const size_t workspaceSize = 2 * static_cast<size_t>(batches) * n * sizeof(float) * 2;
likedislike
east_yang成员
20 天前 评论:

已收到问题,我们将尽快修复。

likedislike
CANN-robotCANN-robot成员
18 天前 关闭了 issue
CANN-robotCANN-robot成员
17 天前 添加了label:resolved