已关闭
【缺陷报告】容器访问越界 - 文件backend.cpp - 函数CostModelAgent::ParseDynTopo - 行号147 #3021
zhangjunkai9创建于  8月18日关闭于  8月18日
zhangjunkai9
8月18日 创建

缺陷信息

缺陷类型containerOutOfBounds (容器访问越界)
函数CostModelAgent::ParseDynTopo
文件framework/src/cost_model/simulation/backend.cpp
行号147

缺陷描述

ParseDynTopo 解析外部文件内容到 fields 向量,仅将成功解析为 uint64_t 的值加入 fields,然后不加校验直接以 fields[seqPos] 到 fields[funcHashPos](共13个下标位置)访问。若文件某行有效数值字段不足13个,则越界访问导致未定义行为。数据来源于外部文件(topo JSON),属于不可信输入,必须校验。

数据流证据

Source(问题源头)

framework/src/cost_model/simulation/backend.cpp:134 行 std::vector<uint64_t> fields 由文件每行逗号分隔值解析填充,仅成功 stoull 的值入列,size 取决于外部文件内容

Sink(问题爆发点)

framework/src/cost_model/simulation/backend.cpp:147 行 fields[seqPos] 首次直接下标访问,后续 fields[taskIdPos]..fields[funcHashPos] 共13个位置,无 size 校验

传播路径:

# 文件 行号 说明
1 framework/src/cost_model/simulation/backend.cpp 128-129 std::ifstream file(path) 从外部路径读取文件
2 framework/src/cost_model/simulation/backend.cpp 134-145 fields 向量由 stoull 解析结果填充,无效/溢出值被跳过,size 不可控
3 framework/src/cost_model/simulation/backend.cpp 147 fields[seqPos] 直接访问,seqPos=0,若 fields 为空则越界
4 framework/src/cost_model/simulation/backend.cpp 148-167 fields[taskIdPos]..fields[funcHashPos] 共13个位置直接访问,无 fields.size()>=13 校验

调用链

可达调用链1 起点:(entry functions) → 终点:npu::tile_fwk::CostModelAgent::ParseDynTopo 深度:8

# 文件 函数 函数起始行 调用点行
1 python/src/pybind11.cpp:pypto: PYBIND11_MODULE 24 39
2 python/src/bindings/cost_model.cpp:pypto: BindCostModelRuntime 99 101
3 python/src/bindings/cost_model.cpp:pypto: CostModelRunOnceDataFromHost 82 94
4 framework/src/cost_model/simulation/cost_model_launcher.h:npu::tile_fwk::dynamic::CostModelLauncher: CostModelRunOnce 169 174
5 framework/src/cost_model/simulation/cost_model_launcher.h:npu::tile_fwk::dynamic::CostModelLauncher: RunDynamic 189 196
6 framework/src/cost_model/simulation/cost_model_launcher.h:npu::tile_fwk::dynamic::CostModelLauncher: RunModel 201 218
7 framework/src/cost_model/simulation/cost_model_launcher.h:npu::tile_fwk::dynamic::CostModelLauncher: RunDynCostModel 250 256
8 framework/src/cost_model/simulation/backend.cpp:npu::tile_fwk::CostModelAgent: SubmitTopo 173 175
9 framework/src/cost_model/simulation/backend.cpp:npu::tile_fwk::CostModelAgent: ParseDynTopo 125 —

修复建议

if (fields.size() <= staticSuccCountPos) {
    SIMULATION_LOGE(CostModel::ExternalErrorScene::FILE_CONTENT_ERROR,
        "Invalid topo line: expected at least %llu fields, got %zu",
        staticSuccCountPos + 1, fields.size());
    continue;
}
likedislike
杨旭
杨旭成员
8月18日 评论:

感谢参与 PyPTO 生态~,相关问题涉及具体模块代码实现细节,我将联系具体模块负责人,进行进一步确认处理~

likedislike
杨旭
杨旭成员
8月18日 评论:

@zhiweiyuan 请协助看下对应实现,是否确实有问题,是否需要修改。

likedislike
杨旭杨旭成员
8月18日 将 zhiweiyuan 设为负责人
杨旭杨旭成员
8月18日 添加了label:Simulation
杨旭杨旭成员
8月18日 issue类型由 任务 改变为 缺陷
zhiweiyuan
zhiweiyuan成员
8月18日 评论:

已解决,感谢您的问题反馈

likedislike
zhiweiyuanzhiweiyuan成员
8月18日 issue状态由 待办的 改变为 已完成
zhiweiyuanzhiweiyuan成员
8月18日 关闭了 issue
CANN-robotCANN-robot成员
8月18日 添加了label:resolved