已关闭
【2026 HCCL通信库创新大赛-东北赛区】【这是什么地方汪汪汪汪汪汪】 HcclAlltoAll 在校验数据类型前访问 DATATYPE_SIZE_TABLE #674
hongleiW创建于  9月1日关闭于  9月18日
hongleiW
hongleiW
9月1日 创建

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

Describe the current behavior / 问题描述 (Mandatory / 必填)

HcclAlltoAll 的参数检查流程中,CheckAlltoAllInputPara 在确认 sendType 是否为合法 HcclDataType 之前,就使用 sendType 作为下标访问 DATATYPE_SIZE_TABLE。

问题位置:

  • src/ops/all_to_all_v/all_to_all_v_op.cc:CheckAlltoAllInputPara
  • src/ops/op_common/inc/alg_param.h:DATATYPE_SIZE_TABLE

当前检查逻辑中存在:

sendCount > UINT64_MAX / DATATYPE_SIZE_TABLE[sendType]

而 DATATYPE_SIZE_TABLE 的数组长度为 HCCL_DATA_TYPE_RESERVED,因此其有效下标范围是:

0 ~ HCCL_DATA_TYPE_RESERVED - 1

HCCL_DATA_TYPE_RESERVED 本身是非法/保留的数据类型枚举值。

当 sendType 和 recvType 同时传入 HCCL_DATA_TYPE_RESERVED 时,前面的类型相等性检查可以通过,随后代码会访问:

DATATYPE_SIZE_TABLE[HCCL_DATA_TYPE_RESERVED]

此时下标等于数组长度,属于 one-past-the-end 越界访问。

当前 CheckDataType 的调用发生在 CheckAlltoAllInputPara 之后,因此无法在该数组访问前拦截非法 datatype。

对于非法 datatype,预期应进入已有的参数错误处理流程,而不应在参数校验阶段发生数组越界访问。

Environment / 环境信息 (Mandatory / 必填)

代码版本:HCCL master

静态审查基线:
aa1d9935fa68e08f73502a60b1bd181e9849e6be
本问题通过当前 master 中的参数检查顺序、数据类型枚举定义和数组边界完成静态确认。未进行 HCCL/CANN/NPU 运行时验证,该问题的成立不依赖具体硬件环境。

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

可通过当前源码静态确认:

  1. 查看 src/ops/all_to_all_v/all_to_all_v_op.cc 中的 CheckAlltoAllInputPara。
  2. 令 sendType 和 recvType 均为 HCCL_DATA_TYPE_RESERVED。
  3. 两个 datatype 相等,因此可以通过类型一致性检查。
  4. 随后代码使用 sendType 访问 DATATYPE_SIZE_TABLE[sendType]。
  5. 查看 src/ops/op_common/inc/alg_param.h,可见 DATATYPE_SIZE_TABLE 的数组长度为 HCCL_DATA_TYPE_RESERVED。
  6. 因此 DATATYPE_SIZE_TABLE[HCCL_DATA_TYPE_RESERVED] 的下标等于数组长度,属于越界访问。
  7. 外层 CheckDataType 在上述访问之后才执行,因此非法 datatype 无法在数组访问前被拦截。

运行环境具备后,可补充 host 侧参数校验测试:向 AlltoAll 传入两个 HCCL_DATA_TYPE_RESERVED,确认接口应直接返回 datatype 参数错误。

Describe the expected behavior / 预期结果 (Mandatory / 必填)

所有来自公共 API 的 HcclDataType 参数,都应在用于访问 DATATYPE_SIZE_TABLE 前完成合法性校验。

对于 HCCL_DATA_TYPE_RESERVED 或其他非法 datatype,应直接返回项目已有的参数错误或不支持错误码,例如 HCCL_E_NOT_SUPPORT,而不应使用非法枚举值作为数组下标。

建议先完成 datatype 合法性检查,再进行 datatype size 和 count 溢出计算。

本问题为静态代码检查发现,本次未执行 HCCL/NPU,因此无运行时日志。

相关源码证据:

  1. src/ops/all_to_all_v/all_to_all_v_op.cc

CheckAlltoAllInputPara 在 datatype 合法性检查之前使用:

DATATYPE_SIZE_TABLE[sendType]

  1. src/ops/op_common/inc/alg_param.h

DATATYPE_SIZE_TABLE 的数组长度为:

HCCL_DATA_TYPE_RESERVED

因此当 sendType == HCCL_DATA_TYPE_RESERVED 时,下标等于数组长度。

  1. HCCL 已有 CheckDataType 用于处理非法 datatype,但当前 AlltoAll 调用顺序中,该检查发生在上述数组访问之后。

静态审查 commit:

aa1d9935fa68e08f73502a60b1bd181e9849e6be

Special notes for this issue/备注 (Optional / 选填)

本问题基于当前 master 的控制流和数组定义完成静态确认,未进行运行时验证。

建议修复方向:

在 CheckAlltoAllInputPara 使用 DATATYPE_SIZE_TABLE[sendType] 前先校验 datatype 合法性,或统一通过带合法性检查的 datatype-size 获取接口访问数据类型大小。

建议补充参数校验单元测试,覆盖:

  • HCCL_DATA_TYPE_RESERVED
  • 其他非法/保留枚举值
  • 合法 datatype
  • 合法 datatype 下现有的 count 溢出边界
likedislike
hongleiWhongleiW
9月1日 修改了issue 的描述
Leewis成员
9月2日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
9月2日 将 Leewis 设为负责人
Leewis成员
9月2日 评论:

🤖 AI Issue 分析报告

判定结果: ✅ 确认为有效问题

问题类型: bug
严重程度: medium
置信度: 93%

📋 问题摘要

HcclAlltoAll 参数校验中 CheckAlltoAllInputPara 在 CheckDataType 之前访问 DATATYPE_SIZE_TABLE[sendType],当 sendType=HCCL_DATA_TYPE_RESERVED 时触发数组越界访问

🔍 根因分析

在 src/ops/all_to_all_v/all_to_all_v.cc 中,HcclAlltoAll 的调用流程为:

  1. 第 45 行先调用 CheckAlltoAllInputPara(comm, sendBuf, sendCount, sendType, recvBuf, recvCount, recvType, stream)
  2. 第 56 行后才调用 CheckDataType(recvType, false)

在 CheckAlltoAllInputPara 函数(第 456-493 行)内部:

  • 第 477-482 行检查 sendType != recvType,若不等则返回 HCCL_E_PARA
  • 第 488-490 行执行溢出检查:sendCount > UINT64_MAX / DATATYPE_SIZE_TABLE[sendType]

关键问题:当 sendType 和 recvType 同时传入 HCCL_DATA_TYPE_RESERVED 时:

  • 第 477 行的 sendType != recvType 检查通过(两者相等)
  • 第 489 行直接访问 DATATYPE_SIZE_TABLE[sendType] = DATATYPE_SIZE_TABLE[HCCL_DATA_TYPE_RESERVED]

在 src/ops/op_common/inc/alg_param.h 中,DATATYPE_SIZE_TABLE 的定义为:
constexpr uint32_t DATATYPE_SIZE_TABLE[HCCL_DATA_TYPE_RESERVED] = {sizeof(int8_t), ...}

数组长度为 HCCL_DATA_TYPE_RESERVED,有效下标范围是 0 ~ HCCL_DATA_TYPE_RESERVED-1。使用 HCCL_DATA_TYPE_RESERVED 作为下标等于数组长度,属于 one-past-the-end 越界访问(undefined behavior)。

结合 HCCL 知识库:DATATYPE_SIZE_TABLE 是 HCCL 参数校验体系中的核心数据结构,用于将元素数量转换为字节大小。AlltoAll 系列算子的参数定义中 sendType/recvType 为 HcclDataType 枚举,HCCL_DATA_TYPE_RESERVED 是该枚举的保留/非法值。参数校验的正确顺序应为先验证数据类型合法性,再使用数据类型访问大小表。

📁 涉及的文件/模块

  • src/ops/all_to_all_v/all_to_all_v.cc
  • src/ops/op_common/inc/alg_param.h

💡 建议的修复方案

方案一(推荐):将 CheckDataType 调用移到 CheckAlltoAllInputPara 之前。在 HcclAlltoAll 函数中,将第 56 行的 CHK_RET(CheckDataType(recvType, false)) 移到第 45 行 CheckAlltoAllInputPara 调用之前,同时对 sendType 也执行 CheckDataType。

方案二:在 CheckAlltoAllInputPara 内部访问 DATATYPE_SIZE_TABLE 之前增加数据类型合法性检查。在第 489 行之前添加:
CHK_PRT_RET(sendType >= HCCL_DATA_TYPE_RESERVED,
HCCL_ERROR("sendType[%u] is invalid", sendType), HCCL_E_PARA);

方案一更彻底,因为 CheckDataType 本身就是用于此目的的公共校验函数,将其前置可以从源头拦截所有非法数据类型。

⚠️ 风险提示

风险低。移动 CheckDataType 调用顺序不影响正常参数的处理流程,仅增加了对非法数据类型的提前拦截。需确认 CheckDataType 不依赖 CheckAlltoAllInputPara 中设置的任何状态(当前代码中两者无状态依赖)。建议补充 UT:向 HcclAlltoAll 传入 sendType=recvType=HCCL_DATA_TYPE_RESERVED,验证返回 HCCL_E_PARA 而非触发越界访问。

👤 责任田分配

src/ops/all_to_all_v/ → @(coll-ops) - AlltoAll/AlltoAllV/AlltoAllVC 算子实现

  • src/ops/all_to_all_v/all_to_all_v.cc

src/ops/ → @(coll-ops) - 集合通信算子实现(all_reduce/all_gather/broadcast/reduce_scatter/send/recv 等)

  • src/ops/op_common/inc/alg_param.h

⏳ 等待人工确认

请以上负责人确认此问题:

  • 确认有效 → 添加标签 pending-confirmation 被替换为 confirmed,或直接评论 /confirm
  • 确认后 AI 将自动生成修复 PR
  • 如非有效问题 → 关闭 Issue 或评论 /reject

此报告由 AI 结合代码分析自动生成,仅供参考。

likedislike
LLeewis成员
9月2日 关联了看板:HCCL
LLeewis成员
9月2日 关联了看板:HCCL
LLeewis成员
9月15日 将 cuishuang1 设为负责人
LLeewis成员
9月15日 移除了负责人 Leewis
LLeewis成员
9月16日 添加了label:Scored
Leewis成员
9月16日 评论:

@hlw246 同学你好,当前所提问题已确认,后续对应问题将由开发组同事处理,对应积分将正常计算,thx;

likedislike
ccs
ccs成员
9月16日 评论:

1.问题已确认
2.修复预计本周上库

likedislike
ccsccs成员
9月17日 关联了pull request:[fix] AlltoAll入口在访问DATATYPE_SIZE_TABLE前校验sendType合法性,修复数组越界 [9.2.0 backport]
此处折叠了6条事件消息 查看更多
ccsccs成员
9月17日 关联了pull request:[fix] AlltoAll入口在访问DATATYPE_SIZE_TABLE前校验sendType合法性,修复数组越界
Leewis成员
9月18日 评论:

https://gitcode.com/cann/hccl/pull/3136 相关PR已上库;
修改方案:
在溢出检查访问 DATATYPE_SIZE_TABLE 之前,新增 sendType 合法性校验,
不合法时直接返回 HCCL_E_PARA:

likedislike
LLeewis成员
9月18日 issue类型由 任务 改变为 缺陷
LLeewis成员
9月18日 issue状态由 待办的 改变为 已验收
LLeewis成员
9月18日 关闭了 issue
CANN-robotCANN-robot成员
9月18日 添加了label:resolved
LLeewis成员
9月21日 移除了看板:HCCL