已关闭
【缺陷报告】数据类型截断 - 文件platform_ascendc.cpp - 函数GetLibApiWorkSpaceSize - 行号271 #1543
zhangjunkai9创建于 19 天前关闭于 13 天前
19 天前 将 chenyiyuan 设为负责人
chenyiyuan
18 天前 评论:
18 天前 评论:
你好,改为0并不能满足接口原本异常含义,且由于接口兼容性,无法将其修改至int32_t返回值,经讨论,预将在资料描述诸如UINT32_MAX表示接口异常状态,供用户进行使用前校验接口返回值是否为异常值,且UINT32_MAX从业务角度也无法会达到。


18 天前 将 jcmrn0930 设为负责人
13 天前 关闭了 issue
13 天前 添加了label:resolved
缺陷信息
缺陷描述
GetLibApiWorkSpaceSize 返回类型为 uint32_t,但在错误路径(npuArch == NpuArch::DAV_RESV)返回 -1。-1 隐式转换为 uint32_t 值 4294967295(UINT32_MAX)。调用方将该返回值作为工作空间大小使用(如 docs 示例中 size_t sysWorkspaceSize = ascendcPlatform.GetLibApiWorkSpaceSize()),可能导致约 4GB 的异常内存分配。
详细解释
经复核确认,第271行 return -1 在 uint32_t 返回类型函数中隐式转换为 4294967295,缺陷模式成立。PF_LOGE 仅记录日志不阻止错误返回值,无有效防护。函数为 PlatformAscendC 公有接口,文档示例及多处代码调用,函数可达。GetCurNpuArch 在平台信息获取失败、atoi 异常、npuArchInt<=0 时均返回 NpuArch::DAV_RESV,这些是实际运行时可能发生的条件,触发可满足。调用方将返回值作为 workspace 大小使用,可能导致约 4GB 异常内存分配。
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:platform_ascendc::PlatformAscendC::GetLibApiWorkSpaceSize深度:0修复建议
uint32_t PlatformAscendC::GetLibApiWorkSpaceSize(void) const { auto npuArch = GetCurNpuArch(); if (npuArch == NpuArch::DAV_RESV) { PF_LOGE("get platform failed, CurNpuArch is NpuArch::DAV_RESV"); return 0; } else if (npuArch == NpuArch::DAV_2201) { return WORK_SPACE_SIZE_910B; } else if (npuArch == NpuArch::DAV_3510) { return WORK_SPACE_SIZE_950; } return WORK_SPACE_SIZE; }