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