已关闭
【缺陷报告】数组索引越界 - 文件exp_segsum_grad_tiling.cpp - 函数GetNeedCoreNum - 行号139 #2782
zhangjunkai9创建于  17 天前关闭于  13 天前
zhangjunkai9
17 天前 创建

缺陷信息

缺陷类型arrayIndexOutOfBounds (数组索引越界)
函数GetNeedCoreNum
文件math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp
行号139
置信度90%

缺陷描述

needCoreNum由CeilA2B(batches, averageBatches)计算,当coreNumPlatform > MAX_CORE_CONT(50)时,needCoreNum可超过50,导致第139-142行batchStart[coreIndex]和batchEnd[coreIndex]越界写入。arch35版本在RunTiling中已有防御性截断(if (coreNumPlatform > EXP_SEGSUM_GRAD_MAX_CORE_ARCH35) coreNumPlatform = EXP_SEGSUM_GRAD_MAX_CORE_ARCH35),但arch22版本缺少此保护。Ascend 910B的AIV核数可达64以上,因此needCoreNum完全可能超过50。

事实核查

经复核确认缺陷属实。

arch22版本的RunBigKernelTiling(第87-95行)直接将compileInfo->coreNum传入GetNeedCoreNum,未做截断。

GetNeedCoreNum(第135-143行)中needCoreNum可达coreNumPlatform值,for循环以needCoreNum为上界访问batchStart[coreIndex]/batchEnd[coreIndex],而这两个数组大小仅为MAX_CORE_CONT=50(定义于exp_segsum_grad_tiling.h:23)。

arch35版本(exp_segsum_grad_tiling_arch35.cpp:148-149)已有防御性截断if (coreNumPlatform > EXP_SEGSUM_GRAD_MAX_CORE_ARCH35) coreNumPlatform = EXP_SEGSUM_GRAD_MAX_CORE_ARCH35,arch22版本缺少此保护。

Ascend 910B的AIV核数可达64+,needCoreNum超过50时将越界写入。

调用链Tiling4ExpSegsumGrad->RunBigKernelTiling->GetNeedCoreNum可达。

数据流证据

Source(问题源头)

math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp:93 行 uint32_t coreNumPlatform = compileInfo->coreNum 从编译信息获取平台核数,Ascend 910B上可达64+

Sink(问题爆发点)

math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp:139-141 行 batchStart[coreIndex]和batchEnd[coreIndex]写入,当needCoreNum>MAX_CORE_CONT(50)时越界

传播路径:

# 文件 行号 说明
1 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp 189-192 Tiling4ExpSegsumGrad作为入口调用tilingObject.RunBigKernelTiling()
2 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp 87-95 RunBigKernelTiling调用GetNeedCoreNum(coreNumPlatform),未对coreNumPlatform做截断
3 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp 93 coreNumPlatform = compileInfo->coreNum 未截断,可能>50
4 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp 137-138 averageBatches = CeilA2B(batches, coreNumPlatform); needCoreNum = CeilA2B(batches, averageBatches) needCoreNum可达coreNumPlatform(即>50)
5 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp 139-141 for循环以needCoreNum为上界,访问batchStart[coreIndex]/batchEnd[coreIndex],数组大小仅MAX_CORE_CONT(50)

调用链

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

# 文件 函数 函数起始行 调用点行
1 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp:optiling: Tiling4ExpSegsumGrad 189 192
2 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp:optiling::ExpSegsumGradTiling: RunBigKernelTiling 87 95
3 math/exp_segsum_grad/op_host/arch22/exp_segsum_grad_tiling.cpp:optiling::ExpSegsumGradTiling: GetNeedCoreNum 135

修复建议

void ExpSegsumGradTiling::GetNeedCoreNum(uint32_t coreNumPlatform)
{
    if (coreNumPlatform > MAX_CORE_CONT) {
        coreNumPlatform = MAX_CORE_CONT;
    }
    int64_t averageBatches = CeilA2B(batches, coreNumPlatform);
    needCoreNum = CeilA2B(batches, averageBatches);
    for (int64_t coreIndex = 0; coreIndex < needCoreNum; coreIndex++) {
        batchStart[coreIndex] = coreIndex * averageBatches;
        batchEnd[coreIndex] = std::min((coreIndex + 1) * averageBatches, batches);
    }
}
likedislike
陈思
陈思成员
17 天前 评论:

分析结论

已核对当前 master。arch22 路径的 batchStart/batchEnd 固定容量为 50,GetNeedCoreNum 前确实没有像 arch35 路径那样做显式上限裁剪,这属于防御性缺口。

但 Issue 以“Ascend 910B 的 AIV 核数可达 64+”证明越界可达,目前未提供对应平台资料或实测值;现有代码路径属于 arch22,而 64 核上限来自另一架构路径的可能性较高。因此暂不能确认受支持的 arch22 平台上 coreNum > 50,也不能认定越界已可达。

建议后续无论平台值如何都按数组容量显式裁剪或校验;同时请补充具体 SoC、GetCoreNumAiv()/compileInfo 实测值及复现,便于确认影响范围。

likedislike
Nice tryNice try成员
13 天前 将 Nice_try 设为负责人
Nice tryNice try成员
13 天前 关联了pull request:fix(exp_segsum_grad): clamp coreNumPlatform to MAX_CORE_CONT in arch22 tiling, harden arch22 tiling against zero-size inputs and null pointers.
CANN-robotCANN-robot成员
13 天前 关闭了 issue
CANN-robotCANN-robot成员
13 天前 添加了label:resolved