FMM.MUST

使用不匹配函数释放内存

要释放分配的内存,必须使用相应的释放函数。如果使用一种机制分配内存,而使用另一种机制(如 C 和 C++ 内存管理函数组合或标量和矢量内存管理函数组合)释放内存,则会发生未定义的行为。FMM.MUST 检查器会标记使用不匹配函数来分配和释放内存的实例。

漏洞与风险

使用的内存分配和释放函数不匹配时,通常会导致意外的程序行为,并会使应用程序遭受拒绝服务 (DoS) 攻击或发生内存损坏问题。特别是在对象数组中,如果释放的存储元件错误,会损坏堆内存。可能会发生严重的内存泄露,严重程度可能相当于 DoS 攻击或程序崩溃。

缓解与预防

确保使用相应的分配器和释放器对,如下表所示:

分配器 释放器
malloc()、calloc()、realloc() free
运算符 new() 运算符 delete()
运算符 new[]() 运算符 delete[]()
位置 new() 析构函数

漏洞代码示例

复制
  class A {
      public
          void foo();
  };
  
  void A::foo()
  {
      int *ptr;
      ptr = (int*)malloc(sizeof(int));
     delete ptr;
 }

Klocwork 可生成不匹配释放报告,其中指出,ptr 指向的内存通过 malloc 函数分配,并通过删除运算符而非 free 函数释放。诸如此类的分配器和释放器集可能会导致不可预测的程序行为,并可能会使应用程序易受恶意攻击。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。