已关闭
【缺陷报告】空指针解引用 - 文件aclnn_logdet.cpp - 函数aclnnLogdetGetWorkspaceSize - 行号165 #2776
zhangjunkai9创建于  8月20日关闭于  7 天前
zhangjunkai9
8月20日 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数aclnnLogdetGetWorkspaceSize
文件math/logdet/op_host/op_api/aclnn_logdet.cpp
行号165
置信度90%

缺陷描述

aclnnLogdetGetWorkspaceSize 中,LogMatrixDeterminant 返回 tuple 的第一个元素 signValue 未做空指针校验即在第 165 行传入 l0op::Log(signValue, ...),而 Log 函数会解引用 signValue(self->GetViewShape())。同函数第 169 行对第二个元素 logValue 做了 CHECK_RET(logValue != nullptr, ...) 校验,但该校验位于 signValue 使用之后,无法保护 signValue。若 LogMatrixDeterminant 返回 tuple(nullptr, nullptr)(AllocTensor 失败或 ADD_TO_LAUNCHER_LIST_AICPU 失败时),signValue 在第 165 行被 l0op::Log 解引用时将崩溃。对比 aclnn_slogdet.cpp 第 162-165 行对 signValue 和 logValue 均做了 nullptr 校验。

事实核查

经复核 aclnn_logdet.cpp:160-165 行,LogMatrixDeterminant 返回 tuple 后 signValue 在第161行提取,第165行直接传入 l0op::Log() 而无 nullptr 校验。

Log 函数内部(log.cpp:62-65)会对 self 调用 GetViewShape() 解引用,若 signValue 为 nullptr 将崩溃。

LogMatrixDeterminant 函数(log_matrix_determinant.cpp:54-55)确实在 AllocTensor 失败时返回 tuple(nullptr, nullptr)。

对比 aclnn_slogdet.cpp:162-165 对 signValue 和 logValue 均有 CHECK_RET 校验,此处 signValue 校验确实遗漏。

第169行的 logValue 校验位于 signValue 使用之后,无法保护前者。

缺陷真实存在。

数据流证据

Source(问题源头)

math/logdet/op_host/op_api/aclnn_logdet.cpp:160 行 auto logMatrixDeterminantOut = l0op::LogMatrixDeterminant(selfReshapeOut, uniqueExecutor.get()) LogMatrixDeterminant 在内部 AllocTensor 失败时返回 tuple(nullptr, nullptr)

Sink(问题爆发点)

math/logdet/op_host/op_api/aclnn_logdet.cpp:165 行 auto offset = l0op::Log(signValue, ...) Log 函数内部 self->GetViewShape() 解引用 signValue(nullptr 解引用 sink)

传播路径:

# 文件 行号 说明
1 math/logdet/op_host/op_api/aclnn_logdet.cpp 160 l0op::LogMatrixDeterminant(selfReshapeOut, uniqueExecutor.get()) 返回 tuple,元素可能为 nullptr
2 math/logdet/op_host/op_api/aclnn_logdet.cpp 161 auto signValue = std::get<0>(logMatrixDeterminantOut) 提取第一个元素赋给 signValue(可能为 nullptr)
3 math/logdet/op_host/op_api/aclnn_logdet.cpp 165 l0op::Log(signValue, ...) 直接传入未校验的 signValue,Log 内部 self->GetViewShape() 解引用(nullptr 解引用 sink),此时第 169 行的 logValue nullptr 校验尚未执行

修复建议

auto signValue = std::get<0>(logMatrixDeterminantOut);
CHECK_RET(signValue != nullptr, ACLNN_ERR_INNER_NULLPTR);
auto offset = l0op::Log(signValue, LOG_BASE, LOG_SCALE, LOG_SHIFT, uniqueExecutor.get());
likedislike
陈思
陈思成员
8月21日 评论:

根因确认

已核对当前 master。Logdet 流程先把 signValue 传给 Log,之后才检查 signValue 是否为空;因此分配/前序节点失败时,空指针已先进入下游调用,后置判空无保护作用,告警成立。

修复时应把 signValue 判空移到首次使用之前,并覆盖前序结果为空的 executor 构图失败路径。后续由责任人安排修复和验证。

likedislike
OpenGood_WeChatOpenGood_WeChat
8月30日 关联了pull request:Fix logdet null-pointer dereference (#2776)
陈思陈思成员
28 天前 将 gcw_LxlU8H9L 设为负责人
陈思陈思成员
28 天前 移除了负责人 gcw_LxlU8H9L
陈思陈思成员
28 天前 将 gcw_LxlU8H9L 设为负责人
OpenGood_WeChat
OpenGood_WeChat
28 天前 评论:

感谢确认根因!本人认领该问题,修复 PR 已提交:#5216(将 signValue 判空移至首次使用之前,与上述修复建议方向一致),已通过 CLA 与 CI,正在等待检视合入,合入后本 issue 将自动关闭。

likedislike
liuchenghao
liuchenghao
17 天前 评论:

【Multica 同步】状态:backlog(已建单跟踪);说明:该修复任务已同步至 Multica「CANN 算子开发迁移」项目跟踪;已知悉社区侧认领状态与在途修复 PR(#5216),Multica 侧是否承接将先与社区协调,避免重复开发;详情:AI4ME-130

likedislike
ayuemoonayuemoon
10 天前 关联了pull request:fix(logdet): validate signValue before Log (#2776)
liu-wei
liu-wei成员
7 天前 评论:

该问题已经合入,issue关闭。

likedislike
liu-weiliu-wei成员
7 天前 issue状态由 进行中 改变为 已完成
liu-weiliu-wei成员
7 天前 关闭了 issue