函数 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,可能为空)
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)
Sink(问题爆发点)
autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp:129 行 dma_info.optype = node_ptr->GetType() 无条件解引用 node_ptr(空指针解引用 sink)
传播路径:
可达调用链1 起点:(entry functions) → 终点:att::ascir_v2::NddmaApi 深度:0
(entry functions)
att::ascir_v2::NddmaApi
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();
你好,感谢建议, 后续分析处理
缺陷信息
缺陷描述
函数 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 起点:
(entry functions)→ 终点:att::ascir_v2::NddmaApi深度:0修复建议
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();