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

缺陷信息

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

缺陷描述

GetResCubeGroupWorkSpaceSize 返回类型为 uint32_t,但在错误路径(socVersion != ASCEND910B)返回 -1。-1 隐式转换为 uint32_t 值 4294967295(UINT32_MAX)。调用方将该返回值作为工作空间大小使用(如 docs 示例中 size_t usrSize = 256 + ascendcPlatform.GetResCubeGroupWorkSpaceSize()),可能导致约 4GB 的异常内存分配。

详细解释

经复核确认,第287行 return -1 在 uint32_t 返回类型函数中隐式转换为 4294967295,缺陷模式成立。PF_LOGE 仅记录日志不阻止错误返回值,无有效防护。函数为公有 API 接口,函数可达。触发条件为 socVersion != ASCEND910B,SocVersion 枚举中存在大量非 ASCEND910B 的合法值(ASCEND910、ASCEND310P、ASCEND310B、ASCEND950 等),即使用户在合法支持的 SoC 版本上调用此函数也会触发,触发可满足。

数据流证据

Source(问题源头)

impl/utils/tiling/platform/platform_ascendc.cpp:282 行 auto socVersion = GetSocVersion() 获取 SoC 版本

Sink(问题爆发点)

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

传播路径:

# 文件 行号 说明
1 impl/utils/tiling/platform/platform_ascendc.cpp 282 auto socVersion = GetSocVersion() 获取 SoC 版本
2 impl/utils/tiling/platform/platform_ascendc.cpp 283 if (socVersion == SocVersion::ASCEND910B) 判断版本
3 impl/utils/tiling/platform/platform_ascendc.cpp 286 else 分支进入错误路径
4 impl/utils/tiling/platform/platform_ascendc.cpp 287 return -1 有符号 -1 隐式窄化为 uint32_t 值 4294967295(sink)
5 docs/zh/api/Utils-API/platform_info/PlatformAscendC/GetResCubeGroupWorkSpaceSize.md 37 size_t usrSize = 256 + ascendcPlatform.GetResCubeGroupWorkSpaceSize() 调用方将返回值作为工作空间大小使用

调用链

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

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

修复建议

uint32_t PlatformAscendC::GetResCubeGroupWorkSpaceSize(void) const
{
    auto socVersion = GetSocVersion();
    if (socVersion == SocVersion::ASCEND910B) {
        return CUBE_GROUP_WORK_SPACE_SIZE_910B;
    } else {
        PF_LOGE("get platform failed, socVersionStr is %d", socVersion);
        return 0;
    }
}
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