已关闭
【缺陷报告】数据类型截断 - 文件concat.h - 函数GenMaskReg - 行号256 #260
zhangjunkai9创建于 8月20日关闭于 14 天前
8月20日 将 gcw_V3YyYBt1 设为负责人
wangmingming
8月20日 评论:
8月20日 评论:
你好,感谢建议, 后续分析处理


24 天前 关联了pull request:fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260)
14 天前 issue状态由 进行中 改变为 已完成
14 天前 关闭了 issue
缺陷信息
缺陷描述
函数 GenMaskReg 在第 256 行计算 tail_mask = (1U << (tail_num * sizeof(U))) - 1U,其中 1U 为 unsigned int(32 位),移位结果为 32 位无符号整数。但 tail_mask 声明为 uint16_t(16 位),赋值时高位被截断。U 的类型由 ConcatExtend 第 363 行决定:using U = std::conditional_t<sizeof(T) == sizeof(uint32_t), uint32_t, uint16_t>。当 U = uint16_t(sizeof=2)时,tail_num = gather_mask_dim_size % 16,取值 0-15,tail_num * 2 取值 0-30,当 tail_num > 8 时掩码需要超过 16 位;当 U = uint32_t(sizeof=4)时,tail_num = gather_mask_dim_size % 8,取值 0-7,tail_num * 4 取值 0-28,当 tail_num > 4 时掩码需要超过 16 位。截断后的 tail_mask 被存入 index_addr[i](uint32_t *),高 16 位始终为 0,导致 Gather 操作使用错误的掩码,可能读取/写入错误数据。调用链验证:ConcatExtendDyn:548 → ConcatExtend:389 → ScatterInputPadded:307 → GenMaskReg:248,从入口可达。
事实核查
数据流证据
传播路径:
调用链
可达调用链1 起点:
(entry functions)→ 终点:AscendC::MicroAPI::GenMaskReg深度:3修复建议
const uint32_t tail_mask = (1U << (tail_num * sizeof(U))) - 1U;