Closed
[Bug-Report|缺陷反馈]: aclnnCat / aclnnChunkCat 空 TensorList 零退分支返回 ACLNN_SUCCESS 未写 *workspaceSize #3554
liuhanwen8Add on  28 days agoClosed at  26 days ago
liuhanwen8
liuhanwen8
28 days ago Create

现象

aclnnCatGetWorkspaceSize / aclnnChunkCatGetWorkspaceSize 在「入参为空 TensorList」的零退分支上,函数返回 ACLNN_SUCCESS 但没有写入出参 *workspaceSize,导致该成功路径下调用方读到的是未初始化值。

代码位置

conversion/concat_d/op_api/aclnn_cat.cpp(aclnnCatGetWorkspaceSize,当前 master):

if (tensorList != nullptr && tensorList->Size() == 0) {
    uniqueExecutor.ReleaseTo(executor);
    return ACLNN_SUCCESS;          // <- 未写 *workspaceSize
}
...
*workspaceSize = uniqueExecutor->GetWorkspaceSize();   // 其它成功路径均写入
uniqueExecutor.ReleaseTo(executor);
return ACLNN_SUCCESS;

conversion/chunk_cat/op_api/aclnn_chunk_cat.cpp(aclnnChunkCatGetWorkspaceSize,当前 master)同型:

if (tensors->Size() == 0) {
    uniqueExecutor.ReleaseTo(executor);
    return ACLNN_SUCCESS;          // <- 未写 *workspaceSize
}
...
*workspaceSize = uniqueExecutor->GetWorkspaceSize();   // 其它成功路径均写入

两处零退分支在成功返回前缺少 *workspaceSize = 0;。同一目录下其余零退分支(正常路径及其它空 tensor 分支)均先写 *workspaceSize 再返回,此处属遗漏、并非有意让渡。

影响

  • 两段式接口约定:GetWorkspaceSize 成功返回时应给出 workspace 大小。调用方若按常见写法 uint64_t workspaceSize;(未初始化)声明,再 if (workspaceSize > 0) aclrtMalloc(...),则命中空 TensorList 路径时会读取未初始化值:
    • 若恰为 0:不分配 workspace,行为正常;
    • 若为较大的垃圾值:aclrtMalloc 大概率失败,本应成功的空算子被误判为运行时错误;
    • 其它值:二段传入与分配不一致的 (workspace, workspaceSize),属未定义行为。
  • 该缺陷不产生错误数据(空列表路径无任何写点),也不造成内存泄漏(ReleaseTo 已执行)。
  • 与库内其余零退路径口径不一致,属契约完备性缺口。

复现(宿主机侧,无需设备执行空路径)

环境:CANN 9.2.0-beta.2,libopapi_math.so 内含 aclnnCatGetWorkspaceSize / aclnnChunkCatGetWorkspaceSize 符号。

以 aclCreateTensorList(nullptr, 0) 构造空列表,workspaceSize 预置为哨兵值,直接调用:

# 对照(invalid 参数,证明函数体确实执行)
dim!=0 : rc=161002 (ACLNN_ERR_PARAM_INVALID), workspaceSize 未变
# 空 TensorList + 合法参数
aclnnChunkCatGetWorkspaceSize: rc=0 workspaceSize=0xdeadbeefcafebabe unchanged=True
aclnnCatGetWorkspaceSize:      rc=0 workspaceSize=0xdeadbeefcafebabe unchanged=True

即两个接口都在成功返回(rc=0)的同时保持 workspaceSize 原值不变,与源码漏写一致;dim!=0 → 161002 的对照排除了「库未执行」的可能。

期望行为

空 TensorList 零退成功路径也应写入 *workspaceSize = 0(与同仓其它零退路径对齐),保证任意成功返回后调用方都能读到确定的 workspace 大小。

修复建议

aclnn_cat.cpp 与 aclnn_chunk_cat.cpp 的两处零退分支,在 ReleaseTo(executor) 之前补 *workspaceSize = 0;。

环境

  • CANN 9.2.0-beta.2
  • 仓库:cann/ops-math(当前 master 仍存在;报告中最早基线提交亦复现)
likedislike
liuhanwen8liuhanwen8
28 days ago Added label: bug-report
陈思
陈思Collaborators
28 days ago Comments:

您好,感谢反馈!

核查 cann/ops-math master 8f1aae7e1927 的 Cat 和 ChunkCat 实现,两处空列表成功分支确实仅释放 executor 所有权后返回,未写入 *workspaceSize;正常路径则会写入执行器计算出的大小。这可以解释您观察到的成功返回后哨兵值保持不变。

Cat 的触发范围还包括 EraseDim1EmptyTensor 将所有一维空 Tensor 过滤后得到空列表的情况,不仅是原始列表长度为 0。ChunkCat 的该分支位于 dim、numChunks 和列表指针检查之后,需要保留这些已有的非法参数返回行为。

一个直接的处理方向是在两处空列表成功返回前写入 *workspaceSize = 0,保留 executor 的交接,并以非零哨兵覆盖原始空列表及 Cat 过滤后为空两条路径。这项修改解决的是 workspace 出参未定义,与 #3555 的输出形状校验问题需分别处理。我们会持续跟踪。

likedislike
Yyue-maCollaborators
28 days ago Assign L_Euler as responsible person
TtangkaidiCollaborators
27 days ago Assign tangkaidi as responsible person
tangkaidiCollaborators
27 days ago Comments:

您好,感谢您的关注和反馈!
当前代码确实存在issue中存在的问题,aclnn_cat.cpp 与 aclnn_chunk_cat.cpp均无入参为空时对workspaceSize的赋值为0操作。
将会尽快合入代码,修复此问题。

likedislike
TtangkaidiCollaborators
27 days ago Associated pull request
CANN-robotCANN-robotCollaborators
26 days ago Close issue
CANN-robotCANN-robotCollaborators
26 days ago Added label: resolved