已关闭
【缺陷报告】空指针解引用 - 文件aclnn_modulate_backward.cpp - 函数CheckDimension - 行号117 #5016
zhangjunkai9创建于  8月24日关闭于  28 天前
zhangjunkai9
8月24日 创建

缺陷信息

缺陷类型nullptrDeref (空指针解引用)
函数CheckDimension
文件vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp
行号117
置信度90%

缺陷描述

函数 CheckDimension 的参数 scale 和 shift 为可选参数,可为 nullptr(源码注释 line 151 明确说明 scale和shift参数可以为空)。在第 116-117 行的 if 条件中,scale->GetStorageFormat() 和 shift->GetStorageFormat() 被直接调用而无空指针校验。由于 C++ 的短路求值,当 input 和 grad_output 的格式均为 FORMAT_ND(op 定义的默认格式)时,前两个条件为 false,继续求值 scale->GetStorageFormat(),若 scale 为 nullptr 则触发空指针解引用。同一函数后续(line 120, 132)使用 CheckNotNullForScaleAndShift 保护 scale/shift,说明开发者知道可为空但此处遗漏。注意:entry_callchain 指向的是 binary_cross_entropy 文件中的同名模板函数 CheckDimension(静态分析误匹配),实际调用路径为 aclnnModulateBackwardGetWorkspaceSize(line 164) -> CheckParams(line 175) -> CheckDimension(line 159),在文件内可达。

事实核查

核查1:缺陷模式成立。

第117行 scale->GetStorageFormat() != Format::FORMAT_ND 直接解引用 scale,当 scale 为 nullptr 时空指针解引用;

同理 shift。

核查2:无有效防护,同函数 line 120/132 使用 CheckNotNullForScaleAndShift 保护 scale/shift 的后续解引用,但 line 116-117 的格式检查遗漏。

核查3:函数可达,aclnnModulateBackwardGetWorkspaceSize:175->CheckParams:159->CheckDimension。

核查4:触发可满足——scale/shift 为可选参数可为 nullptr(line 151 注释确认),当 scale=nullptr 且 input 和 grad_output 格式均为 FORMAT_ND(默认格式)时,|| 前两个条件为 false,短路失败继续求值 scale->GetStorageFormat() 触发空指针解引用崩溃

数据流证据

Source(问题源头)

vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp:164 行 aclnnModulateBackwardGetWorkspaceSize(const aclTensor* grad_output, const aclTensor* input, const aclTensor* scale, const aclTensor* shift, ...) 接收 scale 和 shift 作为可选参数(可能为 nullptr 的外部输入)

Sink(问题爆发点)

vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp:117 行 scale->GetStorageFormat() != Format::FORMAT_ND 直接解引用可能为 nullptr 的 scale(空指针解引用 sink)

传播路径:

# 文件 行号 说明
1 vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp 164 aclnnModulateBackwardGetWorkspaceSize 接收 scale/shift 作为可选参数(可能为 nullptr 的外部输入)
2 vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp 175 auto ret = CheckParams(grad_output, input, scale, shift, grad_input, grad_scale, grad_shift) 将 scale/shift 传递给 CheckParams
3 vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp 151 注释(scale和shift参数可以为空) 确认 scale/shift 可为 nullptr
4 vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp 152 CHECK_RET(CheckNotNull(grad_output, input, grad_input), ACLNN_ERR_PARAM_NULLPTR) 仅检查 grad_output/input/grad_input 非空,未检查 scale/shift
5 vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp 159 CHECK_RET(CheckDimension(grad_output, input, scale, shift), ACLNN_ERR_PARAM_INVALID) 将未校验非空的 scale/shift 传入 CheckDimension
6 vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp 116 input->GetStorageFormat() != Format::FORMAT_ND || grad_output->GetStorageFormat() != Format::FORMAT_ND || 当 input 和 grad_output 格式均为 ND 时前两个条件为 false,短路失败继续求值后续条件
7 vfusion/modulate_grad/op_host/op_api/aclnn_modulate_backward.cpp 117 scale->GetStorageFormat() != Format::FORMAT_ND 直接解引用可能为 nullptr 的 scale(sink);同函数 line 120/132 后续使用 CheckNotNullForScaleAndShift 保护,此处遗漏

调用链

可达调用链1 起点:(entry functions) → 终点:CheckDimension 深度:2

# 文件 函数 函数起始行 调用点行
1 activation/log_sigmoid/op_api/aclnn_binary_cross_entropy_with_logits_target_backward.cpp aclnnBinaryCrossEntropyWithLogitsTargetBackwardGetWorkspaceSize 350 363
2 activation/log_sigmoid/op_api/aclnn_binary_cross_entropy_with_logits_target_backward.cpp CheckParams 227 235
3 activation/log_sigmoid/op_api/aclnn_binary_cross_entropy_with_logits_target_backward.cpp CheckDimension 34

修复建议

static bool CheckDimension(const aclTensor* grad_output, const aclTensor* input, const aclTensor* scale,
                           const aclTensor* shift)
{
    auto gradoutput_Shape = grad_output->GetViewShape();
    //检查Format
    if (input->GetStorageFormat() != Format::FORMAT_ND || grad_output->GetStorageFormat() != Format::FORMAT_ND ||
        (scale != nullptr && scale->GetStorageFormat() != Format::FORMAT_ND) ||
        (shift != nullptr && shift->GetStorageFormat() != Format::FORMAT_ND)) {
        OP_LOGW("Format only support ND");
    }
    // ... rest of function unchanged
likedislike
zhangqijia1
8月24日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
8月24日 将 gcw_SUaZx3UQ 设为负责人
Zzhangqijia1
29 天前 关联了pull request:fix(modulate_grad): 修复 aclnnModulateBackward 中 scale/shift 空指针解引用
CANN-robotCANN-robot成员
28 天前 关闭了 issue
CANN-robotCANN-robot成员
28 天前 添加了label:resolved