03-内存异常

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

1. Instance 销毁时崩溃

  • 修改日期:2024-01-23
  • 版本:0.72.27
  • 问题描述:RNInstance 销毁过程中,对实例可用状态和清理阶段的弱引用判断不足,导致销毁链路继续进入无效对象访问而崩溃
  • 影响模块:RNInstance / 生命周期
  • 提交 / PR:2963f84c5
  • 详细修复内容:修复实例销毁阶段的崩溃,保证资源清理和回调解绑顺序正确。

2. VSync 监听器 Use-After-Free

  • 修改日期:2024-05-28
  • 版本:0.72.27
  • 问题描述:Animated 模块持有的 VSyncListener 在监听器对象释放后仍可能继续接收帧回调,回调链路访问失效监听器触发 Use-After-Free 崩溃
  • 影响模块:Animated / VSync
  • 提交 / PR:f92c32c60
  • 详细修复内容:修复 Animated / VSync 监听器释放后仍被访问的问题,避免 Use-After-Free 崩溃。

3. 右值野指针

  • 修改日期:2024-06-02
  • 版本:0.72.27
  • 问题描述:HarmonyReactMarker 中对临时右值对象持有引用,右值在语句结束后被销毁,悬空引用在后续访问时触发野指针崩溃
  • 影响模块:多处
  • 提交 / PR:37f90ad88
  • 详细修复内容:修复多处右值相关的野指针问题,降低悬挂指针和非法访问导致的随机崩溃。

4. scrollToEnd 时 m_props 为 null 崩溃

  • 修改日期:2024-06-06
  • 版本:0.72.27
  • 问题描述:ScrollViewComponentInstance 执行 scrollToEnd 时直接读取 m_props,但该属性对象在特定时序下可能尚未初始化或已失效,导致空指针崩溃
  • 影响模块:ScrollView
  • 提交 / PR:39bffe4e9
  • 详细修复内容:处理 ScrollView 在 scrollToEnd 调用时 m_props 为空的场景,避免读取属性时发生崩溃。

5. Animated.Text std::out_of_range 崩溃

  • 修改日期:2024-06-15
  • 版本:0.72.27-1
  • 问题描述:Animated.Text 在文本内容或样式边界值场景下进行了越界字符串/容器访问,抛出 std::out_of_range 并导致崩溃
  • 影响模块:Animated / Text
  • 提交 / PR:ca66c9658
  • 详细修复内容:修复 Animated.Text 在边界输入下出现的越界崩溃。

6. 线程安全问题

  • 修改日期:2024-07-06
  • 版本:0.72.27-6
  • 问题描述:MountingManager、SchedulerDelegate、RNInstance 等多处共享状态缺少充分同步保护,并发读写时可能造成状态错乱、悬空访问或崩溃
  • 影响模块:多处
  • 提交 / PR:1520c5c3d
  • 详细修复内容:对多处线程安全问题做集中修复,降低共享状态在并发读写中的不确定行为。

7. registry 重复读取空指针崩溃

  • 修改日期:2024-07-11
  • 版本:0.72.29
  • 问题描述:ArkUITypography 对排版注册表进行第二次读取时缺少空值检查,注册表返回 null 时直接解引用触发崩溃
  • 影响模块:ComponentRegistry
  • 提交 / PR:9c511f074
  • 详细修复内容:修复 ComponentRegistry 重复读取过程中可能出现的空指针崩溃,降低注册表读取异常带来的风险。

8. dynamic object 越界崩溃

  • 修改日期:2024-07-15
  • 版本:0.72.29
  • 问题描述:DynamicObject 在读取动态数据字段时索引越界或键不存在,后续仍继续访问内部对象导致崩溃
  • 影响模块:DynamicObject / 数据处理
  • 提交 / PR:67879cdbb
  • 详细修复内容:修复 dynamic object 访问越界问题,避免数据处理时访问非法位置。

9. m_eventEmitter 已释放后崩溃

  • 修改日期:2024-07-17
  • 版本:0.72.29
  • 问题描述:CustomNodeComponentInstance 和 ViewComponentInstance 中持有的 m_eventEmitter 在已被释放后仍被事件回调访问,产生 Use-After-Free 崩溃
  • 影响模块:EventEmitter
  • 提交 / PR:46c64ea5c
  • 详细修复内容:修复 EventEmitter 已释放但仍被访问的问题,防止释放后对象参与后续调用造成崩溃。

10. m_props 空指针崩溃

  • 修改日期:2024-08-17
  • 版本:0.72.29-3
  • 问题描述:ScrollViewComponentInstance 在处理滚动属性读取时直接访问 m_props,未检查其是否为空,m_props 为空时触发空指针崩溃
  • 影响模块:ComponentInstance
  • 提交 / PR:a72a205dd
  • 详细修复内容:修复 ComponentInstance 中 m_props 为空时的崩溃,确保属性读取前具备有效性检查。

11. m_eventEmitter 为 null 时 CPPCrash

  • 修改日期:2024-09-04
  • 版本:0.72.29-5
  • 问题描述:TextInputComponentInstance 触发事件时未检查 m_eventEmitter 是否为 null,直接调用触发空指针 CPPCrash
  • 影响模块:ComponentInstance / EventEmitter
  • 提交 / PR:845d4764e
  • 详细修复内容:为 EventEmitter 访问路径补充空值判断,避免 m_eventEmitter 为空时继续调用触发崩溃。

12. 销毁 RNInstance 时 ArkTSChannel Use-After-Free

  • 修改日期:2024-09-26
  • 版本:0.72.37-1
  • 问题描述:RNInstance 销毁阶段,ArkTSChannel 与实例生命周期解绑不彻底,通道对象释放后仍被后续逻辑访问,触发 Use-After-Free 崩溃
  • 影响模块:ArkTSChannel / RNInstance
  • 提交 / PR:2204bf7f9
  • 详细修复内容:在 RNInstance 销毁过程中修复 ArkTSChannel 的 Use-After-Free 问题,避免通道对象释放后被再次访问。

13. TurboModuleProvider 崩溃

  • 修改日期:2024-10-18
  • 版本:0.72.37-1
  • 问题描述:TurboModuleProvider 在模块初始化或按需获取阶段,TurboModuleFactory 侧对象状态校验缺失,触发空指针或非法状态访问崩溃
  • 影响模块:TurboModuleProvider
  • 提交 / PR:e0d848590
  • 详细修复内容:修复 TurboModuleProvider 初始化或取用过程中的崩溃问题,目标是稳定模块提供方的对象访问。

14. TextLayoutManager::measureLines 获取错误位置崩溃

  • 修改日期:2025-01-14
  • 版本:0.72.39-14
  • 问题描述:TextLayoutManager::measureLines 处理文本布局结果时读取了错误位置索引,对越界位置缺少保护,导致测量阶段崩溃
  • 影响模块:TextLayoutManager
  • 提交 / PR:2259ec65a / !443
  • 详细修复内容:修复 TextLayoutManager 取错误位置时的崩溃,保证 measureLines 对无效索引的处理更稳健。

15. Text info 空指针 CPPCrash

  • 修改日期:2025-01-16
  • 版本:0.72.39-14
  • 问题描述:TextComponentInstance 在访问内部 text info 对象时未进行空值检查,info 为 null 时直接解引用,触发 CPPCrash
  • 影响模块:Text 组件
  • 提交 / PR:e8e869565 / !443
  • 详细修复内容:针对 Text 组件内部 info 为空时触发的 CPPCrash 进行保护,避免空指针访问。

16. push ComponentInstancePreallocationRequestQueue 时崩溃

  • 修改日期:2025-03-26
  • 版本:0.72.67
  • 问题描述:schedulerDelegate 被释放后,组件预分配任务队列中仍有任务继续执行并访问该对象,产生 UAF 崩溃;同时 RNInstanceInternal 成员变量析构顺序有误,进一步加剧该问题
  • 影响模块:组件预分配
  • 提交 / PR:4a233029a / !709
  • 详细修复内容:修复组件预分配请求队列入队阶段的崩溃问题,目标是稳定预分配流程中的对象管理。

17. 字符串 pos 越界崩溃

  • 修改日期:2025-04-28
  • 版本:0.72.67
  • 问题描述:Text 组件传入空字符串时仍触发 onTextLayout,ArkUI 回传的 Pos 与实际文本长度不一致,后续字符串分段和位置计算继续按有效索引处理而发生越界崩溃
  • 影响模块:Text / String 处理
  • 提交 / PR:ebe50d682 / !879
  • 详细修复内容:当 Text 组件传入空字符串并触发 onTextLayout 回调时,ArkUI 返回的 Pos 可能超过实际文本长度,后续字符串访问因此发生越界。修复通过在相关文本布局处理中补齐空文本和位置边界检查,当 Pos 非法时采用安全分支或直接跳过处理。

18. ComponentInstance 空指针问题

  • 修改日期:2025-07-25
  • 版本:0.72.82
  • 问题描述:m_componentInstanceRegistry->findByTag() 可能返回空指针,MountingManagerCAPI 和 TouchEventDispatcher 在调用结果前缺少空值校验,触发空指针崩溃
  • 影响模块:ComponentInstance
  • 提交 / PR:f8f98fa09 / !1312
  • 详细修复内容:修复 ComponentInstance 在特定访问路径上的空指针问题,降低组件实例访问失败导致的崩溃风险。

19. 组件移除时偶发崩溃

  • 修改日期:2025-08-11
  • 版本:0.72.86
  • 问题描述:ComponentInstance::removeChild 执行时,m_componentInstanceRegistry->findByTag() 低概率返回空指针,子组件移除流程继续访问该结果导致偶发 SIGSEGV
  • 影响模块:MountingManager
  • 提交 / PR:2dc5424b8 / !1394
  • 详细修复内容:修复组件移除流程中通过 registry 查找子组件实例时可能返回空指针的低概率崩溃问题。

日志

场景说明:ComponentInstance::removeChild() 执行过程中,childComponentInstance 由 m_componentInstanceRegistry->findByTag() 获取,存在返回空指针的低概率情况。
现象:低概率触发 removeChild 相关 SIGSEGV。
测试说明:可尝试将 childComponentInstance 替换为 nullptr,验证是否会出现 removeChild 相关崩溃。

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

  • 修改日期:2025-10-10
  • 版本:0.72.96
  • 问题描述:AnimatedNodesManager::runUpdates 在执行动画帧更新时,对动画节点的访问缺少空值检查,节点被提前销毁后触发空指针解引用崩溃
  • 影响模块:NativeAnimated
  • 提交 / PR:11d5b9e0c / !1664
  • 详细修复内容:针对 AnimatedNodesManager::runUpdates 执行过程中可能出现的空指针解引用进行保护和修正。

21. 补充空指针保护,防止多处空指针解引用崩溃

  • 修改日期:2025-10-18
  • 版本:0.72.96
  • 问题描述:ComponentInstance::insertChild 执行时,通过 m_componentInstanceRegistry->findByTag() 获取子实例可能返回空指针;此外 m_children.insert 存在越界访问风险,两处均缺少防护导致崩溃
  • 影响模块:ComponentInstance
  • 提交 / PR:65ddc2db7 / !1685
  • 详细修复内容:为 ComponentInstance 相关访问路径补充空指针保护,避免多个调用点发生空指针解引用。

22. JS Runtime UAF 导致崩溃

  • 修改日期:2026-03-12
  • 版本:0.72.128
  • 问题描述:JS 线程执行期间 JS Runtime 相关对象被提前释放,后续对该对象的访问触发 Use-After-Free 崩溃
  • 影响模块:JSRuntime / 线程管理
  • 提交 / PR:fdec3268a / !2380
  • 详细修复内容:围绕 JS Runtime 与线程管理相关的 Use-After-Free 崩溃进行修复,目标是避免对象已释放后仍被访问。

日志

Tid:51507, Name:RNOH_JS
00 pc 000000000022766c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+300)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
01 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
02 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
03 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
04 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
05 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
06 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
07 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
08 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
09 pc 000000000022765c /system/lib64/libv8_shared.so(Builtins_InterpreterEntryTrampoline+284)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
10 pc 0000000000224ff0 /system/lib64/libv8_shared.so(Builtins_JSEntryTrampoline+176)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
11 pc 0000000000224c38 /system/lib64/libv8_shared.so(Builtins_JSEntry+184)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
12 pc 000000000059775c /system/lib64/libv8_shared.so(v8::internal::(anonymous namespace)::Invoke(v8::internal::Isolate*, v8::internal::(anonymous namespace)::InvokeParams const&)+792)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
13 pc 000000000059740c /system/lib64/libv8_shared.so(v8::internal::Execution::Call(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::Handle<v8::internal::Object>, int, v8::internal::Handle<v8::internal::Object>*)+120)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)
14 pc 0000000000499240 /system/lib64/libv8_shared.so(v8::Function::Call(v8::Isolate*, v8::Local<v8::Context>, v8::Local<v8::Value>, int, v8::Local<v8::Value>*)+508)(6e56d6ca0f2f9ac7201183b0a6919309782a12c9)