已关闭
【缺陷报告】数据类型截断 - 文件platform_ascendc.cpp - 函数GetLibApiWorkSpaceSize - 行号271 #1543
zhangjunkai9创建于  19 天前关闭于  13 天前
zhangjunkai9
19 天前 创建

缺陷信息

缺陷类型dataTypeTruncation (数据类型截断)
函数GetLibApiWorkSpaceSize
文件impl/utils/tiling/platform/platform_ascendc.cpp
行号271

缺陷描述

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 异常内存分配。

数据流证据

Source(问题源头)

impl/utils/tiling/platform/platform_ascendc.cpp:268 行 auto npuArch = GetCurNpuArch() 获取 NPU 架构

Sink(问题爆发点)

impl/utils/tiling/platform/platform_ascendc.cpp:271 行 return -1 有符号值 -1 隐式转换为 uint32_t 值 4294967295

传播路径:

# 文件 行号 说明
1 impl/utils/tiling/platform/platform_ascendc.cpp 268 auto npuArch = GetCurNpuArch() 获取 NPU 架构
2 impl/utils/tiling/platform/platform_ascendc.cpp 269 if (npuArch == NpuArch::DAV_RESV) 判断架构无效
3 impl/utils/tiling/platform/platform_ascendc.cpp 271 return -1 有符号 -1 隐式窄化为 uint32_t 值 4294967295(sink)
4 docs/zh/guide/programming_guide/appendix/common_operations/how_to_use_workspace.md 32 uint32_t sysWorkspaceSize = ascendcPlatform.GetLibApiWorkSpaceSize() 调用方将返回值作为工作空间大小使用

调用链

可达调用链1 起点:(entry functions) → 终点:platform_ascendc::PlatformAscendC::GetLibApiWorkSpaceSize 深度:0

# 文件 函数 函数起始行 调用点行
1 impl/utils/tiling/platform/platform_ascendc.cpp:platform_ascendc::PlatformAscendC: GetLibApiWorkSpaceSize 266

修复建议

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;
}
likedislike
shaonaiteshaonaite成员
19 天前 将 chenyiyuan 设为负责人
chenyiyuan成员
18 天前 评论:

你好,改为0并不能满足接口原本异常含义,且由于接口兼容性,无法将其修改至int32_t返回值,经讨论,预将在资料描述诸如UINT32_MAX表示接口异常状态,供用户进行使用前校验接口返回值是否为异常值,且UINT32_MAX从业务角度也无法会达到。

likedislike
Cchenyiyuan成员
18 天前 将 jcmrn0930 设为负责人
Jjcmrn0930成员
13 天前 关联了pull request:修改相关issue文档
CANN-robotCANN-robot成员
13 天前 关闭了 issue
CANN-robotCANN-robot成员
13 天前 添加了label:resolved