FREE.INCONSISTENT
不一致的内存释放
有时,如果释放的内存不一致,则会导致内存泄露。因此,需要确保在函数的所有路径上释放内存。FREE.INCONSISTENT 检查器会标记直接或通过一系列的取消引用和域操作访问内存,然后在函数的一个路径而不在其他路径上释放内存的情况。通常在错误情况下或会话意外中断时会发生该问题。
漏洞与风险
当因释放的内存不一致而导致内存泄漏时,软件就会变得不可靠,而如果攻击者可以故意引发泄漏,则会导致拒绝服务 (DoS) 攻击。
缓解与预防
要避免发生该问题,应确保在函数的所有路径上释放内存,包括错误情况和其他异常情况,同时确保不会混淆程序的哪部分负责释放内存。
漏洞代码示例
复制
void my_free(char *p, int flag) {
if (flag == 17) {
p = 0;
return;
}
if (flag == 34) {
return;
}
free(p);
}
Klocwork 生成不一致的内存释放报告,其中指出 p 指向的内存在第 9 行释放,但当该函数在第 4 或 7 行退出时,则不在该行释放。通常释放内存的路径所处的位置会在代码中进一步移除,而不像在该示例中,情况难以识别。无论何时,只要在函数的一个路径上没有释放内存都会导致内存泄漏,进而会产生易受攻击的漏洞。
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。