已关闭
【缺陷报告】空指针解引用 - 文件vector_func_partitioner.cpp - 函数FixCompareClusterConnections - 行号697 #273
zhangjunkai9创建于  15 天前关闭于  10 天前
zhangjunkai9
15 天前 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数FixCompareClusterConnections
文件autofuse/v35/optimize/partition/vector_func_partitioner.cpp
行号697
置信度86%

缺陷描述

函数 FixCompareClusterConnections 在第696行通过 cluster_dict_.GetNodeCluster(in_node) 获取 in_cluster 指针。GetNodeCluster 在节点未建立 cluster 映射时明确返回 nullptr(cluster_dict.cpp:24)。但第697行直接调用 in_cluster->Id() 解引用,无空指针校验。同一文件中的 EstablishClusterConnections 函数(第659-668行)对相同模式做了空指针检查(if (in_cluster == nullptr) continue),证明 in_nodes_ 中确实可能存在未映射到 cluster 的节点。FixCompareClusterConnections 缺失此检查,导致空指针解引用崩溃。该函数从 FixAllCompareClusterConnections(第682行)调用,可达性确认。

事实核查

核查1模式成立:ClusterDict::GetNodeCluster(cluster_dict.cpp:21-27)在 nodes_2_cluster_ 未找到 node 时 return nullptr(第24行),vector_func_partitioner.cpp:696行获取 in_cluster 后第697行 in_cluster->Id() 直接解引用,无空指针校验。
核查2无有效防护:第696-697行间无空检查;同文件 EstablishClusterConnections(第659-668行)对相同 GetNodeCluster 调用有 if (in_cluster == nullptr) continue 空检查,证明 nullptr 返回是预期场景,FixCompareClusterConnections 缺失此检查。
核查3函数可达:FixAllCompareClusterConnections(第682行)调用。
核查4触发条件有间接证据但未确证:EstablishClusterConnections 的空检查证明 in_node 可无 cluster 映射,但其遍历的是 node->GetInAllNodes()(含非 AscNode),而 FixCompareClusterConnections 遍历 cluster->in_nodes_(仅 AscNode、已过滤常量标量,见第524-528行),两者集合不同,无法直接确认 in_nodes_ 中存在未映射 cluster 的 AscNode。
属假设性·上游有间接未确证路径→confidence 0.86

数据流证据

Source(问题源头)

autofuse/v35/optimize/partition/cluster_dict.cpp:24 行 return nullptr GetNodeCluster 在 nodes_2_cluster_ map 中未找到指定 node 时返回 nullptr

Sink(问题爆发点)

autofuse/v35/optimize/partition/vector_func_partitioner.cpp:697 行 in_cluster->Id() 直接解引用可能为 nullptr 的 in_cluster 指针(空指针解引用 sink)

传播路径:

# 文件 行号 说明
1 autofuse/v35/optimize/partition/cluster_dict.cpp 21-24 ClusterDict::GetNodeCluster 在 nodes_2_cluster_.find(node) 未找到时 return nullptr(source)
2 autofuse/v35/optimize/partition/vector_func_partitioner.cpp 524-528 CreateAndInitCluster 中 cluster->in_nodes_.insert(in_node) 将输入节点加入 in_nodes_ 集合,这些节点可能来自图外部、未在当前 cluster_dict_ 中建立映射
3 autofuse/v35/optimize/partition/vector_func_partitioner.cpp 659-666 EstablishClusterConnections 对同一 GetNodeCluster 调用有空指针检查 if (in_cluster == nullptr) continue,证明 nullptr 返回是预期场景
4 autofuse/v35/optimize/partition/vector_func_partitioner.cpp 691 for (const auto &in_node : cluster->in_nodes_) 遍历可能包含未映射 cluster 的节点
5 autofuse/v35/optimize/partition/vector_func_partitioner.cpp 696 const auto &in_cluster = cluster_dict_.GetNodeCluster(in_node) 接收可能为 nullptr 的返回值,无空检查
6 autofuse/v35/optimize/partition/vector_func_partitioner.cpp 697 in_cluster->Id() == cluster->Id() 直接解引用可能为 nullptr 的 in_cluster(sink)

修复建议

void VectorFuncPartitioner::FixCompareClusterConnections(const ClusterPtr &cluster,
                                                         const af::AscNodePtr &compare_node) {
  std::unordered_set<Cluster *> missing_input_clusters;
  missing_input_clusters.reserve(cluster->in_nodes_.size());
  for (const auto &in_node : cluster->in_nodes_) {
    // 跳过Compare节点自己的输入
    if (in_node == compare_node) {
      continue;
    }
    const auto &in_cluster = cluster_dict_.GetNodeCluster(in_node);
    if (in_cluster == nullptr) {
      GELOGD("The in cluster of the node [%s] is nullptr, skip in FixCompareClusterConnections.",
             in_node->GetNamePtr());
      continue;
    }
    if (in_cluster->Id() == cluster->Id()) {
likedislike
Wwangmingming成员
15 天前 将 gcw_V3YyYBt1 设为负责人
wangmingming成员
15 天前 评论:

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

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