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

缺陷信息

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

缺陷描述

SetWorkspaceSize 函数中,context->GetWorkspaceSizes(WORKSPACE_NUM) 返回的 wsSizes 指针未做空指针校验即在第298行执行 wsSizes[0]=usrWsSize+sysWsSize 写入操作。与 HandleEmptyTensor 同一 API,官方开发指南和 ops-transformer 项目均证明该 API 可返回 NULL。SetWorkspaceSize 在非空张量路径上通过 DataCompareTilingFunc 第363行调用,缺陷路径可达。

事实核查

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

与缺陷1为同一API的相同遗漏模式。

官方开发指南和同仓其他tiling文件均对此API做了OP_CHECK_NULL_WITH_CONTEXT检查。

调用链可达:DataCompareTilingFunc:363 在非空张量路径末尾调用 SetWorkspaceSize。

缺陷真实存在。

数据流证据

Source(问题源头)

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

Sink(问题爆发点)

math/data_compare/op_host/arch35/data_compare_tiling.cpp:298 行 wsSizes[0] = usrWsSize + 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 363 SetWorkspaceSize(context, tiling, isGroup) 在正常 tiling 路径末尾调用
3 math/data_compare/op_host/arch35/data_compare_tiling.cpp 285 SetWorkspaceSize 接收 gert::TilingContext* context 参数
4 math/data_compare/op_host/arch35/data_compare_tiling.cpp 297 size_t* wsSizes = context->GetWorkspaceSizes(WORKSPACE_NUM) 获取指针(未做 NULL 检查)
5 math/data_compare/op_host/arch35/data_compare_tiling.cpp 298 wsSizes[0] = usrWsSize + sysWsSize 直接解引用(sink)

调用链

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

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

修复建议

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

根因确认

已核对当前 masterDataCompare::SetWorkspaceSize 获取 workspace size 指针后直接下标写入,缺少返回值判空。问题与 #2768 相同但位于非空 tensor 路径,防御性缺口成立,实际触发取决于框架是否返回空指针。

修复时应统一在 GetWorkspaceSizes 后判空并返回失败,覆盖非空 tensor 的异常路径。后续由责任人安排修复和验证。

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