Closed
[Bug-Report|缺陷反馈]: aclnnAlltoAllvGroupedMatMulV2 op_api 出参 executor 先用后判且不看 Inner 返回值 #5481
liuhanwen8Add on  Sep 20Closed at  Sep 30
liuhanwen8
liuhanwen8
Sep 20 Create

问题描述

aclnnAlltoAllvGroupedMatMulV2GetWorkspaceSize(mc2/allto_allv_grouped_mat_mul/op_api/aclnn_allto_allv_grouped_mat_mul_v2.cpp L218-227)在调用 aclnnInnerAlltoAllvGroupedMatMulGetWorkspaceSize 之后:

  1. 未判出参形参 executor 非空即解引用 *executor:调用方直连 C API 传 executor = nullptr 时,host 侧空指针解引用崩溃;
  2. 不检查 Inner 返回值 ret:Inner 失败(ret != ACLNN_SUCCESS,executor 处于未赋值/未定义状态)时,仍读取 *executor 并调用 NnopbaseSetUserHandle,属于对无效对象的未定义行为。

影响范围

  • 文件:mc2/allto_allv_grouped_mat_mul/op_api/aclnn_allto_allv_grouped_mat_mul_v2.cpp L218-227(master @ 8c49f3c 核实,与报告基线 01b3f4a2 行号一致)
  • 接口:aclnnAlltoAllvGroupedMatMulV2GetWorkspaceSize / aclnnAlltoAllvGroupedMatMulV2
  • 模式:通用-空指针(先用后判,FP-B04 子型)

源码片段(L218-227,原样)

aclnnStatus ret = aclnnInnerAlltoAllvGroupedMatMulGetWorkspaceSize(
    gmmX, gmmWeight, ..., workspaceSize, executor);
OP_LOGD("AlltoAllvGroupedMatmul, aclnnInnerAlltoAllvGroupedMatMulGetWorkspaceSize ret %d.", ret);
if (*executor != nullptr) {
    void *args = reinterpret_cast<void *>(static_cast<uintptr_t>(commModeEnum));
    NnopbaseSetUserHandle(*executor, args);
}
return ret;

问题机理

  • L223 判 *executor != nullptr 前未判 executor(出参指针)形参本身非空:直连 C API 场景调用方传 nullptr 即崩;
  • L222 对 ret 仅打日志:Inner 失败路径下 executor 状态未定义,L223-226 仍执行 NnopbaseSetUserHandle;虽然 L227 return ret 会把错误码传回调用方,但对无效/未定义 executor 的 SetUserHandle 调用本身是未定义行为。

同仓标准范式(修复对齐)

同仓至少 5 处(allto_all_matmul/op_api/allto_all_quant_matmul_base.cpp:546、allto_all_matmul_base.cpp:284、matmul_all_reduce/op_api/aclnn_weight_quant_matmul_all_reduce_v2.cpp:407 等)均采用三段条件:

if (ret == ACLNN_SUCCESS && executor != nullptr && *executor != nullptr) {

触发条件与风险评估

  • 触发 1:调用方直连 C API 传 executor = nullptr(绕过 torch_npu 封装时可达)→ host 崩溃;
  • 触发 2:Inner GetWorkspaceSize 失败(ret != ACLNN_SUCCESS)→ 对未定义 executor 执行 NnopbaseSetUserHandle;
  • 规范调用(torch_npu 封装路径)下 executor 形参非空,故常规训练/推理链路不触达——据此排除「有意设计」。严重度:中高;置信度:中高(静态推演,崩溃路径建议单测/NPU 实测确认)。

修复建议

补齐三段条件(对齐同仓既有范式):

if (ret == ACLNN_SUCCESS && executor != nullptr && *executor != nullptr) {
    void *args = reinterpret_cast<void *>(static_cast<uintptr_t>(commModeEnum));
    NnopbaseSetUserHandle(*executor, args);
}

备注

本报告为静态源码推演结论(master @ 8c49f3c,L218-227 与周报基线 01b3f4a2 一致),欢迎维护者复核。

likedislike
weihao18Collaborators
Sep 20 Comments:

/assign @tgwsakiko_

likedislike
CANN-robotCANN-robotCollaborators
Sep 20 Assign tgwsakiko_ as responsible person
CANN-robotCANN-robotCollaborators
Sep 30 Close issue
CANN-robotCANN-robotCollaborators
Sep 30 Added label: resolved
周云飞
周云飞Collaborators
26 days ago Comments:

PR #12952已合入master;其实际diff在aclnnAlltoAllvGroupedMatMulV2GetWorkspaceSize把*executor读取和SetUserHandle放在ret==ACLNN_SUCCESS && executor!=nullptr && *executor!=nullptr条件下。固定快照与该diff一致,覆盖Issue所述空出参和Inner失败访问风险。没有执行API异常路径测试。

源码依据:源码位置1
关联PR:#12952(已合入 master;修正GetWorkspaceSize的返回码/出参指针条件,附带其他格式改动。)
本次仅核验源码与关联差分,未复跑原场景;具体安装版本是否包含变更需以其源码版本区分。

likedislike