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


Sep 20 Assign tgwsakiko_ as responsible person
Sep 30 Close issue
Sep 30 Added label: resolved
周云飞
26 days ago Comments:
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的返回码/出参指针条件,附带其他格式改动。)
本次仅核验源码与关联差分,未复跑原场景;具体安装版本是否包含变更需以其源码版本区分。


问题描述
aclnnAlltoAllvGroupedMatMulV2GetWorkspaceSize(mc2/allto_allv_grouped_mat_mul/op_api/aclnn_allto_allv_grouped_mat_mul_v2.cppL218-227)在调用aclnnInnerAlltoAllvGroupedMatMulGetWorkspaceSize之后:executor非空即解引用*executor:调用方直连 C API 传executor = nullptr时,host 侧空指针解引用崩溃;ret:Inner 失败(ret != ACLNN_SUCCESS,executor 处于未赋值/未定义状态)时,仍读取*executor并调用NnopbaseSetUserHandle,属于对无效对象的未定义行为。影响范围
mc2/allto_allv_grouped_mat_mul/op_api/aclnn_allto_allv_grouped_mat_mul_v2.cppL218-227(master @8c49f3c核实,与报告基线01b3f4a2行号一致)aclnnAlltoAllvGroupedMatMulV2GetWorkspaceSize/aclnnAlltoAllvGroupedMatMulV2源码片段(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;问题机理
*executor != nullptr前未判executor(出参指针)形参本身非空:直连 C API 场景调用方传 nullptr 即崩;ret仅打日志:Inner 失败路径下 executor 状态未定义,L223-226 仍执行NnopbaseSetUserHandle;虽然 L227return 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) {触发条件与风险评估
executor = nullptr(绕过 torch_npu 封装时可达)→ host 崩溃;GetWorkspaceSize失败(ret != ACLNN_SUCCESS)→ 对未定义 executor 执行NnopbaseSetUserHandle;修复建议
补齐三段条件(对齐同仓既有范式):
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一致),欢迎维护者复核。