已关闭
【缺陷报告】空指针解引用 - 文件fft1_d_c2c_mix.cpp - 函数aclfftFft1DC2CMix - 行号181 #52
zhangjunkai9创建于  7 天前关闭于  6 天前
zhangjunkai9
7 天前 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数aclfftFft1DC2CMix
文件ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp
行号181
置信度89%

缺陷描述

函数 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)

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 ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp 112 float *y 作为函数入参接收(ACLFFT_API 导出的公开 API,无空指针校验)
2 ops-fft-master/ops-fft-master/src/fft1_d/arch35/fft1_d_exec_api.cpp 41 aclfftExecC2C_1D 调用 aclfftFft1DC2CMix(reinterpret_cast<float*>(idata), reinterpret_cast<float*>(odata), ...) 将 odata 作为 y 传入(aclfftExecC2C_1D 本身未检查 odata 是否为 NULL)
3 ops-fft-master/ops-fft-master/lib/fft_exec_api.cpp 39 aclfftExecC2C 调度层执行 ACLFFT_CHECK_NULL(odata) 空指针检查(正常路径保证 odata/y 非空,但直接调用 aclfftFft1DC2CMix 可绕过此检查)
4 ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp 181 CHECK_ACL(aclrtMemcpy(y, ...)) 将未校验的 y 传入 aclrtMemcpy 作为目的地址(sink,aclrtMemcpy 内部解引用 y)

调用链

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

# 文件 函数 函数起始行 调用点行
1 ops-fft-master/ops-fft-master/src/fft1_d/arch35/fft1_d_exec_api.cpp aclfftExecC2C_1D 15 41
2 ops-fft-master/ops-fft-master/src/fft1_d/arch35/mix/fft1_d_c2c_mix.cpp aclfftFft1DC2CMix 112

修复建议

if (x == nullptr || y == nullptr) {
    return 1;
}
// 在函数体开头(第114行之后)添加空指针校验,CHECK_ACL 宏仅检查返回值无法防止 aclrtMemcpy 内部解引用 NULL
likedislike
east_yang成员
7 天前 评论:

感谢您的反馈,当前@east_yang跟踪处理中。

likedislike
Ssyy_3597
7 天前 关联了pull request:Fix: 修复8个issue(#41/#42/#50/#52/#53/#56/#59/#60) 构建脚本清理/空指针防护/尺寸截断/UAF
Yyangzhenyu成员
6 天前 issue状态由 进行中 改变为 已解决
Yyangzhenyu成员
6 天前 关闭了 issue
CANN-robotCANN-robot成员
6 天前 添加了label:resolved