core/fft/fft_api.cpp 中 matchC2C_(:1167)与 matchC2R_(:1203)的循环:
matchC2C_
matchC2R_
int64_t lastDim = static_cast<int64_t>(tensorDimSize) - 1; int64_t i = lastDim; for (auto iterPtr = plan.fftSizes.rbegin(); iterPtr != plan.fftSizes.rend(); iterPtr++, i--) { int64_t dim = dims[i]; // <- 当 plan.fftSizes 维度数 > 输入张量维度数时, i 变为负 ...
当输入张量维度数小于 plan 的 fftSizes 维度数(例如 2D plan 传入 1 维张量)时,i 会递减为负,dims[i] 造成数组越界读——读到栈上随机数据,可能误判通过(越界值恰好相等)进而以错误 shape 进入计算,或直接崩溃。
i
dims[i]
对比:同文件 commonMatchFunc()(:544)已有正确防护:
commonMatchFunc()
if (static_cast<int64_t>(plan.fftSizes.size()) > last + 1) { return false; }
这两个函数缺失同样的保护。matchC2C_/matchC2R_ 被 asdFftExecC2C/asdFftExecC2R/asdFftExecR2C 全部执行入口调用。
asdFftExecC2C
asdFftExecC2R
asdFftExecR2C
仅维度不匹配的异常输入触发;触发即越界读。照抄同文件已验证的防护逻辑,正常输入路径零改动,无回归风险。
在两函数循环前补充与 commonMatchFunc() 相同的维度数前置校验。建议补 1 条低维输入负向 UT。
感谢您的反馈,当前@east_yang跟踪处理中。
Describe the current behavior / 问题描述
core/fft/fft_api.cpp 中
matchC2C_(:1167)与matchC2R_(:1203)的循环:int64_t lastDim = static_cast<int64_t>(tensorDimSize) - 1; int64_t i = lastDim; for (auto iterPtr = plan.fftSizes.rbegin(); iterPtr != plan.fftSizes.rend(); iterPtr++, i--) { int64_t dim = dims[i]; // <- 当 plan.fftSizes 维度数 > 输入张量维度数时, i 变为负 ...当输入张量维度数小于 plan 的 fftSizes 维度数(例如 2D plan 传入 1 维张量)时,
i会递减为负,dims[i]造成数组越界读——读到栈上随机数据,可能误判通过(越界值恰好相等)进而以错误 shape 进入计算,或直接崩溃。对比:同文件
commonMatchFunc()(:544)已有正确防护:if (static_cast<int64_t>(plan.fftSizes.size()) > last + 1) { return false; }这两个函数缺失同样的保护。
matchC2C_/matchC2R_被asdFftExecC2C/asdFftExecC2R/asdFftExecR2C全部执行入口调用。Impact / 影响
仅维度不匹配的异常输入触发;触发即越界读。照抄同文件已验证的防护逻辑,正常输入路径零改动,无回归风险。
Suggested fix / 修复建议
在两函数循环前补充与
commonMatchFunc()相同的维度数前置校验。建议补 1 条低维输入负向 UT。Environment / 环境信息