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