已关闭
[Bug-Report|缺陷反馈]: aclnn_nan_median.cpp 200-201行,空指针校验像是校验错了变量,需分析 #5862
liuhanwen8创建于  9月15日关闭于  9月17日
liuhanwen8
liuhanwen8
9月15日 创建

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

Describe the current behavior / 问题描述 (Mandatory / 必填)

https://gitcode.com/cann/ops-nn/blob/master/index/nan_median/op_api/aclnn_nan_median.cpp

200-201行,空指针校验是否校验错了变量,需分析

static aclnnStatus ExecZeroDimNum(const aclTensor* self, int64_t dim, aclTensor* valuesOut, aclTensor* indicesOut,
aclOpExecutor* executor)
{
CHECK_RET(CheckDimValue(self, dim), ACLNN_ERR_PARAM_INVALID);

auto valueCopyResult = l0op::ViewCopy(self, valuesOut, executor);
CHECK_RET(valueCopyResult != nullptr, ACLNN_ERR_INNER_NULLPTR);

// 标量的索引直接返回0
auto indicesOutZero = l0op::ZerosLike(indicesOut, executor);
CHECK_RET(indicesOut != nullptr, ACLNN_ERR_INNER_NULLPTR);

auto indicesCopyResult = l0op::ViewCopy(indicesOutZero, indicesOut, executor);
CHECK_RET(indicesCopyResult != nullptr, ACLNN_ERR_INNER_NULLPTR);

return ACLNN_SUCCESS;

}

Environment Information / 环境信息 (Mandatory / 必填)

白盒检视,不涉及

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

白盒检视,不涉及

Describe the expected behavior / 预期结果 (Mandatory / 必填)

白盒检视,不涉及

白盒检视,不涉及

Special notes for this issue/备注 (Optional / 选填)

likedislike
zjl5071
9月15日 评论:

信息来源声明:以下分析基于昇腾知识图谱(ascend.wiki)检索结果与 ops-nn 仓库代码走查。

结论:报告属实。aclnn_nan_median.cpp L201 的空指针校验确实校验错了变量——校验了上游已保证非空的出参 indicesOut,而 ZerosLike 的返回值 indicesOutZero 未被校验,守卫形同虚设。 属低严重度健壮性缺陷:正常路径无影响,l0 算子构建失败路径下 nullptr 会流入后续 ViewCopy。

依据:

  1. 上游调用链 aclnnNanMedianDimGetWorkspaceSize(L209)→ CheckParamsDim(median_common.cpp)第 1 步 CheckNotNullDim(self, valuesOut, indicesOut) 已对三个指针做空检查(返回 ACLNN_ERR_PARAM_NULLPTR),因此进入 ExecZeroDimNum 时 indicesOut 必然非空,L201 的 CHECK_RET(indicesOut != nullptr, ...) 是恒真死检查;
  2. 真正可能为空的是 L200 l0op::ZerosLike(indicesOut, executor) 的返回值 indicesOutZero(l0 算子构建失败时返回 nullptr)。若其为空,L203 l0op::ViewCopy(indicesOutZero, indicesOut, executor) 将收到 nullptr 首参——本应在 L201 拦截并返回 ACLNN_ERR_INNER_NULLPTR 的分支永远不会触发;
  3. 对照同函数的成对模式可确认是笔误:L196-197(valueCopyResult 生成后查空)、L203-204(indicesCopyResult 生成后查空)查的都是刚生成的返回值,唯独 L201 查了出参;
  4. 同族 aclnn_median.cpp 无 ZerosLike 调用(标量路径处理不同),该问题仅存在于 nan_median。

修复建议(一行):

auto indicesOutZero = l0op::ZerosLike(indicesOut, executor);
CHECK_RET(indicesOutZero != nullptr, ACLNN_ERR_INNER_NULLPTR);

顺带发现同文件一处错误码不一致(可顺手修):L176-177 对内部 ViewCopy 失败返回 ACLNN_ERR_PARAM_NULLPTR,而同函数 L172 对同类内部失败返回 ACLNN_ERR_INNER_NULLPTR——内部算子失败建议统一 ACLNN_ERR_INNER_NULLPTR,避免用户把内部错误误判为入参传空。

(昇腾知识图谱接入方式:https://gitcode.com/agent0/kg-tools)

likedislike
yuning_chenyuning_chen成员
9月15日 将 BruceLP 设为负责人
yuning_chen
yuning_chen成员
9月15日 评论:

您好,问题已收到,目前 @BruceLP 正在处理中。

likedislike
黄黄晓彬成员
9月16日 关联了pull request:fix(index): resolve median and kth_value codecheck issues
CANN-robotCANN-robot成员
9月17日 关闭了 issue
CANN-robotCANN-robot成员
9月17日 添加了label:resolved
黄黄晓彬成员
9月18日 关联了pull request:[9.2.0] feat/fix/perf: 回合 kth_value、median、nan_median 迁移与优化