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


8月24日 将 gcw_SUaZx3UQ 设为负责人
29 天前 关联了pull request:fix(modulate_grad): 修复 aclnnModulateBackward 中 scale/shift 空指针解引用
28 天前 关闭了 issue
28 天前 添加了label:resolved
缺陷信息
缺陷描述
函数 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 起点:
(entry functions)→ 终点:CheckDimension深度:2修复建议
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