在 aclfftFft1DStride 函数第 137 行,表达式 n * s0 * sizeof(float) * 4 的 size_t 结果被赋值给 uint32_t kernelWorkspaceSize。当 n=262144(switch 语句中有效的 case)且 stride>=1024(ComputeS0 返回 s0=1024)时,结果为 262144*1024*4*4=2^32=4294967296,截断为 0,导致后续 aclrtMalloc 分配的工作区大小严重不足(仅 sysWorkspaceSize),内核写入时将发生缓冲区溢出。
经复核源代码确认:fft1_d_stride.cpp:45 形参 uint32_t n, uint32_t stride;第132行 uint32_t s0 = ComputeS0(n, stride);第137行 uint32_t kernelWorkspaceSize = n * s0 * sizeof(float) * 4。表达式求值:n*s0 为 uint32_t(262144*1024=268435456,未溢出 uint32_t),随后 *sizeof(float)(size_t=4) 提升为 size_t,再 *4 得 size_t=4294967296(2^32),赋值给 uint32_t kernelWorkspaceSize 时截断为 0。第140行 totalWorkspaceSize = 0 + sysWorkspaceSize,第151行 aclrtMalloc(&dev_workspace, totalWorkspaceSize, ...) 仅分配近 0 空间,内核按 n*s0*4 需 4GB 写入必然缓冲区溢出。触发条件可达:n=262144 是 switch 有效分支(第86-87行 case 262144),ComputeS0 在 stride>=1024 时返回 s0=1024(第34-35行 else 分支),stride 无上界校验。调用链可达:fft1_d_exec_api.cpp:53 aclfftExecC2C_1D 第73行 if(impl->stride[0] > 1) 第74行调用 aclfftFft1DStride。缺陷模式属实,触发输入可达,fix_code 改用 size_t 正确。
Source(污点源) src/fft1_d/arch32/fft1_d_exec_api.cpp:60 行 const uint32_t n = impl->lengths[0] —— n 来自用户 FFT plan,可取值 262144(entry_callchain 起点)
Source(污点源)
src/fft1_d/arch32/fft1_d_exec_api.cpp:60 行 const uint32_t n = impl->lengths[0] —— n 来自用户 FFT plan,可取值 262144(entry_callchain 起点)
Sink(污点汇聚点) src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp:151 行 aclrtMalloc(&dev_workspace, totalWorkspaceSize, ...) —— 以截断后近 0 的大小分配工作区,内核需要 4GB 空间导致缓冲区溢出
Sink(污点汇聚点)
src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp:151 行 aclrtMalloc(&dev_workspace, totalWorkspaceSize, ...) —— 以截断后近 0 的大小分配工作区,内核需要 4GB 空间导致缓冲区溢出
传播路径:
可达调用链1 起点:(entry functions) → 终点:aclfftFft1DStride 深度:1
(entry functions)
aclfftFft1DStride
size_t kernelWorkspaceSize = static_cast<size_t>(n) * static_cast<size_t>(s0) * sizeof(float) * 4; size_t totalWorkspaceSize = kernelWorkspaceSize + sysWorkspaceSize;
已收到问题,我们将尽快修复。
缺陷信息
缺陷描述
在 aclfftFft1DStride 函数第 137 行,表达式 n * s0 * sizeof(float) * 4 的 size_t 结果被赋值给 uint32_t kernelWorkspaceSize。当 n=262144(switch 语句中有效的 case)且 stride>=1024(ComputeS0 返回 s0=1024)时,结果为 262144*1024*4*4=2^32=4294967296,截断为 0,导致后续 aclrtMalloc 分配的工作区大小严重不足(仅 sysWorkspaceSize),内核写入时将发生缓冲区溢出。
详细解释
经复核源代码确认:fft1_d_stride.cpp:45 形参 uint32_t n, uint32_t stride;第132行 uint32_t s0 = ComputeS0(n, stride);第137行 uint32_t kernelWorkspaceSize = n * s0 * sizeof(float) * 4。表达式求值:n*s0 为 uint32_t(262144*1024=268435456,未溢出 uint32_t),随后 *sizeof(float)(size_t=4) 提升为 size_t,再 *4 得 size_t=4294967296(2^32),赋值给 uint32_t kernelWorkspaceSize 时截断为 0。第140行 totalWorkspaceSize = 0 + sysWorkspaceSize,第151行 aclrtMalloc(&dev_workspace, totalWorkspaceSize, ...) 仅分配近 0 空间,内核按 n*s0*4 需 4GB 写入必然缓冲区溢出。触发条件可达:n=262144 是 switch 有效分支(第86-87行 case 262144),ComputeS0 在 stride>=1024 时返回 s0=1024(第34-35行 else 分支),stride 无上界校验。调用链可达:fft1_d_exec_api.cpp:53 aclfftExecC2C_1D 第73行 if(impl->stride[0] > 1) 第74行调用 aclfftFft1DStride。缺陷模式属实,触发输入可达,fix_code 改用 size_t 正确。
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:aclfftFft1DStride深度:1修复建议
size_t kernelWorkspaceSize = static_cast<size_t>(n) * static_cast<size_t>(s0) * sizeof(float) * 4; size_t totalWorkspaceSize = kernelWorkspaceSize + sysWorkspaceSize;