已关闭
【缺陷报告】dataTypeTruncation - 文件fft1_d_stride.cpp - 函数aclfftFft1DStride - 行号137 #26
zhangjunkai9创建于  21 天前关闭于  18 天前
zhangjunkai9
21 天前 创建

缺陷信息

缺陷类型dataTypeTruncation (dataTypeTruncation)
函数aclfftFft1DStride
文件src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp
行号137

缺陷描述

在 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 起点)

Sink(污点汇聚点)

src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp:151 行 aclrtMalloc(&dev_workspace, totalWorkspaceSize, ...) —— 以截断后近 0 的大小分配工作区,内核需要 4GB 空间导致缓冲区溢出

传播路径:

# 文件 行号 说明
1 src/fft1_d/arch32/fft1_d_exec_api.cpp 60 const uint32_t n = impl->lengths[0] —— n 接收用户 plan 中的 FFT 长度(最大 262144)
2 src/fft1_d/arch32/fft1_d_exec_api.cpp 73 if (impl->stride[0] > 1) —— stride > 1 时进入 stride 路径,stride 无上界校验
3 src/fft1_d/arch32/fft1_d_exec_api.cpp 74 aclfftFft1DStride(..., n, impl->stride[0], ...) —— 将 n 和 stride 作为实参传入 aclfftFft1DStride
4 src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp 45 aclfftFft1DStride(float *x, float *y, uint32_t n, uint32_t stride, ...) —— 形参接收 n=262144, stride>=1024
5 src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp 86 case 262144: radixVec = {64, 64, 64} —— n=262144 是 switch 中有效分支,不抛异常
6 src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp 132 uint32_t s0 = ComputeS0(n, stride) —— n=262144 且 stride>=1024 时 s0=1024(ComputeS0 else 分支 line 34-35)
7 src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp 137 uint32_t kernelWorkspaceSize = n * s0 * sizeof(float) * 4 —— 262144*1024*4*4=2^32 截断为 0(uint32_t 赋值截断)
8 src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp 140 uint32_t totalWorkspaceSize = kernelWorkspaceSize + sysWorkspaceSize —— 0 + sysWorkspaceSize,工作区大小严重不足

调用链

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

# 文件 函数 函数起始行 调用点行
1 src/fft1_d/arch32/fft1_d_exec_api.cpp aclfftExecC2C_1D 53 74
2 src/fft1_d/arch32/fft_stride/fft1_d_stride.cpp aclfftFft1DStride 45

修复建议

size_t kernelWorkspaceSize = static_cast<size_t>(n) * static_cast<size_t>(s0) * sizeof(float) * 4;
size_t totalWorkspaceSize = kernelWorkspaceSize + sysWorkspaceSize;
likedislike
east_yang成员
20 天前 评论:

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

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