# MoveIt2 PlanningScene子帧数组长度不一致导致SIGSEGV崩溃

> 原文链接：https://robotics.hellobike.com/pitfalls/2026-11-03-moveit2-3939
> 频道：pitfalls | 更新日期：2026-11-03 | 标签：auto, github-issue, moveit2
> 核心摘要：MoveIt2处理CollisionObject时未校验subframe_poses与subframe_names长度，致越界崩溃；需手动添加一致性检查或确保输入合法。

# MoveIt2 PlanningScene子帧数组长度不一致导致SIGSEGV崩溃

::: v-pre
> 本文由 AI 根据公开内容整理，可能有误，请以原文为准：[Missing bounds check for collision object subframe names](https://github.com/moveit/moveit2/issues/3939)（GitHub ros-planning/moveit2 #3939）

**状态**：有绕过办法

## 问题

在moveit_core/planning_scene.cpp的processCollisionObjectMsg（行1616–1620）和processAttachedCollisionObjectMsg（行1925–1933）中，遍历subframe_poses时直接索引subframe_names而未校验两向量长度相等。

## 环境

MoveIt 2.15.2源码编译，ROS 2 Rolling，Ubuntu 22.04；涉及moveit_core/planning_scene模块的CollisionObject ADD及AttachedCollisionObject处理路径。

## 解决办法

1. 在调用PlanningScene接口前，严格校验消息中object.subframe_poses.size() == object.subframe_names.size()，不等则拒绝提交并报错。
2. 若具备源码修改权限，参照moveit_core/robot_state/src/conversions.cpp第271行逻辑，在上述两处循环前增加if (object.subframe_poses.size() != object.subframe_names.size()) { RCLCPP_ERROR(...); return; }防护。
3. 使用AddressSanitizer或边界检查STL配置运行GTest验证修复有效性，避免畸形输入导致进程崩溃。

讨论原作者：@Huangguanyao 等，版权归原作者所有。
:::

## 原始参考来源 (Sources)

- [GitHub ros-planning/moveit2 #3939：Missing bounds check for collision object subframe names](https://github.com/moveit/moveit2/issues/3939)