03-内存异常

本文件汇总该版本中归类为内存异常的历史修复,重点包括 UAF、悬空指针、空指针、野指针、越界访问和对象引用清理异常等问题。

1. ModalHostView 销毁与窗口变化竞态导致 m_state 为空

  • 修改日期:2025-03-27
  • 版本:0.77.18
  • 问题描述:ModalHostViewComponentInstance 在快速销毁且窗口尺寸变化时,m_state 可能为空,造成空指针 crash。
  • 影响模块:ModalHostViewComponentInstance
  • 问题类型:Null Pointer Crash
  • 提交 / PR:d48299d53 / !721
  • 详细内容:修复通过补充 m_state 判空,确保窗口变化等异步事件到达时,组件仍处于有效状态。

2. ModalHostView 更新屏幕方向时 m_eventEmitter 为空导致崩溃

  • 修改日期:2025-04-07
  • 版本:0.77.18
  • 问题描述:ModalHostViewComponentInstance::updateDisplaySize() 在屏幕方向变化时直接调用 m_eventEmitter->onOrientationChange(),当组件销毁或 emitter 尚未就绪时会触发空指针 crash。
  • 影响模块:ModalHostViewComponentInstance
  • 问题类型:Null Pointer Crash
  • 提交 / PR:6f8db2cac / !766
  • 详细内容:修复在 updateDisplaySize() 内为 m_eventEmitter->onOrientationChange(...) 增加判空保护,避免窗口变化事件在组件 teardown 之后继续落到已失效的 emitter 上。

3. UI tick 订阅回调捕获实例裸指针导致 UAF

  • 修改日期:2025-04-11
  • 版本:0.77.18
  • 问题描述:RNInstanceInternal::onAnimationStarted() 里注册的 UI tick 回调捕获了实例裸指针,实例释放后投递到 MAIN 线程的迟到任务仍会调用 onUITick,导致 use-after-free 崩溃。
  • 影响模块:RNInstanceInternal / Animated
  • 问题类型:UAF Crash
  • 提交 / PR:fe72ed2ed / !790
  • 详细内容:修复把提交到 MAIN 线程的 lambda 从直接捕获 this 改成捕获 weak_from_this(),任务执行前先将弱引用锁成 shared_ptr,只有实例仍然存活时才继续调用 onUITick,从而避免 UI ticker 的迟到回调访问已释放实例。

4. m_eventEmitter 为空导致崩溃

  • 修改日期:2025-05-06
  • 版本:0.77.18
  • 问题描述:某些伙伴应用场景下,事件发送路径上的 m_eventEmitter 为空,导致 crash。
  • 影响模块:ComponentInstance / EventEmitter
  • 问题类型:Null Pointer Crash
  • 提交 / PR:7c8e1f407 / !874
  • 详细内容:修复增加空指针保护,避免在 emitter 尚未就绪或已经释放时继续走事件派发流程。

5. ScrollView 删除全部 item 后越界崩溃

  • 修改日期:2025-06-27
  • 版本:0.77.18
  • 问题描述:当 ScrollView 配置 maintainVisibleContentPosition 且子项被全部删除后,代码仍尝试读取第一个可见子节点,导致越界或空指针 crash。
  • 影响模块:ScrollViewComponentInstance
  • 问题类型:CPPCrash
  • 提交 / PR:1b82ab22e / !1204
  • 详细内容:修复点是为 getFirstVisibleView 增加空集合保护,列表已清空时直接返回,不再继续获取子节点信息。

6. removeChild 低概率 SIGSEGV

  • 修改日期:2025-08-11
  • 版本:0.77.18
  • 问题描述:removeChild() 在低概率场景下会因为 findByTag() 返回空指针而触发 SIGSEGV。
  • 影响模块:ComponentInstance / ComponentInstanceRegistry
  • 问题类型:SIGSEGV
  • 提交 / PR:c5f4f8638 / !1392
  • 详细内容:修复是在移除子节点前先判断查询结果是否有效,从而把低概率 native crash 收敛为安全返回。

7. EventBeat 在关闭阶段持有悬空调度器引用

  • 修改日期:2025-09-23
  • 版本:0.77.22
  • 问题描述:shutdown 过程中 UITicker 仍可能触发 EventBeat::induce(),而其依赖的 RuntimeScheduler 已先被销毁,导致悬空引用 crash。
  • 影响模块:EventBeat / RuntimeScheduler / UITicker
  • 问题类型:Dangling Reference Crash
  • 提交 / PR:2df264852 / !1595
  • 详细内容:修复将 RuntimeScheduler 改为 weak_ptr 持有,并在 request() 与私有 induce() 中先尝试锁定,再进入基类逻辑,从而只在调度器仍然存活时继续执行。

8. AnimatedNodesManager::runUpdates 空指针解引用

  • 修改日期:2025-10-11
  • 版本:0.77.33
  • 问题描述:AnimatedNodesManager::runUpdates 中发生空指针解引用,引发 C++ crash。
  • 影响模块:AnimatedNodesManager
  • 问题类型:Null Pointer Dereference
  • 提交 / PR:550ada855 / !1665
  • 详细内容:修复点直接是在更新路径上增加空指针判断,属于高频稳定性治理中的典型防御式边界判断。

9. insertChild 空指针与越界保护补充

  • 修改日期:2025-10-18
  • 版本:0.77.33
  • 问题描述:insertChild 场景下除了已有子节点空指针风险外,m_children.insert 还存在越界访问可能。
  • 影响模块:ComponentInstance
  • 问题类型:Null Pointer / Out-of-Bounds
  • 提交 / PR:af594db33 / !1687
  • 详细内容:该提交在现有判空之外补充了索引边界保护,避免插入位置非法时直接破坏子节点容器状态。

10. 图片回调晚于实例销毁导致悬空 URI 崩溃

  • 修改日期:2026-01-08
  • 版本:0.77.44
  • 问题描述:图片加载完成回调在 JS 线程异步执行时,可能晚于 ImageComponentInstance 销毁,导致回调里读取 m_imageSource.uri.c_str() 时访问悬空指针。
  • 影响模块:ImageComponentInstance
  • 问题类型:Dangling Pointer Crash
  • 提交 / PR:ac5add422 / !1949
  • 详细内容:修复通过在 lambda capture 中按值拷贝 URI 字符串,保证回调拥有独立有效的内存,不再依赖主线程对象生命周期。

11. JSVMPointerValue 链表与引用清理异常

  • 修改日期:2026-03-07
  • 版本:0.77.59
  • 问题描述:JSVMPointerValue 链表与引用清理路径存在异常,导致 pointer value 生命周期管理失衡并触发 crash。
  • 影响模块:JSVMRuntime / JSVMPointerValue
  • 问题类型:CPPCrash
  • 提交 / PR:3683e2ab3 / !2338
  • 详细内容:结合后续 UAF 修复可见,这一批问题集中出现在 JSVM pointer wrapper 的清理边界。该提交属于边界处理与资源释放逻辑加固。

12. JSVM 销毁阶段 UAF 导致崩溃

  • 修改日期:2026-03-12
  • 版本:0.77.59
  • 问题描述:JSVMRuntime 销毁时,JSVMPointerValue 链表释放顺序不正确,导致在 VM 已销毁或正在销毁阶段继续触发引用清理,存在 use-after-free 风险。
  • 影响模块:JSVMRuntime / JSVMPointerValue
  • 问题类型:UAF Crash
  • 提交 / PR:8707f1395 / !2388
  • 详细内容:提交将 ReleasePointerValueList() 移动到 VM 销毁之后,并明确禁止在该阶段继续调用任何 JSVM API。修复点本质上是把 VM 侧资源回收和 C++ 包装节点销毁拆开处理,避免清理路径再次触碰已经失效的 JSVM 环境。