🤖 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 的调用流程为:
- 第 45 行先调用 CheckAlltoAllInputPara(comm, sendBuf, sendCount, sendType, recvBuf, recvCount, recvType, stream)
- 第 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.ccsrc/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 结合代码分析自动生成,仅供参考。


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


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


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:CheckAlltoAllInputParasrc/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 - 1HCCL_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 / 必填)
可通过当前源码静态确认:
src/ops/all_to_all_v/all_to_all_v_op.cc中的CheckAlltoAllInputPara。sendType和recvType均为HCCL_DATA_TYPE_RESERVED。sendType访问DATATYPE_SIZE_TABLE[sendType]。src/ops/op_common/inc/alg_param.h,可见DATATYPE_SIZE_TABLE的数组长度为HCCL_DATA_TYPE_RESERVED。DATATYPE_SIZE_TABLE[HCCL_DATA_TYPE_RESERVED]的下标等于数组长度,属于越界访问。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 溢出计算。
Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
本问题为静态代码检查发现,本次未执行 HCCL/NPU,因此无运行时日志。
相关源码证据:
src/ops/all_to_all_v/all_to_all_v_op.ccCheckAlltoAllInputPara在 datatype 合法性检查之前使用:DATATYPE_SIZE_TABLE[sendType]src/ops/op_common/inc/alg_param.hDATATYPE_SIZE_TABLE的数组长度为:HCCL_DATA_TYPE_RESERVED因此当
sendType == HCCL_DATA_TYPE_RESERVED时,下标等于数组长度。CheckDataType用于处理非法 datatype,但当前 AlltoAll 调用顺序中,该检查发生在上述数组访问之后。静态审查 commit:
aa1d9935fa68e08f73502a60b1bd181e9849e6beSpecial notes for this issue/备注 (Optional / 选填)
本问题基于当前 master 的控制流和数组定义完成静态确认,未进行运行时验证。
建议修复方向:
在
CheckAlltoAllInputPara使用DATATYPE_SIZE_TABLE[sendType]前先校验 datatype 合法性,或统一通过带合法性检查的 datatype-size 获取接口访问数据类型大小。建议补充参数校验单元测试,覆盖:
HCCL_DATA_TYPE_RESERVED