FMM.MIGHT

可以使用不匹配函数释放内存

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

漏洞与风险

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

缓解与预防

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

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

漏洞代码示例

复制
  class A {
          int *data;
          A(const A&) { /* prohibited */ }
          A& operator =(const A&) { /* prohibited */ }
      public
          A() {
              data = new int [10];
          }
  
         ~A() {
             delete[] data;
         }
 };
 
 void foo(A **pp, bool t) {
     if (!*pp) {
         *pp = new A[5];
     }
     if (t) {
         delete *pp;
         *pp = 0;
     }
 }

Klocwork 生成不匹配释放报告,其中指出,*pp 指向的内存通过 new[] 运算符在第 17 行分配,并通过 delete 运算符而非 delete[] 在第 20 行释放。诸如此类的分配器和释放器集可能会导致不可预测的程序行为,并可能会使应用程序易受恶意攻击。

扩展

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