mj_recompile 使用新的关节类型宽度读取旧的关节状态
作者: peachtree0222创建于 2026年9月15日更新于 2026年9月15日
标签bug
介绍
顿!
我正在测试状态的连续性 通过现场的`mjSpec'计划变化。 在“mj 再编译”之前,将现有的接头从链条改为免费,使国家保存读取了新的接头宽度的旧“mjData”。
我的设置
- MujoCo源建自
main' at10124d5d9dca411ec3c8988aa1e3b619103d71bb' - 消费物价指数,双精度
- Ubuntu 24.04.5 LTS, Linux 7.0.0-28-generic x86 64
- 普通海合会 11.5.0建筑和海合会 13.3.0 地址管理员构建
这是怎么回事? 你想怎样?
在改变联合类型后,我期望`mj 再编译'要么从新模型默认中初始化不相容的新坐标计划,要么进行有文件记录的转换,要么拒绝过渡。 它不应被读取超越旧的联合州.
拯救国'使用联合变异的spec.type'来得到nq=7'和nv=6',而qposadr '和dofadr '仍然处理旧的一要素链条状态。 正常的构建静默地将链角还原为自由联合翻译,并在前置处理前创建无效的零之四:
页:1 结果=0 nq=7 nv=6 qpos=0.25,0,0,0,0 qvel=0.5,0,0,0,0,0 xpos=0.25,0,0 xquat=1,0,0 qacc=0,0,0,0
地址管理员构建报告 :
页:1
错误: 地址安全器: 使用后漏洞
规模读取法 56
#7 mjCModel::save State. src/user/user model.cc:4090 (英语).
#8 mj 再编译. src/user/user api.cc:332相关来源:
- https://GitHub.com/google-deepmind/mujoco/blob/10124d5d9dca411ec3c8988aaa1e3b619103d71bb/src/user/user api.cc#L324-L350
- https://GitHub.com/google-deepmind/mujoco/blob/10124d5d9dca411ec3c8988aa1e3b619103d71bb/src/user/user model.cc#L4076-L4095
- https://GitHub.com/google-deepmind/mujoco/blob/10124d5d9dca411ec3c8988aaa1e3b619103d71bb/src/user-objects.h#L728-L742
- 复制步骤
- 建立上述承诺的正常状态,并与SelfSanitizer合作。
- 使用 " poc/README.md " 汇编每个建筑的 " poc/reducer.cc " 。
- 运行正常的二进制并观察物理上被误解的状态.
- 运行已消毒的二进制并观察在 " Save State " 中读取的56字节无效。
复制包:
[编译-联合-类型-width-overread-poc.zip] (https://GitHub.com/user-attachments/files/3221302/ 编译-联合-类型-width-overread-poc.zip).
最小复制模型
完整的无资产MJCF被嵌入到复制器中. 它有一个身体,一个锁链和一个球体。
复制所需的编码
参看所附的`poc/ reproducer.cc'。 安全生产固定办法应保留旧编的图案,同时节约状态,并制订不相容的联合型过渡政策。 我包括了设计笔记 而不是一个猜测的补丁。
++ 确认
内容来源: google-deepmind/mujoco