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 环境。