已关闭
【缺陷报告】空指针解引用 - 文件fft1_d_exec_api.cpp - 函数aclfftExecC2C_1D - 行号58 #50
zhangjunkai9创建于  5 天前关闭于  5 天前
zhangjunkai9
5 天前 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数aclfftExecC2C_1D
文件ops-fft-master/ops-fft-master/src/fft1_d/arch32/fft1_d_exec_api.cpp
行号58
置信度89%

缺陷描述

函数 aclfftExecC2C_1D(arch32)的入参 plan 赋值给 impl 后,在第58行通过 ACLFFT_CHECK_PARAM 宏直接解引用 impl->rank,未对 plan/impl 做空指针校验。ACLFFT_CHECK_PARAM 宏展开为 do { if(!(condition)) { return error_code; } } while(0),条件表达式 impl->rank == 1 在 if 判断前被求值,即 impl->rank 被解引用。aclfftHandle 是指向 aclfftHandle_t 的指针类型(typedef struct aclfftHandle_t* aclfftHandle),NULL 是合法值。该函数为 extern "C" 公共 API,外部调用方可能传入 NULL plan,导致空指针解引用崩溃。

事实核查

经核查确认缺陷为防御性编程缺失。

(1)模式核查:第57行aclfftHandle_t* impl=plan无空指针检查,第58行ACLFFT_CHECK_PARAM(impl->rank==1,...)宏展开(fft_error.h:25)为if(!(impl->rank==1)),求值impl->rank时通过->解引用impl,若plan为NULL则空指针解引用,模式成立。

(2)防护核查:函数内无ACLFFT_CHECK_NULL(plan)调用(该宏在fft_error.h:48定义且在lib/fft_exec_api.cpp:37等函数中使用),无有效防护。

(3)函数可达性核查:该函数为extern "C"公共API,entry_callchain depth=0确认为入口函数,函数可达。

(4)触发可达性核查:plan为extern "C" API入参,外部调用方可直接传入NULL;

仓内正常调用方aclfftExecC2C(lib/fft_exec_api.cpp:37)通过ACLFFT_CHECK_PLAN_INITIALIZED校验plan后再调用,但arch32版本作为extern "C"弱符号(__attribute__((weak)))可被外部直接调用,触发条件广、外部可控输入直接到达sink,属防御性缺失·触发条件广,对应confidence 0.89。

数据流证据

Source(问题源头)

ops-fft-master/ops-fft-master/src/fft1_d/arch32/fft1_d_exec_api.cpp:53 行 aclfftHandle plan 作为函数入参传入(extern "C" 公共 API,外部输入,可能为 NULL)

Sink(问题爆发点)

ops-fft-master/ops-fft-master/src/fft1_d/arch32/fft1_d_exec_api.cpp:58 行 ACLFFT_CHECK_PARAM(impl->rank == 1, ACLFFT_INVALID_VALUE) 宏展开为 if(!(impl->rank == 1)),求值 impl->rank 时通过 -> 运算符解引用 impl(空指针解引用 sink)

传播路径:

# 文件 行号 说明
1 ops-fft-master/ops-fft-master/src/fft1_d/arch32/fft1_d_exec_api.cpp 53 aclfftHandle plan 作为 extern "C" 函数入参接收(无空指针校验,entry_callchain depth=0 确认可达)
2 ops-fft-master/ops-fft-master/src/fft1_d/arch32/fft1_d_exec_api.cpp 57 aclfftHandle_t* impl = plan 将 plan 直接赋值给 impl(别名变换,无空检查)
3 ops-fft-master/ops-fft-master/src/fft1_d/arch32/fft1_d_exec_api.cpp 58 ACLFFT_CHECK_PARAM(impl->rank == 1, ...) 宏展开后 impl->rank 被求值,通过 ptr->member 模式解引用 impl(sink)

调用链

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

# 文件 函数 函数起始行 调用点行
1 ops-fft-master/ops-fft-master/src/fft1_d/arch32/fft1_d_exec_api.cpp aclfftExecC2C_1D 53

修复建议

ACLFFT_CHECK_NULL(plan);
aclfftHandle_t* impl = plan;
ACLFFT_CHECK_PARAM(impl->rank == 1, ACLFFT_INVALID_VALUE);
likedislike
east_yang成员
5 天前 评论:

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

likedislike
Yyangzhenyu成员
5 天前 将 yanghhu 设为负责人
Ssyy_3597
5 天前 关联了pull request:Fix: 修复8个issue(#41/#42/#50/#52/#53/#56/#59/#60) 构建脚本清理/空指针防护/尺寸截断/UAF
Yyangzhenyu成员
5 天前 issue状态由 进行中 改变为 已解决
Yyangzhenyu成员
5 天前 关闭了 issue
CANN-robotCANN-robot成员
5 天前 添加了label:resolved
2301_821464832301_82146483
4 天前 关联了pull request:fix(arch32/arch35): 补全 fft2_d/rfft1_d/irfft1_d 空指针防御性校验