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++ 分析。