已关闭
[Bug-Report|缺陷反馈]: TopKV2 Host InferShape 接受非法 k 并生成越界输出 shape #2814
KaranocaVe创建于 8月24日关闭于 11 天前
8月24日 添加了label:bug-report
8月24日 关联了pull request:[Fix] 修复 TopKV2 Host InferShape 的 k 范围校验和错误码
陈思
8月24日 评论:
8月24日 评论:
/assign @KaranocaVe


8月24日 将 KaranocaVe 设为负责人
9月21日 修改了issue 的描述
11 天前 关闭了 issue
11 天前 添加了label:resolved
KaranocaVe
8 天前 评论:
8 天前 评论:
@pingchuantang @yue-ma 您好,这个 Issue 对应的修复已经合入:https://gitcode.com/cann/ops-math/merge_requests/4987
开发者计划反馈,Issue 需要有 Accepted 标签才能计入积分,仅关闭或标记 resolved 还不够。目前这条 Issue 尚未标记 Accepted,麻烦您结合问题和已合入的修复复核一下;确认符合受理条件后,帮忙补上 Accepted 标签。
感谢您的支持!


问题描述
在
cann/ops-math的固定源码版本中,TopKV2 的 Host InferShape 只校验输入 rank和
dim,没有校验动态输入k是否为非负值且不超过排序轴长度。仓库的top_k_v2_proto.h要求输入最后一维至少为k,同仓 TopK/TopKV2D 文档也规定0 <= k <= x[dim];AICPU 运行时还会对这两个非法方向返回参数错误。然而,Host InferShape 对
x=[2,32]接受k=33和k=-1,并分别生成[2,33]、[2,-1]的两个输出 shape。这样非法输入在图形状阶段被标记为成功,后续阶段才可能失败或携带非法 shape 继续处理,Host 与运行时的参数契约不一致。
环境信息
cann/ops-math/0a2ce5b57caec6068d9e5658b740c2d41482aa15重现步骤
0a2ce5b57caec6068d9e5658b740c2d41482aa15。top_k_v2:启用ENABLE_TEST=TRUE、OP_HOST_UT=TRUE、ASCEND_COMPUTE_UNIT=ascend950和ENABLE_UT_EXEC=TRUE。TopKV2注册 InferShape 回调上构造输入xshape[2,32]、标量k,dim=-1,输出预留两个 Tensor。k=32、k=33和k=-1,执行过滤器TopKV2InferShape.*。预期结果
k=32应返回GRAPH_SUCCESS并生成[2,32]。对于k=33和k=-1,应返回GRAPH_FAILED或等价参数错误,不应生成超过输入轴长度或为负的输出维度。实际结果
Host InferShape 返回
GRAPH_SUCCESS:k=32:输出[2,32];k=33:输出[2,33];k=-1:输出[2,-1]。固定源码 Host UT 构建运行 12/12 通过;重复过滤运行 4/4 通过,退出码均为 0。非法
用例的测试日志明确记录为
actual_contract_probe=GRAPH_SUCCESS。日志/最小复现
源码定位:
math/top_k_v2/op_host/top_k_v2_infershape.cpp:25-67,其中InferShapeForTopKCommon在:58-62直接将k写入输出 shape。约束定位:math/top_k_v2/op_graph/top_k_v2_proto.h:29;运行时参数检查可见math/top_k_v2_d/op_kernel_aicpu/top_k_v2_d_aicpu.cpp:551-557。关键结果:
影响与规避方式
影响是非法参数未在形状推导阶段被拒绝,可能使后续图校验、内存规划或运行期才暴露
错误,增加定位成本并造成 Host/运行时行为差异。临时规避是调用方在提交 TopKV2 前
自行保证
0 <= k <= x[dim];不应依赖 Host InferShape 来替换该校验。建议的回归测试
补充
k=0、k=dim_size、k=dim_size+1、k=-1和dim为负数的 Host InferShape测试,要求合法边界成功、两个非法方向明确返回失败,并同时覆盖 INT32/INT64 的
k输入路径(适用于支持该类型的 TopKV2 变体)。
关联 PR