已关闭
【缺陷报告】内存分配大小错误 - 文件diag_flat_tiling.cpp - 函数TilingDiagFlat - 行号108 #2779
zhangjunkai9创建于  8月20日关闭于  9月4日
zhangjunkai9
8月20日 创建

缺陷信息

缺陷类型incorrectMemoryAllocationSize (内存分配大小错误)
函数TilingDiagFlat
文件conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp
行号108
置信度90%

缺陷描述

在TilingDiagFlat函数中,第108-109行使用sizeof(dataType)计算auxMatrix和outputDataSize,其中dataType是ge::DataType枚举类型,sizeof(dataType)返回枚举类型自身大小(通常4字节),而非该枚举值所代表的数据类型大小(如float16为2字节、float64为8字节)。正确方式应使用ge::GetSizeByDataType(dataType),同文件第43行和第64行即采用了该正确方式。对于8字节数据类型,auxMatrix和outputDataSize被低估为实际值的1/2,导致inputDataSize=ubSize-auxMatrix-outputDataSize被高估,内核可能认为UB可容纳更多输入数据而导致UB缓冲区溢出。

事实核查

经复核源代码确认,TilingDiagFlat函数(第87-138行)第108-109行使用sizeof(dataType)计算auxMatrix和outputDataSize,其中dataType为ge::DataType枚举类型,sizeof(dataType)返回枚举类型大小(4字节),而非该枚举值代表的数据类型实际大小。

同文件CalcScalarTiling(第43行)和CalcAuxMatrixTiling(第64行)均正确使用ge::GetSizeByDataType(dataType),形成鲜明对比。

对8字节数据类型(如DT_FLOAT64、DT_INT64),sizeof版本将auxMatrix/outputDataSize低估为实际值的1/2,导致inputDataSize=ubSize-auxMatrix-outputDataSize被高估,下游内核可能向UB写入超出实际容量的数据导致溢出。

调用链已验证:Tiling4DiagV2(diag_v2_tiling.cpp:86)->processDiagFlat(diag_v2_tiling.cpp:71->74)->TilingDiagFlat(diag_flat_tiling.cpp:87),通过IMPL_OP_OPTILING注册为tiling入口,可达。

数据流证据

Source(问题源头)

conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp:86 行 Tiling4DiagV2 作为注册的tiling入口函数接收 gert::TilingContext* context

Sink(问题爆发点)

conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp:108 行 auto auxMatrix = SCALAR_THRESHOLD_NUM * SCALAR_THRESHOLD_NUM * sizeof(dataType) 使用sizeof(枚举)而非数据类型大小,导致auxMatrix/outputDataSize计算错误

传播路径:

# 文件 行号 说明
1 conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp 86 Tiling4DiagV2(gert::TilingContext* context) 入口函数接收context
2 conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp 97 if (inputShape.GetDimNum() == 1) 判断输入为一维时走DiagFlat路径
3 conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp 98 return processDiagFlat(context) 将context传递给processDiagFlat
4 conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp 71 processDiagFlat(gert::TilingContext* context) 接收context
5 conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp 74 return TilingDiagFlat(context) 将context传递给TilingDiagFlat
6 conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp 90 auto input = context->GetInputTensor(0) 获取输入张量
7 conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp 107 auto dataType = input->GetDataType() 获取ge::DataType枚举值
8 conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp 108 sizeof(dataType) 取枚举类型大小(4字节)而非实际数据类型大小,auxMatrix计算错误
9 conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp 109 sizeof(dataType) 同样错误应用于outputDataSize计算
10 conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp 110 auto inputDataSize = ubSize - auxMatrix - outputDataSize 因auxMatrix/outputDataSize错误导致inputDataSize被高估
11 conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp 111 tilingData.set_ubInputSize(inputDataSize) 将错误的ubInputSize写入tiling数据,下游内核使用该值可能导致UB溢出

调用链

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

# 文件 函数 函数起始行 调用点行
1 conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp:optiling: Tiling4DiagV2 86 98
2 conversion/diag_v2/op_host/arch32/diag_v2_tiling.cpp:optiling: processDiagFlat 71 74
3 conversion/diag_flat/op_host/arch32/diag_flat_tiling.cpp:optiling: TilingDiagFlat 87 —

修复建议

auto auxMatrix = SCALAR_THRESHOLD_NUM * SCALAR_THRESHOLD_NUM * ge::GetSizeByDataType(dataType);
auto outputDataSize = SCALAR_THRESHOLD_NUM * SCALAR_THRESHOLD_NUM * ge::GetSizeByDataType(dataType);
likedislike
陈思
陈思成员
8月21日 评论:

根因确认

已核对当前 master。该文件目前位于 conversion/diag_flat/op_host/arch22/diag_flat_tiling.cpp,不是 Issue 中的 arch32 路径。TilingDiagFlat 使用 sizeof(dataType) 计算辅助矩阵和输出数据大小,而 dataType 是 ge::DataType 枚举;得到的是枚举对象大小,不是枚举所代表元素类型的字节数。告警成立。

修复时应与同文件其他路径一致使用 ge::GetSizeByDataType(dataType),并覆盖 2/4/8 字节数据类型的 tiling 容量计算。后续由责任人安排修复和验证。

likedislike
陈思陈思成员
9月3日 将 sunchun 设为负责人
Xu-XuePengXu-XuePeng成员
9月3日 关联了pull request:fix:issue 2779
CANN-robotCANN-robot成员
9月4日 关闭了 issue
CANN-robotCANN-robot成员
9月4日 添加了label:resolved