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)