已关闭
【缺陷报告】空指针解引用 - 文件ascir_api_perf_v2.cpp - 函数NddmaApi - 行号129 #272
zhangjunkai9创建于  10 天前关闭于  4 天前
zhangjunkai9
10 天前 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数NddmaApi
文件autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp
行号129
置信度86%

缺陷描述

函数 NddmaApi 在第123行从入参 node.node_ptr 获取 node_ptr(shared_ptr,可能为空)。第126行通过三元表达式 node_ptr != nullptr ? node_ptr->GetName() : "NddmaNode" 处理了 nullptr 情况,明确表明开发者认为 node_ptr 可能为空。但第129行 dma_info.optype = node_ptr->GetType() 无条件解引用 node_ptr,未做空指针校验。关键在于:MergeTensorContinuousDims(内部有 GE_ASSERT_NOTNULL(node) 空检查)在第138行才被调用,位于第129行之后,无法保护第129行的解引用。该函数为入口函数(entry_callchain depth=0),可达。

事实核查

核查1模式成立:第123行获取 node_ptr(shared_ptr),第126行三元表达式 node_ptr != nullptr ? node_ptr->GetName() : "NddmaNode" 显式处理 nullptr,表明开发者认为 node_ptr 可能为空,但第129行 dma_info.optype = node_ptr->GetType() 无条件解引用,模式成立。
核查2无有效防护:第126行三元仅保护 name 赋值,不覆盖第129行;MergeTensorContinuousDims 内部的 GE_ASSERT_NOTNULL 在第138行,位于第129行之后无法保护。
核查3函数可达:entry_callchain depth=0,通过 REGISTER_EVAL_FUNC_TAG(kNddma, V2, ...) 注册为入口函数。
核查4触发条件有间接证据但未确证:同文件 GetNddmaVectorizedAxis(第23-24行 if (node == nullptr ...))处理 nullptr,ascir_reduce_api_perf_v2.cpp:61 有 GE_ASSERT_NOTNULL(node.node_ptr),多处信号表明 node_ptr 可能为空,但无法从框架侧确认具体传入 null 的路径。
属假设性·调用方实参存在模糊,上游有间接未确证路径→confidence 0.86

数据流证据

Source(问题源头)

autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp:123 行 auto const &node_ptr = node.node_ptr 从函数入参 NodeInfo.node_ptr 获取(shared_ptr,可能为空)

Sink(问题爆发点)

autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp:129 行 dma_info.optype = node_ptr->GetType() 无条件解引用 node_ptr(空指针解引用 sink)

传播路径:

# 文件 行号 说明
1 autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp 120-122 NddmaApi 函数入参 const NodeInfo &node 接收(entry_callchain depth=0,可达)
2 autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp 123 auto const &node_ptr = node.node_ptr 从 NodeInfo 获取 shared_ptr(可能为空)
3 autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp 126 std::string node_name = node_ptr != nullptr ? node_ptr->GetName() : "NddmaNode" 三元表达式处理 nullptr(证明开发者认为 node_ptr 可能为空)
4 autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp 129 dma_info.optype = node_ptr->GetType() 无条件解引用(sink,在 MergeTensorContinuousDims 空检查之前)
5 autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp 138 GE_ASSERT_SUCCESS(MergeTensorContinuousDims(node_ptr, ...)) MergeTensorContinuousDims 内部有 GE_ASSERT_NOTNULL(node) 空检查,但位于第129行之后,无法保护第129行

调用链

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

# 文件 函数 函数起始行 调用点行
1 autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp:att::ascir_v2: NddmaApi 120

修复建议

auto const &node_ptr = node.node_ptr;
GE_ASSERT_TRUE(!input_shapes.empty());
GE_ASSERT_TRUE(!output_shapes.empty());
GE_ASSERT_NOTNULL(node_ptr, "NddmaApi node_ptr is null");
std::string node_name = node_ptr != nullptr ? node_ptr->GetName() : "NddmaNode";
NodeDetail dma_info;
dma_info.name = node_name;
dma_info.optype = node_ptr->GetType();
likedislike
Wwangmingming成员
10 天前 将 gcw_V3YyYBt1 设为负责人
wangmingming成员
10 天前 评论:

你好,感谢建议, 后续分析处理

likedislike
Ggaoxin成员
9 天前 关联了pull request:fix: 修复 Issue #261-#276 安全加固缺陷
CANN-robotCANN-robot成员
4 天前 关闭了 issue
CANN-robotCANN-robot成员
4 天前 添加了label:resolved