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

3 回复

开发者您好,本地程序运行正常,未能复现您的问题,麻烦请提供以下信息:

  1. 复现代码(如:完整的Demo工程)
  2. 版本信息(如:开发工具、手机系统版本信息)

更多关于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;

问题分析:

  1. OH_NativeBundle_GetCurrentApplicationInfo() 返回的结构体中的 bundleName 指针指向的内存是由系统API内部管理的。
  2. 你调用 napi_create_string_utf8() 时,NAPI 只是复制了这个字符串指针的内容来创建新的JavaScript字符串,并没有进行深拷贝。
  3. 随后你调用了 free(nativeApplicationInfo.bundleName),释放了系统管理的内存。
  4. 当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()。这个错误是由于错误的内存所有权假设导致的。

回到顶部