已关闭
【缺陷报告】容器访问越界 - 文件masked_scatter_with_position_infershape.cpp - 函数InferShapeMaskedScatterWithPosition - 行号41 #5018
zhangjunkai9创建于  15 天前关闭于  11 天前
zhangjunkai9
15 天前 创建

缺陷信息

缺陷类型containerOutOfBounds (容器访问越界)
函数InferShapeMaskedScatterWithPosition
文件index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp
行号41
置信度90%

缺陷描述

函数 InferShapeMaskedScatterWithPosition 在第34行使用 xShape->GetShapeSize()(返回张量元素总数,即各维度大小的乘积)作为 SetDimNum 的参数和循环上界,而非 GetDimNum()(返回维度数/秩)。当元素总数大于实际维度数时(例如 shape 为 [2,3,4] 时 GetShapeSize()=24 但 GetDimNum()=3),第41行 xShape->GetDim(i) 对 i>=3 的访问越界,导致容器访问越界。即使是 1 维张量 [N](N>1),GetShapeSize()=N 也会导致 GetDim(1) 到 GetDim(N-1) 越界。该函数通过 IMPL_OP_INFERSHAPE 注册为入口函数,直接被框架调用,可达性确认。

事实核查

核查1模式成立:第34行使用GetShapeSize()(元素总数)而非GetDimNum()(维度数)作为SetDimNum参数和循环上界,第40-41行以元素总数为上界循环调用GetDim(i),当i>=GetDimNum()时越界访问Shape内部容器,缺陷模式属实。

核查2无有效防护:第35-37行仅检查xShapeSize<0,不防阻GetShapeSize与GetDimNum混淆。

核查3函数可达:通过IMPL_OP_INFERSHAPE注册为入口函数,框架直接调用。

核查4触发可满足:任何元素总数大于维度数的张量(如shape=[2,3,4]时24>3)均触发越界,条件极易满足

数据流证据

Source(问题源头)

index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp:27 行 const gert::Shape* xShape = context->GetInputShape(0) 获取输入0的 Shape 对象(外部输入的形状信息,其维度数与元素总数由用户输入决定)

Sink(问题爆发点)

index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp:41 行 int64_t dim = xShape->GetDim(i) 在循环中以 GetShapeSize()(元素总数)为上界访问 GetDim(i),当 i >= GetDimNum()(实际维度数)时越界访问容器(危险操作点)

传播路径:

# 文件 行号 说明
1 index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp 22 static ge::graphStatus InferShapeMaskedScatterWithPosition(gert::InferShapeContext* context) 函数通过 IMPL_OP_INFERSHAPE 注册为入口函数(调用链起点:入口函数)
2 index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp 27 const gert::Shape* xShape = context->GetInputShape(0) 获取输入 Shape 对象(数据源进入缺陷路径)
3 index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp 34 auto xShapeSize = xShape->GetShapeSize() 获取元素总数而非维度数(关键赋值节点:错误地将元素总数用作维度数,决定性变量 xShapeSize 的值可能远大于实际维度数)
4 index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp 39 yShape->SetDimNum(ShapeSize) 以元素总数设置输出维度数(传播节点:错误的值传递给 SetDimNum)
5 index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp 40 for (size_t i = 0U; i < ShapeSize; i++) 以元素总数为循环上界(传播节点:循环上界远大于实际维度数)
6 index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp 41 int64_t dim = xShape->GetDim(i) 当 i >= GetDimNum() 时越界访问 Shape 内部容器(危险操作点:sink)

调用链

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

# 文件 函数 函数起始行 调用点行
1 index/masked_scatter_with_position/op_host/masked_scatter_with_position_infershape.cpp:ops: InferShapeMaskedScatterWithPosition 22

修复建议

    auto xShapeDimNum = xShape->GetDimNum();
    if (xShapeDimNum < 0) {
        return ge::GRAPH_FAILED;
    }
    size_t dimNum = static_cast<size_t>(xShapeDimNum);
    yShape->SetDimNum(dimNum);
    for (size_t i = 0U; i < dimNum; i++) {
        int64_t dim = xShape->GetDim(i);
        yShape->SetDim(i, dim);
    }
likedislike
yuning_chenyuning_chen成员
14 天前 将 sunchun 设为负责人
yuning_chen
yuning_chen成员
14 天前 评论:

您好,感谢反馈,问题已收到,当前 @wang-shilong32 正在跟踪处理。

likedislike
yuning_chenyuning_chen成员
14 天前 将 wang-shilong32 设为负责人
yuning_chenyuning_chen成员
14 天前 移除了负责人 sunchun
ideal_
ideal_成员
11 天前 评论:

感谢反馈,该算子是MaskedScatter的内部算子,仅开放L0接口供broadcast场景下MaskedScatter调用,因此并无geir通路,该部分属于无效代码,后续会清除。

likedislike
CANN-robotCANN-robot成员
11 天前 关闭了 issue
CANN-robotCANN-robot成员
11 天前 添加了label:resolved