已关闭
【缺陷报告】容器访问越界 - 文件sort_merge_sort.h - 函数Process - 行号344 #2781
zhangjunkai9创建于 8月20日关闭于 8月26日
陈思
8月21日 评论:
8月21日 评论:
分析结论
当前材料不足以认定存在可达越界。Ascend C GetBlockIdx() 的合法范围是 [0, GetBlockNum()),因此正常运行时 blockIdx_ == GetBlockNum() 不会发生;Issue 将该等值情况作为可达输入的前提不成立。官方接口说明:https://www.hiascend.com/document/detail/zh/canncommercial/900/API/ascendcopapi/atlasascendc_api_07_0185.html
当前 if (blockIdx_ > GetBlockNum()) 对合法 block index 实际上是不可触发的冗余保护,改成 >= 可以提升代码表达和防御性,但不能据此证明现有代码在正常调度下会越界。若有自定义启动参数能让该等值情况出现,请补充最小复现和 blockDim 配置。


8月25日 将 ConanHuang 设为负责人
8月26日 关闭了 issue
8月26日 添加了label:resolved
缺陷信息
缺陷描述
sort_merge_sort.h 第344行使用
if (blockIdx_ > GetBlockNum()) return;作为边界保护,但同目录下 sort_radix_sort_one_core.h 第151行使用if (blockIdx_ >= realCoreNum_),sort_axis_one_copy.h 第106行使用if (blockIdx_ >= blockDim_)等均使用 >= 比较。当 blockIdx_ 恰好等于 GetBlockNum() 时,该保护不会触发 return,该核会继续执行后续的 ProcessSingleBlockSort 循环,其中第303行tileOffset = blockIdx_ * numTileData_ * oneCoreRowNum_和第337行answerTileOffset = blockIdx_ * outputLastDimValue_ * oneCoreRowNum_会使用该无效 blockIdx_ 计算偏移,导致全局内存越界访问。事实核查
数据流证据
传播路径:
修复建议
if (blockIdx_ >= GetBlockNum()) { return; }