函数 aclfftFft2DDd 第87行计算 workspaceSize = batches * fftX * fftY * sizeof(float) * 2,其中 batches、fftX、fftY 均为 uint32_t。表达式按左结合求值:batches*fftX(uint32_t)、*fftY(uint32_t)两步在 32 位无符号算术中完成,128*128=16384,当 batches>262144 时 batches*fftX*fftY 超出 uint32_t 范围(2^32)发生回绕,之后才提升为 size_t,导致 workspaceSize 取错误的小值。第100行 aclrtMalloc 用错误 workspaceSize 为 dev_workspace 分配过小空间,内核执行时越界访问。同理第79行 inputSize 计算存在相同的 uint32_t 中间溢出且结果截断为 uint32_t(更严重)。上游调用链中 aclfftPlan2d(lib/fft_plan_api.cpp:76)仅校验 batch>0(无上界),aclfftExecC2C_2D 仅校验 fftX/fftY 属于 {32,64,128}(无 batch 上界),全程无保护。
经独立复核源代码确认:fft2_d_dd.cpp:87 行 uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2,其中 batches、fftX、fftY 均为 uint32_t(函数签名见第63-64行)。表达式按左结合求值:batches*fftX(uint32_t)→ *fftY(uint32_t)在前两步完成 32 位无符号乘法,之后 *sizeof(float) 才提升为 size_t。fftX/fftY 被 aclfftExecC2C_2D 中的 IsDdSize 约束为 {32,64,128}(fft2_d_exec_api.cpp:14,27),最大乘积 128*128=16384=2^14,当 batches>2^32/2^14=262144 时 batches*fftX*fftY 溢出 uint32_t 发生回绕,workspaceSize 取错误小值。同理第79行 inputSize(uint32_t)存在相同溢出且额外截断。第100行 aclrtMalloc 用错误 workspaceSize 分配 dev_workspace 过小空间。调用链可达性已验证:公共 API aclfftExecC2C(lib/fft_exec_api.cpp:44-45)按 rank==2 分发到 aclfftExecC2C_2D(fft2_d_exec_api.cpp:17),后者第34行调用 aclfftFft2DDd。上游 aclfftPlan2d(fft_plan_api.cpp:71-76)仅校验 batch>0、nx>0、ny>0(下界),impl->batch 为 int32_t(fft_handle_impl.h:28),全程无上界约束,用户可传入 batch=300000 触发溢出。缺陷真实存在。
uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2
Source(污点源) lib/fft_plan_api.cpp:76 行 ACLFFT_CHECK_PARAM(batch > 0, ACLFFT_INVALID_SIZE) aclfftPlan2d 仅校验 batch>0(下界),无上界检查,用户可传入任意大正整数作为 batch
Source(污点源)
lib/fft_plan_api.cpp:76 行 ACLFFT_CHECK_PARAM(batch > 0, ACLFFT_INVALID_SIZE) aclfftPlan2d 仅校验 batch>0(下界),无上界检查,用户可传入任意大正整数作为 batch
Sink(污点汇聚点) src/fft2_d/arch32/dd/fft2_d_dd.cpp:87 行 uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2 batches*fftX*fftY 先在 uint32_t 中间运算溢出(batches>262144、fftX=fftY=128 时),之后才提升为 size_t,workspaceSize 取错误回绕值
Sink(污点汇聚点)
src/fft2_d/arch32/dd/fft2_d_dd.cpp:87 行 uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2 batches*fftX*fftY 先在 uint32_t 中间运算溢出(batches>262144、fftX=fftY=128 时),之后才提升为 size_t,workspaceSize 取错误回绕值
传播路径:
可达调用链1 起点:(entry functions) → 终点:aclfftFft2DDd 深度:1
(entry functions)
aclfftFft2DDd
size_t inputSize = static_cast<size_t>(batches) * fftX * fftY * sizeof(float) * 2; size_t outputSize = inputSize; // ... uint64_t workspaceSize = static_cast<uint64_t>(batches) * fftX * fftY * sizeof(float) * 2;
已收到问题,我们将尽快修复。
缺陷信息
缺陷描述
函数 aclfftFft2DDd 第87行计算 workspaceSize = batches * fftX * fftY * sizeof(float) * 2,其中 batches、fftX、fftY 均为 uint32_t。表达式按左结合求值:batches*fftX(uint32_t)、*fftY(uint32_t)两步在 32 位无符号算术中完成,128*128=16384,当 batches>262144 时 batches*fftX*fftY 超出 uint32_t 范围(2^32)发生回绕,之后才提升为 size_t,导致 workspaceSize 取错误的小值。第100行 aclrtMalloc 用错误 workspaceSize 为 dev_workspace 分配过小空间,内核执行时越界访问。同理第79行 inputSize 计算存在相同的 uint32_t 中间溢出且结果截断为 uint32_t(更严重)。上游调用链中 aclfftPlan2d(lib/fft_plan_api.cpp:76)仅校验 batch>0(无上界),aclfftExecC2C_2D 仅校验 fftX/fftY 属于 {32,64,128}(无 batch 上界),全程无保护。
详细解释
经独立复核源代码确认:fft2_d_dd.cpp:87 行
uint64_t workspaceSize = batches * fftX * fftY * sizeof(float) * 2,其中 batches、fftX、fftY 均为 uint32_t(函数签名见第63-64行)。表达式按左结合求值:batches*fftX(uint32_t)→ *fftY(uint32_t)在前两步完成 32 位无符号乘法,之后 *sizeof(float) 才提升为 size_t。fftX/fftY 被 aclfftExecC2C_2D 中的 IsDdSize 约束为 {32,64,128}(fft2_d_exec_api.cpp:14,27),最大乘积 128*128=16384=2^14,当 batches>2^32/2^14=262144 时 batches*fftX*fftY 溢出 uint32_t 发生回绕,workspaceSize 取错误小值。同理第79行 inputSize(uint32_t)存在相同溢出且额外截断。第100行 aclrtMalloc 用错误 workspaceSize 分配 dev_workspace 过小空间。调用链可达性已验证:公共 API aclfftExecC2C(lib/fft_exec_api.cpp:44-45)按 rank==2 分发到 aclfftExecC2C_2D(fft2_d_exec_api.cpp:17),后者第34行调用 aclfftFft2DDd。上游 aclfftPlan2d(fft_plan_api.cpp:71-76)仅校验 batch>0、nx>0、ny>0(下界),impl->batch 为 int32_t(fft_handle_impl.h:28),全程无上界约束,用户可传入 batch=300000 触发溢出。缺陷真实存在。数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:aclfftFft2DDd深度:1修复建议
size_t inputSize = static_cast<size_t>(batches) * fftX * fftY * sizeof(float) * 2; size_t outputSize = inputSize; // ... uint64_t workspaceSize = static_cast<uint64_t>(batches) * fftX * fftY * sizeof(float) * 2;