目录

JSVM_Reference API Not Paired

使用OH_JSVM_ReferenceRef()增加的JSVM 引用计数,使用完毕后,需及时调用OH_JSVM_ReferenceUnref()对应地减少引用计数,避免JavaScript对象无法回收,造成内存泄漏。

规则配置

// rules.json

{
  "rules": {
     "cpp": {
       "ResourceLeak": [
         {
           "ruleId": "JSVM_Reference API Not Paired",
           "severity": "error",
           "skip": false
         }
       ]
     }
   }
}

正例

// 正例代码

#include <ark_runtime/jsvm.h>
void IncreaseRefWithDecrease(JSVM_Env env) 
{
    // 创建 JavaScript 对象
    JSVM_Value obj = nullptr;
    OH_JSVM_CreateObject(env, &obj);
    JSVM_Value value = nullptr;
    OH_JSVM_CreateStringUtf8(env, "UseReference", JSVM_AUTO_LENGTH, &value);
    OH_JSVM_SetNamedProperty(env, obj, "name", value);
    
    JSVM_Ref ref = nullptr;
    // 创建对JavaScript对象的引用
    JSVM_Status status = OH_JSVM_CreateReference(env, obj, 1, &ref);
    if (status != JSVM_OK) {
        return;
    }
    // 增加引用计数
    uint32_t result = 0u;
    OH_JSVM_ReferenceRef(env, ref, &result);
    
    // 使用 jsRef...
    
    // 减少传入引用的引用计数并返回生成的引用计数
    uint32_t num = 0u;
    OH_JSVM_ReferenceUnref(env, ref, &num);
    
    // 不再使用引用,通过调用OH_JSVM_DeleteReference删除对JavaScript对象的引用
    status = OH_JSVM_DeleteReference(env, ref);
}

反例

// 反例代码

#include <ark_runtime/jsvm.h>
void IncreaseRefWithoutDecrease(JSVM_Env env) 
{
    // 创建 JavaScript 对象
    JSVM_Value obj = nullptr;
    OH_JSVM_CreateObject(env, &obj);
    JSVM_Value value = nullptr;
    OH_JSVM_CreateStringUtf8(env, "UseReference", JSVM_AUTO_LENGTH, &value);
    OH_JSVM_SetNamedProperty(env, obj, "name", value);
    
    JSVM_Ref ref = nullptr;
    // 创建对JavaScript对象的引用
    JSVM_Status status = OH_JSVM_CreateReference(env, obj, 1, &ref);
    if (status != JSVM_OK) {
        return;
    }
    // 增加引用计数
    uint32_t result = 0u;
    OH_JSVM_ReferenceRef(env, ref, &result);
    
    // 使用 jsRef...
    
    // 未对应减少 - 内存泄漏!
}

Code Scanner代码检查规则的配置指导请参考1.6.3 代码检查工具(codescanner)