函数 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(下界),无上界检查
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
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 起点:(entry functions) → 终点:aclfftIrfft1DFft 深度:1
(entry functions)
aclfftIrfft1DFft
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;
已收到问题,我们将尽快修复。
缺陷信息
缺陷描述
函数 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 无上界。缺陷真实存在且可达。
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:aclfftIrfft1DFft深度:1修复建议
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;