已关闭
[Bug-Report|缺陷反馈]: AsdTensorInvalidShapeCheck 对 0 维张量存在空指针解引用风险 #101
syy_3597创建于  13 天前关闭于  12 天前
syy_3597
13 天前 创建

Describe the current behavior / 问题描述

core/utils/common_check.cpp:93,AsdTensorInvalidShapeCheck():

    CHECK_STATUS_WITH_ACL_RETURN(aclGetStorageShape(tensor, &storageDims, &storageDimsNum),
                                 "aclGetStorageShape");
    if (*storageDims <= 0) {   // <- 未判空直接解引用

两个问题:

  1. 当张量为 0 维(rank=0,标量)时,aclGetStorageShape 可能返回 storageDims == nullptr,此处直接解引用导致进程崩溃;
  2. 即便非 0 维,也只检查了第一维 *storageDims <= 0,后续维度为负/零时未校验,函数名承诺的 "InvalidShape" 检查不完整。

该函数被 SIP_OP_CHECK_INVALID_SHAPE 宏广泛用于 BLAS 算子入参校验(如 core/blas/cgemm.cpp 的 CgemmShapeCheck),0 维张量一旦传入即触发崩溃。

Impact / 影响

仅异常输入(0 维/含非法维度的张量)触发;触发即崩溃。修复是在崩溃路径上加提前返回,不存在依赖崩溃行为的正常业务,无回归风险。

Suggested fix / 修复建议

解引用前增加防护:

if (storageDims == nullptr || storageDimsNum == 0) {
    return AsdSip::ErrorType::ACL_ERROR_INVALID_PARAM;
}

并考虑遍历全部维度校验 > 0。建议补 1 条 0 维张量负向 UT。

Environment / 环境信息

  • 位置: core/utils/common_check.cpp:93
  • 调用方: 全部使用 SIP_OP_CHECK_INVALID_SHAPE 的 BLAS 入口
likedislike
east_yang成员
13 天前 评论:

感谢您的反馈,当前@east_yang跟踪处理中。

likedislike
Ssyy_3597
13 天前 关联了pull request:fix: 修复代码审查发现的健壮性与文档问题(#96-#105)
CANN-robotCANN-robot成员
12 天前 关闭了 issue
CANN-robotCANN-robot成员
12 天前 添加了label:resolved