已关闭
【缺陷报告】数据类型截断 - 文件brc_inline_api.h - 函数BinaryBrcInlineApiWithTwoVectorizedAxis - 行号43 #258
zhangjunkai9创建于  20 天前关闭于  4 天前
zhangjunkai9
20 天前 创建

缺陷信息

缺陷类型dataTypeTruncation (数据类型截断)
函数BinaryBrcInlineApiWithTwoVectorizedAxis
文件autofuse/ascendc/api/brc_inline_api.h
行号43
置信度86%

缺陷描述

函数 BinaryBrcInlineApiWithTwoVectorizedAxis 的入参 first_axis_v_stride(int64_t)在第43行除以 elem_in_one_block(int64_t,=32/dtype_size)后,结果直接赋值给 uint8_t dst_repeat_stride。该值用作硬件指令 BinaryRepeatParams 的 dst_repeat_stride 参数(8位字段)。当 first_axis_v_stride 超过 255*elem_in_one_block(如 float 类型时 255*8=2040 个元素)时,除法结果超过 255,高位被截断,导致硬件使用错误的 stride 值。代码中虽有 while(block>255) 循环处理 repeat times 溢出,但对 stride 参数无任何范围检查。调用方(codegen/binary_api_call.cpp:172)传入 tpipe.tiler.ActualSize(v_strides) 作为 stride 值,无范围保证。

事实核查

核查1-模式成立:第43行 uint8_t dst_repeat_stride = first_axis_v_stride / elem_in_one_block 将 int64_t 除法结果赋值给 uint8_t,无范围检查,截断模式真实存在。
核查2-防护无效:第50行 while(block>255) 仅处理 repeat times 溢出,对 stride 参数无任何范围校验。
核查3-函数可达:codegen/binary_api_call.cpp:172 生成对该函数的调用,传入 tpipe.tiler.ActualSize(v_strides) 作为 first_axis_v_stride。
核查4-触发无法证实满足:first_axis_v_stride 来自符号化 tiling 值(y.vectorized_strides),当 first_axis_v_stride > 255*elem_in_one_block(float 时 >2040 元素)时截断。
该条件在常见张量形状下可能成立,但调用方实参为符号化 tiling 值,无法在当前代码中确认具体触发路径。
属假设性缺陷,调用方实参存在模糊(可能触发未证实),对应 confidence 锚点 0.86。

数据流证据

Source(问题源头)

autofuse/ascendc/api/brc_inline_api.h:20 行 const int64_t first_axis_v_stride 作为函数入参传入(来自 codegen binary_api_call.cpp:172 tpipe.tiler.ActualSize(v_strides),tiling 符号值,无范围约束)

Sink(问题爆发点)

autofuse/ascendc/api/brc_inline_api.h:43 行 uint8_t dst_repeat_stride = first_axis_v_stride / elem_in_one_block 将 int64_t 除法结果赋值给 uint8_t(若结果>255 则高位截断,用作硬件指令 stride 参数)

传播路径:

# 文件 行号 说明
1 autofuse/ascendc/api/brc_inline_api.h 20 const int64_t first_axis_v_stride 作为函数入参接收(无范围校验,来自 codegen tiling stride 值)
2 autofuse/ascendc/api/brc_inline_api.h 28 int64_t elem_in_one_block = 32 / dtype_size 计算每 block 元素数(float 时为 8,half 时为 16)
3 autofuse/ascendc/api/brc_inline_api.h 43 uint8_t dst_repeat_stride = first_axis_v_stride / elem_in_one_block 将 int64_t 结果截断为 uint8_t(sink,无范围检查,stride>255 时高位丢失)

调用链

可达调用链1 起点:(entry functions) → 终点:BinaryBrcInlineApiWithTwoVectorizedAxis 深度:0

# 文件 函数 函数起始行 调用点行
1 autofuse/ascendc/api/brc_inline_api.h BinaryBrcInlineApiWithTwoVectorizedAxis 14

修复建议

uint32_t dst_repeat_stride_full = static_cast<uint32_t>(first_axis_v_stride / elem_in_one_block);
ASCENDC_ASSERT(dst_repeat_stride_full <= UINT8_MAX, {
  KERNEL_LOG(KERNEL_ERROR, "dst_repeat_stride exceeds 255: %u", dst_repeat_stride_full);
});
uint8_t dst_repeat_stride = static_cast<uint8_t>(dst_repeat_stride_full);
likedislike
Wwangmingming成员
20 天前 将 gcw_V3YyYBt1 设为负责人
wangmingming成员
20 天前 评论:

你好,感谢建议, 后续分析处理

likedislike
m0_56712298m0_56712298
12 天前 关联了pull request:fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260)
Wwangmingming成员
4 天前 issue状态由 进行中 改变为 已完成
Wwangmingming成员
4 天前 关闭了 issue