目录

MemoryMap API Not Paired

使用mmap()映射内存后,需及时调用munmap()解除映射,避免虚拟地址空间无法回收,造成内存泄漏。

规则配置

// rules.json

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

正例

// 正例代码

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
void MapMemoryWithUnmap() 
{
    int fd = open("/path/to/file", O_RDONLY);
    if (fd == -1) return;
    
    void *mapped = mmap(nullptr, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
    
    if (mapped == MAP_FAILED) {
        close(fd);
        return;
    }
    
    // 使用 mapped...
    
    // 正确解除映射
    munmap(mapped, 4096);
    close(fd);
}

反例

// 反例代码

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
void MapMemoryWithoutUnmap() 
{
    int fd = open("/path/to/file", O_RDONLY);
    if (fd == -1) return;
    
    // 映射内存
    void *mapped = mmap(nullptr, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
    
    if (mapped == MAP_FAILED) {
        close(fd);
        return;
    }
    
    // 使用 mapped...
    
    // 未解除映射 - 地址空间泄漏!
    close(fd);
}

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