目录

NativeWindowRequestBuffer API Not Paired

使用OH_NativeWindow_NativeWindowRequestBuffer()请求缓冲区后,需使用OH_NativeWindow_NativeWindowFlushBuffer()提交缓冲区,以完成缓冲区的生命周期管理,避免缓冲区无法回收,造成内存泄漏。

规则配置

// rules.json

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

正例

// 正例代码

#include "native_window/external_window.h"
void RequestAndFlushBuffer(OHNativeWindow *window) 
{
    OHNativeWindowBuffer *buffer = nullptr;
    int fenceFd = -1;
    
    int ret = OH_NativeWindow_NativeWindowRequestBuffer(window, &buffer, &fenceFd);
    
    if (ret != 0 || buffer == nullptr) {
        return;
    }
    
    // 填充缓冲区...
    
    // 正确提交缓冲区
    Region region = {nullptr, 0};  // 整个缓冲区已更新
    OH_NativeWindow_NativeWindowFlushBuffer(window, buffer, fenceFd, region);
}

反例

// 反例代码

#include "native_window/external_window.h"
void RequestBufferWithoutFlush(OHNativeWindow *window) 
{
    OHNativeWindowBuffer *buffer = nullptr;
    int fenceFd = -1;
    
    // 请求缓冲区
    int ret = OH_NativeWindow_NativeWindowRequestBuffer(window, &buffer, &fenceFd);
    
    if (ret != 0 || buffer == nullptr) {
        return;
    }
    
    // 填充缓冲区...
    // 忘记 Flush, 未刷新 - 内存泄漏!
}

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