已关闭
【缺陷报告】空指针解引用 - 文件readable_dump.h - 函数ReadableDump::OutputHandler::GenNodeToOutputsMap - 行号78 #271
zhangjunkai9创建于  28 天前关闭于  23 天前
zhangjunkai9
28 天前 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数ReadableDump::OutputHandler::GenNodeToOutputsMap
文件autofuse/inc/graph_metadef/graph/utils/readable_dump.h
行号78
置信度86%

缺陷描述

GenNodeToOutputsMap 在行78执行 node->GetOpDesc()->GetType(),未对 GetOpDesc() 返回值做空指针校验。经查 Node::NodeImpl::GetOpDesc()(node.cc:693-695)直接返回成员 op_(OpDescPtr),而同文件 UpdateOpDesc(行702)检查 op_!=nullptr 佐证 op_ 可能为 nullptr。其他代码(schedule_result.h:91,98,114)也显式检查 GetOpDesc()==nullptr,说明 GetOpDesc() 返回 nullptr 是真实场景。GenReadableDump 从 graph_utils.cc:1353 和 graph.cc:1043 可达,构成真实缺陷。

事实核查

核查1(模式):第78行 node->GetOpDesc()->GetType() 确实未对 GetOpDesc() 返回值做空指针校验,模式成立。
核查2(防护):GenNodeToOutputsMap 内部无防护;同文件 GenReadableDump 第58行有 GE_ASSERT_NOTNULL(node->GetOpDesc()) 检查,但该检查位于第52行 GenNodeToOutputsMap 调用之后的第二轮循环,无法保护第78行的解引用。
AddNode/AddNodeFront(compute_graph.cc:925-930,784-789)在图构建时检查 GetOpDescBarePtr()==nullptr 并拒绝添加,提供上游防护,但同函数第58行的检查表明开发者认为 nullptr 场景仍可能发生(可能存在反序列化等绕过 AddNode 的路径)。
核查3(可达):GenReadableDump(readable_dump.cc:52)调用 GenNodeToOutputsMap,从 graph_utils.cc:1353 和 graph.cc:1043 可达。
核查4(触发):AddNode 检查阻止了标准路径下 nullptr op_ 节点入图,但同函数第58行的防御性检查暗示存在未确证的间接路径。
属假设性缺陷,上游有间接未确证路径,对应 confidence 0.86。

数据流证据

Source(问题源头)

autofuse/graph_metadef/graph/normal_graph/node.cc:693-695 行 OpDescPtr Node::NodeImpl::GetOpDesc() const { return op_; } op_ 成员可能为 nullptr

Sink(问题爆发点)

autofuse/inc/graph_metadef/graph/utils/readable_dump.h:78 行 node->GetOpDesc()->GetType() 对可能为 nullptr 的 GetOpDesc() 返回值调用 ->GetType(),空指针解引用

传播路径:

# 文件 行号 说明
1 autofuse/inc/graph_metadef/graph/utils/readable_dump.h 77 for (const auto &node : graph->GetDirectNode()) 遍历图中节点
2 autofuse/inc/graph_metadef/graph/utils/readable_dump.h 78 node->GetOpDesc() 获取节点的 OpDesc,返回 OpDescPtr(shared_ptr
3 autofuse/graph_metadef/graph/normal_graph/node.cc 693-695 GetOpDesc() 返回 op_ 成员,op_ 可能为 nullptr(同文件 UpdateOpDesc 行702 检查 op_!=nullptr 佐证)
4 autofuse/common/schedule_result.h 91,98,114 其他调用方显式检查 node.GetOpDesc()==nullptr,确认 nullptr 返回是真实场景
5 autofuse/inc/graph_metadef/graph/utils/readable_dump.h 78 ->GetType() 直接对未校验的 GetOpDesc() 返回值解引用(sink)

修复建议

auto op_desc = node->GetOpDesc();
if (op_desc == nullptr) {
    continue;
}
if (op_desc->GetType() != kNetOutput) {
likedislike
Wwangmingming成员
28 天前 将 gcw_V3YyYBt1 设为负责人
wangmingming成员
28 天前 评论:

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

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