ZBLOG

以下代码错误的是? A. static napi_value loadModule(napi_env env, napi_callback_info info) { napi_value result; napi_status status = napi_load_module(env, "@ohos.hilog", &result); napi_value infoFn; napi_get_named_property(env, re...

以下是代码中存在的错误分析:


选项AloadModule

主要问题

  1. 未检查 napi_load_module 的返回值
    napi_load_module 可能失败(如模块不存在),但代码未检查 status,直接使用 result,可能导致后续操作崩溃。
  2. 未验证 infoFn 是否获取成功
    napi_get_named_property 的返回值未检查,若模块中无 "info" 方法,后续调用会出错。

选项BObtainValue

严重错误

  1. 线程安全违规
    • Node-API 要求所有操作必须在与原生线程绑定的 env 上下文中执行。此处在新线程中直接调用 napi_get_value_string_utf16napi_create_string_utf16 是未定义行为(需通过 napi_threadsafe_function 封装)。
  2. 内存泄漏
    线程创建的局部变量 result 无法传递回主线程,且函数始终返回 nullptr

选项CIsBuffer

致命错误

  1. 缓冲区初始化错误
    • napi_create_buffer 的第三个参数应为用户分配的缓冲区指针的地址(即二级指针),但此处传入了字符串数据的只读指针 (str.data()),会导致内存访问冲突。
    • 正确做法:先分配可写内存(如 malloc),再复制数据到缓冲区。

修正示例:

  1. char *buf = (char *)malloc(str.size());
  2. memcpy(buf, str.data(), str.size());
  3. napi_create_buffer(env, str.size(), buf, &buffer);

选项D(NapiEnvCleanUpHook)

潜在问题:

  1. 资源释放逻辑风险
    • ExternalFinalize 中释放了 wrapper->data,但若外部代码提前释放或复用该缓冲区,可能导致双重释放。
  2. 日志依赖平台 API
    • OH_LOG_INFO 是 OpenHarmony 特有接口,脱离该环境会编译失败。

总结

  • 最严重的错误在选项B和C
    • B违反Node-API线程安全规则;C存在非法内存访问。
  • A的问题为健壮性不足;D的设计需注意生命周期管理。

建议优先修复B和C的代码。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23300

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?