已关闭
[Bug] dynamic_quant_base.h 空 else 块导致变量未初始化即使用 #2077
shermanrowena创建于  4月15日关闭于  4月30日
shermanrowena
4月15日 创建

问题描述

quant/dynamic_quant/op_kernel/dynamic_quant_base.hInitSmallShapeParams 函数中,当 blockIdx >= tilingData_.coreNum 时,进入空的 else 块,此后变量 multiRowNumloopCntremainRow 均未被初始化,但后续第 149 行立即使用了这些变量,导致未定义行为。

问题位置

文件:quant/dynamic_quant/op_kernel/dynamic_quant_base.h,第 130–149 行

错误代码

if (blockIdx < tilingData_.headCoreNum) {
    multiRowNum = tilingData_.multiRowNumHeadCore;
    loopCnt = rowPerHeadCore / multiRowNum;
    remainRow = rowPerHeadCore % multiRowNum;
} else if (blockIdx >= tilingData_.headCoreNum && blockIdx < tilingData_.coreNum) {
    multiRowNum = tilingData_.multiRowNumTailCore;
    loopCnt = rowPerTailCore / multiRowNum;
    remainRow = rowPerTailCore % multiRowNum;
} else {
    // 空块!multiRowNum/loopCnt/remainRow 未初始化
}
sizeHalfLen = (tilingData_.rowLen + FIFTEEN) / SIXTEEN * SIXTEEN;
// 后续使用了未初始化的 multiRowNum、loopCnt、remainRow

影响

当 blockIdx >= coreNum 时,后续使用 multiRowNumloopCntremainRow 的代码行为未定义,可能导致数组越界、死循环或结果错误。

修复建议

在 else 块中添加对多余核的早退出逻辑(例如 return;),或初始化变量为安全默认值:

} else {
    return; // blockIdx 超出有效核范围,直接返回
}

严重程度

高(未定义行为,可能导致 NPU 卡死或计算结果错误)

likedislike
CANN-robotCANN-robot成员
4月15日 添加了label:bug
Cchenqi317成员
4月24日 将 zhajianqing123 设为负责人
chenqi317成员
4月24日 评论:

loopCnt 默认为0,不存在未初始化的动作。 代码可以去掉else{}判断
@zhajianqing123 请安排修改

likedislike
Zzhajianqing123成员
4月25日 将 liujie12345678 设为负责人
Zzhajianqing123成员
4月25日 移除了负责人 zhajianqing123
Lliujie12345678成员
4月25日 将 cuijie25 设为负责人
cuijie成员
4月25日 评论:

已移除else{}判断,loopCnt为0的场景,后续计算均不会有问题 @shermanrowena 请确认,若无问题将关闭此Issue

likedislike
Ccuijie成员
4月30日 issue状态由 进行中 改变为 已完成
Ccuijie成员
4月30日 关闭了 issue
CANN-robotCANN-robot成员
4月30日 添加了label:Accepted
CANN-robotCANN-robot成员
4月30日 添加了label:resolved