在 aclfftRfft1D 函数第322行,表达式 ((n/2)+1)*2*batches*sizeof(float) 中 ((n/2)+1)*2*batches 先以 uint32_t 运算(可能溢出),后 sizeof(float) 提升至 size_t,最终赋值给 uint32_t outputSize 截断。调用链中 n 被 aclfftExecR2C_1D 约束为 ≤4096 且函数内 n>4096 时提前返回,但 batches 无上界校验(最大 INT32_MAX≈21亿)。当 batches>262077 时 2049*2*batches*4 超过 UINT32_MAX,导致 aclrtMalloc 分配内存不足。
核查1(缺陷模式): 第322行 const uint32_t outputSize = ((n / RFFT_SYMMETRY_DIVISOR) + 1) * COMPLEX_PART * batches * sizeof(float),n/batches 为 uint32_t,RFFT_SYMMETRY_DIVISOR 和 COMPLEX_PART 均为 uint32_t 常量,((n/2)+1)*2*batches 先以 uint32_t 运算可能溢出,后 sizeof(float) 提升至 size_t,最终赋值给 uint32_t 截断,模式成立。
核查2(防护有效性): 函数内第308行 if(n>DFT_BORDER_VALUE) return 仅约束 n<=4096,aclfftExecR2C_1D(rfft1_d_exec_api.cpp:46) 仅约束 n<=4096,均未约束 batches,无有效防护。
核查3(函数可达性): aclfftExecR2C_1D 在 rfft1_d_exec_api.cpp:47 调用 aclfftRfft1D,函数可达。
核查4(触发可达性): batch 为公共 API aclfftMakePlan1d 的用户可控参数(ACLFFT_API 导出),仅校验>0 无上界,当 batches>262077 时 2049*2*batches*4 超过 UINT32_MAX 触发截断;
仓内测试数据仅使用 batch=1/4/100,无内部调用方传入大 batch,触发条件在当前代码仓内无法证实满足。
属防御性编程缺失,外部可控输入直接到达 sink,触发条件广,对应 confidence 0.89
Source(问题源头) ops-fft-master/ops-fft-master/lib/fft_plan_init_api.cpp:94 行 impl->lengths[0] = nx 与 :95 行 impl->batch = batch 作为 plan 入参存储(int32_t,仅校验 >0,无上界约束)
Source(问题源头)
ops-fft-master/ops-fft-master/lib/fft_plan_init_api.cpp:94 行 impl->lengths[0] = nx 与 :95 行 impl->batch = batch 作为 plan 入参存储(int32_t,仅校验 >0,无上界约束)
Sink(问题爆发点) ops-fft-master/ops-fft-master/src/rfft1_d/arch35/fast_dft/rfft1_d_fast_dft.cpp:322 行 const uint32_t outputSize = ((n / 2) + 1) * 2 * batches * sizeof(float) 将 size_t 结果赋值给 uint32_t(截断 sink)
Sink(问题爆发点)
ops-fft-master/ops-fft-master/src/rfft1_d/arch35/fast_dft/rfft1_d_fast_dft.cpp:322 行 const uint32_t outputSize = ((n / 2) + 1) * 2 * batches * sizeof(float) 将 size_t 结果赋值给 uint32_t(截断 sink)
传播路径:
可达调用链1 起点:(entry functions) → 终点:aclfftRfft1D 深度:1
(entry functions)
aclfftRfft1D
const size_t outputSize = (static_cast<size_t>(n / 2) + 1) * 2ULL * static_cast<size_t>(batches) * sizeof(float);
感谢您的反馈,当前@east_yang跟踪处理中。
缺陷信息
缺陷描述
在 aclfftRfft1D 函数第322行,表达式 ((n/2)+1)*2*batches*sizeof(float) 中 ((n/2)+1)*2*batches 先以 uint32_t 运算(可能溢出),后 sizeof(float) 提升至 size_t,最终赋值给 uint32_t outputSize 截断。调用链中 n 被 aclfftExecR2C_1D 约束为 ≤4096 且函数内 n>4096 时提前返回,但 batches 无上界校验(最大 INT32_MAX≈21亿)。当 batches>262077 时 2049*2*batches*4 超过 UINT32_MAX,导致 aclrtMalloc 分配内存不足。
事实核查
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:aclfftRfft1D深度:1修复建议
const size_t outputSize = (static_cast<size_t>(n / 2) + 1) * 2ULL * static_cast<size_t>(batches) * sizeof(float);