已关闭
【缺陷报告】除零错误 - 文件init_global_memory_v200_impl.h - 函数InitGlobalMemoryImpl - 行号47 #1547
zhangjunkai9创建于  8月19日关闭于  8月28日
zhangjunkai9
8月19日 创建

缺陷信息

缺陷类型divideByZero (除零错误)
函数InitGlobalMemoryImpl
文件impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h
行号47

缺陷描述

InitGlobalMemoryImpl(v200) 第47行 size / popSize 未检查 popSize 是否为0。popSize 由 popBuffer.GetSize() 计算得出,PopStackBuffer 的返回值 ret 已通过 ASCENDC_ASSERT 检查,但 GetSize() 返回值无任何非零保证。对比 v310 版本(init_global_memory_v310_impl.h:42)有 ASCENDC_ASSERT(popSize > 0) 保护,v200 版本缺少此检查,若 GetSize() 返回0则 popSize 为0导致除零崩溃。该函数通过 InitGlobalMemory 和 Fill 两条调用链可达。

数据流证据

Source(问题源头)

impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h:43 行 PopStackBuffer<T, TPosition::LCM>(popBuffer) 分配缓冲区

Sink(问题爆发点)

impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h:47 行 size / popSize 整数除法(popSize 可能为0)

传播路径:

# 文件 行号 说明
1 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h 41 LocalTensor popBuffer 声明
2 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h 43 PopStackBuffer 返回值 ret 已检查,但仅验证分配是否成功
3 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h 46 const uint32_t popSize = popBuffer.GetSize() >= maxBurstSize ? maxBurstSize : popBuffer.GetSize() 获取缓冲区大小,无 popSize>0 校验
4 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h 47 size / popSize 除法操作(sink)
5 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v310_impl.h 42 v310 版本有 ASCENDC_ASSERT(popSize > 0) 保护,v200 缺少此保护

调用链

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

# 文件 函数 函数起始行 调用点行
1 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h:AscendC: InitGlobalMemory 98 100
2 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h:AscendC: InitGlobalMemoryImpl 35 —

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

# 文件 函数 函数起始行 调用点行
1 include/adv_api/utils/init_global_memory.h:AscendC: Fill 50 52
2 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h:AscendC: InitGlobalMemoryImpl 35 —

可达调用链3 起点:(entry functions) → 终点:AscendC::InitGlobalMemoryImpl 深度:1

# 文件 函数 函数起始行 调用点行
1 include/adv_api/utils/init_global_memory.h:AscendC: Fill 66 70
2 impl/adv_api/detail/utils/init_global_memory/init_global_memory_v200_impl.h:AscendC: InitGlobalMemoryImpl 35 —

修复建议

const uint32_t popSize = popBuffer.GetSize() >= maxBurstSize ? maxBurstSize : popBuffer.GetSize();
ASCENDC_ASSERT((popSize > 0), { KERNEL_LOG(KERNEL_ERROR, "popSize must be larger than 0"); });
likedislike
shaonaiteshaonaite成员
8月19日 将 chenyiyuan 设为负责人
chenyiyuan成员
8月19日 评论:

你好,该问题已确认,将增加此处校验,会尽快修复。

likedislike
Cchenyiyuan成员
8月19日 将 jcmrn0930 设为负责人
Jjcmrn0930成员
8月19日 关联了pull request:issue
Jjcmrn0930成员
8月19日 删除了关联的pull request:issue
Jjcmrn0930成员
8月19日 关联了pull request:issue
Jjcmrn0930成员
8月19日 删除了关联的pull request:issue
Jjcmrn0930成员
8月19日 关联了pull request:issue
Jjcmrn0930成员
8月19日 关联了pull request:issue
Jjcmrn0930成员
8月21日 关联了pull request:fix: assert init global memory pop size
Jjcmrn0930成员
8月24日 关联了pull request:解决issue1547/1548
Cchenyiyuan成员
8月28日 删除了关联的pull request:issue
Cchenyiyuan成员
8月28日 删除了关联的pull request:issue
Cchenyiyuan成员
8月28日 删除了关联的pull request:fix: assert init global memory pop size
chenyiyuan成员
8月28日 评论:

你好,该问题以增加校验,若无问题,将关闭该issue。

likedislike
Cchenyiyuan成员
8月28日 issue状态由 进行中 改变为 已完成
Cchenyiyuan成员
8月28日 关闭了 issue
CANN-robotCANN-robot成员
8月28日 添加了label:resolved