HarmonyOS 鸿蒙Next中heap-use-after-free错误
HarmonyOS 鸿蒙Next中heap-use-after-free错误 native代码:
static napi_value NAPI_Global_nativeGenerateSecret(napi_env env, napi_callback_info info) {
// TODO: implements the code;
OH_NativeBundle_ApplicationInfo nativeApplicationInfo = OH_NativeBundle_GetCurrentApplicationInfo();
//获取当前应用的application信息
napi_value packageName;
//创建一个packageName值
napi_create_string_utf8(env, nativeApplicationInfo.bundleName, NAPI_AUTO_LENGTH, &packageName);
//获取app的package 那么
free(nativeApplicationInfo.bundleName);
return packageName;
}
报错:
Device info:emulator
Build info:emulator 6.0.0.112(SP3DEVC00E112R4P11)
Fingerprint:c073f772f2da56c0d4b419efbe1f6bcd344f7fa0f5765adc21f73433fcd36343
Timestamp:2025-12-29 15:44:15.538
Module name:com.sshy.aiblindbox
Version:1.0.0
Pid:29865
Uid:20020057
Reason:heap-use-after-free
=================================================================
==appspawn==29865==ERROR: AddressSanitizer: heap-use-after-free on address 0x603001275940 at pc 0x7f80d58067bb bp 0x7ffc007e3850 sp 0x7ffc007e3018
READ of size 4 at 0x603001275940 thread T0 (sshy.aiblindbox)
#0 0x7f80d58067ba (/system/lib64/libclang_rt.asan.so+0x867ba) (BuildId: 7426e27426124e4ca93655f0287fb4c991a96f17)
#1 0x7f80c92310f1 (/system/lib64/platformsdk/libace_napi.z.so+0x710f1) (BuildId: 762c76a538c75db479d337795e7c7fab)
#2 0x7f8081484e6a (/data/storage/el1/bundle/libs/x86_64/libentry.so+0x4e6a) (BuildId: 0151417a4a147205573e0073d1075a36dbb8058d)
#3 0x7f80c92141f0 (/system/lib64/platformsdk/libace_napi.z.so+0x541f0) (BuildId: 762c76a538c75db479d337795e7c7fab)
0x603001275940 is located 0 bytes inside of 20-byte region [0x603001275940,0x603001275954)
freed by thread T0 (sshy.aiblindbox) here:
#0 0x7f80d5861e7b (/system/lib64/libclang_rt.asan.so+0xe1e7b) (BuildId: 7426e27426124e4ca93655f0287fb4c991a96f17)
#1 0x7f80814630b2 (/system/lib64/libbundle_ndk.z.so+0x230b2) (BuildId: c78f124221c904bc126d835538c845fd)
#2 0x7f80c92141f0 (/system/lib64/platformsdk/libace_napi.z.so+0x541f0) (BuildId: 762c76a538c75db479d337795e7c7fab)
previously allocated by thread T0 (sshy.aiblindbox) here:
#0 0x7f80d5861fad (/system/lib64/libclang_rt.asan.so+0xe1fad) (BuildId: 7426e27426124e4ca93655f0287fb4c991a96f17)
#1 0x7f8081462fae (/system/lib64/libbundle_ndk.z.so+0x22fae) (BuildId: c78f124221c904bc126d835538c845fd)
#2 0x7f80c92141f0 (/system/lib64/platformsdk/libace_napi.z.so+0x541f0) (BuildId: 762c76a538c75db479d337795e7c7fab)
SUMMARY: AddressSanitizer: heap-use-after-free (/system/lib64/libclang_rt.asan.so+0x867ba) (BuildId: 7426e27426124e4ca93655f0287fb4c991a96f17)
Shadow bytes around the buggy address:…
更多关于HarmonyOS 鸿蒙Next中heap-use-after-free错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,本地程序运行正常,未能复现您的问题,麻烦请提供以下信息:
- 复现代码(如:完整的Demo工程)
- 版本信息(如:开发工具、手机系统版本信息)
更多关于HarmonyOS 鸿蒙Next中heap-use-after-free错误的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙Next中heap-use-after-free错误是内存管理问题,指程序释放堆内存后仍尝试访问该区域。该错误通常由指针悬空引起,可能导致程序崩溃或数据损坏。在鸿蒙开发中,需检查内存分配与释放逻辑,确保访问前内存有效。使用鸿蒙提供的内存检测工具可辅助定位问题。
这是一个典型的 Native API 内存管理错误。heap-use-after-free 错误明确指出你在释放内存后仍然尝试使用它。
在你的代码中:
OH_NativeBundle_ApplicationInfo nativeApplicationInfo = OH_NativeBundle_GetCurrentApplicationInfo();
napi_create_string_utf8(env, nativeApplicationInfo.bundleName, NAPI_AUTO_LENGTH, &packageName);
free(nativeApplicationInfo.bundleName); // 问题在这里
return packageName;
问题分析:
OH_NativeBundle_GetCurrentApplicationInfo()返回的结构体中的bundleName指针指向的内存是由系统API内部管理的。- 你调用
napi_create_string_utf8()时,NAPI 只是复制了这个字符串指针的内容来创建新的JavaScript字符串,并没有进行深拷贝。 - 随后你调用了
free(nativeApplicationInfo.bundleName),释放了系统管理的内存。 - 当NAPI后续处理或垃圾回收尝试访问这个字符串时,就发生了 use-after-free 错误。
解决方案:
不要手动释放 nativeApplicationInfo.bundleName。这个内存的生命周期由 OH_NativeBundle_GetCurrentApplicationInfo() 的实现管理,你应该假设它是只读的,并在使用后让系统自行清理。
正确的代码应该是:
static napi_value NAPI_Global_nativeGenerateSecret(napi_env env, napi_callback_info info) {
OH_NativeBundle_ApplicationInfo nativeApplicationInfo = OH_NativeBundle_GetCurrentApplicationInfo();
napi_value packageName;
napi_create_string_utf8(env, nativeApplicationInfo.bundleName, NAPI_AUTO_LENGTH, &packageName);
// 移除 free(nativeApplicationInfo.bundleName) 这一行
return packageName;
}
在HarmonyOS Next的Native开发中,对于系统API返回的字符串指针,除非文档明确说明需要开发者释放,否则都不应该手动调用 free()。这个错误是由于错误的内存所有权假设导致的。

