函数 aclfftFft1DC2CMix 的入参 y(输出缓冲区指针)在未被做空指针校验的情况下,于第181行直接作为目的地址传入 aclrtMemcpy。该函数通过 ACLFFT_API 宏导出(声明于 fft1_d.h:50),为公开 API,外部代码可直接调用并传入 NULL y。当 y 为 NULL 时,aclrtMemcpy 将向地址 0 写入数据,导致空指针解引用崩溃。虽然经调度层 aclfftExecC2C(lib/fft_exec_api.cpp:39 ACLFFT_CHECK_NULL(odata))的正常调用路径保证了 y 非空,但函数本身作为公开 API 缺少独立的空指针防护。
经复核:核查(1)模式成立——第181行 CHECK_ACL(aclrtMemcpy(y, outputSize, dev_output, outputSize, ACL_MEMCPY_DEVICE_TO_HOST)) 将入参 y 直接作为目的地址传入 aclrtMemcpy,函数体内(114-184行)无空指针校验;
CHECK_ACL 宏(fft_common_core.h:37-45)仅检查 aclrtMemcpy 返回值,不阻止其内部解引用 NULL。
核查(2)无有效防护——函数本身无空指针检查;
调度层 aclfftExecC2C(fft_exec_api.cpp:39) 的 ACLFFT_CHECK_NULL(odata) 仅覆盖经调度的路径,函数经 ACLFFT_API 导出(fft1_d.h:50)可被外部直接调用绕过此检查,防护未覆盖所有触发路径。
核查(3)函数可达——由 aclfftExecC2C_1D(fft1_d_exec_api.cpp:41) 调用。
核查(4)触发无法证实——仓内唯一调用方 aclfftExecC2C_1D 经调度层 ACLFFT_CHECK_NULL(odata) 保证 y 非空,无路径使 y 为 NULL。
属防御性编程缺失:函数为公开 API、外部可控输入(参数 y)直接到达 sink(aclrtMemcpy 解引用 y),对应 confidence 0.89。
Source(问题源头) ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp:112 行 float *y 作为函数入参传入(公开 API,外部可直接传入 NULL)
Source(问题源头)
ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp:112 行 float *y 作为函数入参传入(公开 API,外部可直接传入 NULL)
Sink(问题爆发点) ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp:181 行 CHECK_ACL(aclrtMemcpy(y, outputSize, dev_output, outputSize, ACL_MEMCPY_DEVICE_TO_HOST)) 将未校验的 y 作为目的地址传入 aclrtMemcpy,若 y 为 NULL 则解引用空指针
Sink(问题爆发点)
ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp:181 行 CHECK_ACL(aclrtMemcpy(y, outputSize, dev_output, outputSize, ACL_MEMCPY_DEVICE_TO_HOST)) 将未校验的 y 作为目的地址传入 aclrtMemcpy,若 y 为 NULL 则解引用空指针
传播路径:
可达调用链1 起点:(entry functions) → 终点:aclfftFft1DC2CMix 深度:1
(entry functions)
aclfftFft1DC2CMix
if (x == nullptr || y == nullptr) { return 1; } // 在函数体开头(第114行之后)添加空指针校验,CHECK_ACL 宏仅检查返回值无法防止 aclrtMemcpy 内部解引用 NULL
感谢您的反馈,当前@east_yang跟踪处理中。
缺陷信息
缺陷描述
函数 aclfftFft1DC2CMix 的入参 y(输出缓冲区指针)在未被做空指针校验的情况下,于第181行直接作为目的地址传入 aclrtMemcpy。该函数通过 ACLFFT_API 宏导出(声明于 fft1_d.h:50),为公开 API,外部代码可直接调用并传入 NULL y。当 y 为 NULL 时,aclrtMemcpy 将向地址 0 写入数据,导致空指针解引用崩溃。虽然经调度层 aclfftExecC2C(lib/fft_exec_api.cpp:39 ACLFFT_CHECK_NULL(odata))的正常调用路径保证了 y 非空,但函数本身作为公开 API 缺少独立的空指针防护。
事实核查
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:aclfftFft1DC2CMix深度:1修复建议
if (x == nullptr || y == nullptr) { return 1; } // 在函数体开头(第114行之后)添加空指针校验,CHECK_ACL 宏仅检查返回值无法防止 aclrtMemcpy 内部解引用 NULL