已关闭
【缺陷报告】空指针解引用 - 文件data_compare_tiling.cpp - 函数HandleEmptyTensor - 行号154 #2768
zhangjunkai9创建于  17 天前关闭于  13 天前
zhangjunkai9
17 天前 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数HandleEmptyTensor
文件math/data_compare/op_host/arch35/data_compare_tiling.cpp
行号154
置信度90%

缺陷描述

HandleEmptyTensor 函数中,context->GetWorkspaceSizes(WORKSPACE_NUM) 返回的 wsSizes 指针未做空指针校验即在第154行执行 wsSizes[0]=sysWsSize 写入操作。GetWorkspaceSizes 是框架 API,官方开发指南模板(aicore_develop_guide.md:259-260)明确要求调用后使用 OP_CHECK_NULL_WITH_CONTEXT 进行空检查,ops-transformer 项目的 fia_tiling_base.h:89 也对同一 API 做了 nullptr 判定,证明该 API 在特定条件下(如内部内存不足)可返回 NULL。当前函数通过 DataCompareTilingFunc 入口可达(info.isEmptyTensor 为 true 时调用),缺陷路径可达。

事实核查

经复核源代码确认:第153行调用 GetWorkspaceSizes 获取 wsSizes 指针后未做任何空指针校验,第154行直接执行 wsSizes[0] = sysWsSize 写入。

该API可返回NULL(官方开发指南 aicore_develop_guide.md:259-260 明确要求调用后使用 OP_CHECK_NULL_WITH_CONTEXT 检查),同一代码仓中 acosh_tiling_arch35.cpp:148、asinh_tiling_arch35.cpp:190 等均对此API做了空指针检查。

当前文件自身也对其他指针(第43/72/74/91/95/319/377行)使用了 OP_CHECK_NULL_WITH_CONTEXT,唯独遗漏了 GetWorkspaceSizes 返回值。

调用链可达:DataCompareTilingFunc:325 在 info.isEmptyTensor 为 true 时调用 HandleEmptyTensor。

缺陷真实存在。

数据流证据

Source(问题源头)

math/data_compare/op_host/arch35/data_compare_tiling.cpp:153 行 size_t* wsSizes = context->GetWorkspaceSizes(WORKSPACE_NUM) 获取 workspace 大小指针(框架 API 可能返回 NULL)

Sink(问题爆发点)

math/data_compare/op_host/arch35/data_compare_tiling.cpp:154 行 wsSizes[0] = sysWsSize 对可能为 NULL 的指针执行下标写入(空指针解引用)

传播路径:

# 文件 行号 说明
1 math/data_compare/op_host/arch35/data_compare_tiling.cpp 301 DataCompareTilingFunc 入口函数被框架调用
2 math/data_compare/op_host/arch35/data_compare_tiling.cpp 324-325 if (info.isEmptyTensor) { return HandleEmptyTensor(context, tiling, &info); } 当空张量条件满足时调用 HandleEmptyTensor
3 math/data_compare/op_host/arch35/data_compare_tiling.cpp 140 HandleEmptyTensor 接收 gert::TilingContext* context 参数
4 math/data_compare/op_host/arch35/data_compare_tiling.cpp 153 size_t* wsSizes = context->GetWorkspaceSizes(WORKSPACE_NUM) 获取指针(未做 NULL 检查)
5 math/data_compare/op_host/arch35/data_compare_tiling.cpp 154 wsSizes[0] = sysWsSize 直接解引用(sink)

调用链

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

# 文件 函数 函数起始行 调用点行
1 math/data_compare/op_host/arch35/data_compare_tiling.cpp:optiling: DataCompareTilingFunc 301 325
2 math/data_compare/op_host/arch35/data_compare_tiling.cpp:optiling: HandleEmptyTensor 140

修复建议

size_t* wsSizes = context->GetWorkspaceSizes(WORKSPACE_NUM);
OP_CHECK_NULL_WITH_CONTEXT(context, wsSizes);
wsSizes[0] = sysWsSize;
likedislike
陈思
陈思成员
16 天前 评论:

根因确认

已核对当前 masterDataCompare::HandleEmptyTensor 调用 GetWorkspaceSizes 后直接写入 wsSizes[0],没有检查返回指针;同仓同类 tiling 路径通常会在写入前判空。该防御性缺口成立,实际触发取决于框架是否返回空指针。

修复时应在写入前判空并返回失败,补充空 tensor 且 workspace 获取失败的异常测试。后续由责任人安排修复和验证。

likedislike
Nice tryNice try成员
16 天前 将 Nice_try 设为负责人
Nice tryNice try成员
15 天前 关联了pull request:Fix nullptrDeref in data_compare_tiling
CANN-robotCANN-robot成员
13 天前 关闭了 issue
CANN-robotCANN-robot成员
13 天前 添加了label:resolved