已关闭
【缺陷报告】空指针解引用 - 文件concat_infershape.cpp - 函数ConcatInferShapeCommon - 行号56 #2764
zhangjunkai9创建于  11 天前关闭于  7 天前
zhangjunkai9
11 天前 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数ConcatInferShapeCommon
文件conversion/concat/op_host/concat_infershape.cpp
行号56
置信度90%

缺陷描述

函数 ConcatInferShapeCommon 中,第一个输入(index=0)的 GetDynamicInputShape 返回值在第26行做了 OP_CHECK_NULL_WITH_CONTEXT 空指针校验,但循环中 subsequent 输入(relative_index>=1)的 GetDynamicInputShape 返回值 input_i_shape 未做空指针校验,第55行 *input_i_shape 和第56行 input_i_shape->IsScalar() 直接解引用。同函数对 index=0 的校验证明该 API 可能返回 nullptr,对 index>=1 缺少校验属于遗漏。

事实核查

经复核源代码确认,ConcatInferShapeCommon 第25-26行对 GetDynamicInputShape(dynamic_input_idx, 0) 返回值做了 OP_CHECK_NULL_WITH_CONTEXT 校验,但第52-53行循环中 GetDynamicInputShape(dynamic_input_idx, relative_index)(relative_index>=1)的返回值 input_i_shape 完全无空指针校验。

第55行 *input_i_shape 和第56行 input_i_shape->IsScalar() 直接解引用,若该指针为 nullptr 将导致空指针解引用崩溃。

同函数自身对 index=0 的校验已经证明该API可能返回nullptr,对 index>=1 缺少校验属于明确的校验遗漏。

调用链从 InferShape4ConcatD 和 InferShape4Concat 可达,缺陷真实存在。

数据流证据

Source(问题源头)

conversion/concat/op_host/concat_infershape.cpp:53 行 const gert::Shape* input_i_shape = context->GetDynamicInputShape(dynamic_input_idx, relative_index); 获取动态输入形状指针(可能为 nullptr)

Sink(问题爆发点)

conversion/concat/op_host/concat_infershape.cpp:56 行 input_i_shape->IsScalar() 解引用可能为 nullptr 的指针(空指针解引用 sink)

传播路径:

# 文件 行号 说明
1 conversion/concat_d/op_host/concat_d_infershape.cpp 21 InferShape4ConcatD 入口函数接收 gert::InferShapeContext* context
2 conversion/concat_d/op_host/concat_d_infershape.cpp:29 行调用 ConcatInferShapeCommon(context, inputIdx, inputNum, concatDim) 传递 context
3 conversion/concat/op_host/concat_infershape.cpp 22 ConcatInferShapeCommon 接收 context 参数
4 conversion/concat/op_host/concat_infershape.cpp 25 in_shape = context->GetDynamicInputShape(dynamic_input_idx, 0) 获取 index=0 的形状指针
5 conversion/concat/op_host/concat_infershape.cpp 26 OP_CHECK_NULL_WITH_CONTEXT(context, in_shape) 对 index=0 做了空指针校验
6 conversion/concat/op_host/concat_infershape.cpp 52 for 循环从 relative_index=1 开始遍历
7 conversion/concat/op_host/concat_infershape.cpp 53 input_i_shape = context->GetDynamicInputShape(dynamic_input_idx, relative_index) 获取 index>=1 的形状指针,无空指针校验
8 conversion/concat/op_host/concat_infershape.cpp 56 input_i_shape->IsScalar() 直接解引用(sink)

调用链

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

# 文件 函数 函数起始行 调用点行
1 conversion/concat_d/op_host/concat_d_infershape.cpp:ops: InferShape4ConcatD 21 29
2 conversion/concat/op_host/concat_infershape.cpp:ops: ConcatInferShapeCommon 22

可达调用链2 起点:(entry functions) → 终点:ops::ConcatInferShapeCommon 深度:2

# 文件 函数 函数起始行 调用点行
1 conversion/concat/op_host/concat_infershape.cpp:ops: InferShape4Concat 116 118
2 conversion/concat/op_host/concat_infershape.cpp:ops: InferShapeForConcatAndConcatV2 96 113
3 conversion/concat/op_host/concat_infershape.cpp:ops: ConcatInferShapeCommon 22

修复建议

const gert::Shape* input_i_shape = context->GetDynamicInputShape(dynamic_input_idx, relative_index);
OP_CHECK_NULL_WITH_CONTEXT(context, input_i_shape);
likedislike
陈思
陈思成员
10 天前 评论:

根因确认

已核对当前 masterConcatInferShapeCommon 对第 0 个动态输入的 GetDynamicInputShape 返回值做了判空,但循环获取后续动态输入时,input_i_shape 未判空就被解引用和调用 IsScalar()。同一 API 的首输入已有防护,后续输入遗漏检查,告警成立。

修复时应在每次获取动态输入 shape 后立即判空并返回失败,同时补充非首输入 shape 缺失的异常路径测试。后续由责任人安排修复和验证。

likedislike
Nice tryNice try成员
9 天前 将 Nice_try 设为负责人
Nice tryNice try成员
9 天前 关联了pull request:fix nulllptrDef of concat_infershape
CANN-robotCANN-robot成员
7 天前 关闭了 issue
CANN-robotCANN-robot成员
7 天前 添加了label:resolved