目录

NativeWindow API Not Paired

使用OH_NativeWindow_ReadFromParcel从Parcel()或OH_NativeWindow_CreateNativeWindowFromSurfaceId从Surface()读取原生窗口后,需及时调用OH_NativeWindow_DestroyNativeWindow()进行释放,避免窗口对象无法回收,造成内存泄漏。

规则配置

// rules.json

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

正例

// 正例代码

#include "native_window/external_window.h"
void ReadWindowFromParcelWithDestroy(OHIPCParcel *parcel) 
{
    // 从 Parcel 读取窗口
    OHNativeWindow *window;
    int32_t state = OH_NativeWindow_ReadFromParcel(parcel, &window);
    
    if (state != 0 || window == nullptr) {
        return;
    }
    
    // 使用 window...
    
    // 正确销毁窗口对象
    OH_NativeWindow_DestroyNativeWindow(window);
}
void ReadWindowFromSurfaceIdWithDestroy(uint64_t surfaceId) 
{
    // 从 Surface 读取窗口
    OHNativeWindow *window;
    int32_t state = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &window);
    
    if (state != 0 || window == nullptr) {
        return;
    }
    
    // 使用 window...
    
    // 正确销毁窗口对象
    OH_NativeWindow_DestroyNativeWindow(window);
}

反例

// 反例代码

#include "native_window/external_window.h"
void ReadWindowFromParcelWithoutDestroy(OHIPCParcel *parcel) 
{
    // 从 Parcel 读取窗口
    OHNativeWindow *window;
    int32_t state = OH_NativeWindow_ReadFromParcel(parcel, &window);
    
    if (state != 0 || window == nullptr) {
        return;
    }
    
    // 使用 window...
    
    // 未释放 - 内存泄漏!
}

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