为什么GCC不尝试内存泄漏检查?

pse*_*ble 3 c gcc memory-leaks memory-management

虽然我很少再使用C了,但我一直在考虑我总是被告知的规则"如果你打电话malloc()(或new),你必须打电话free()(或delete)".它让我想知道GCC(或其他C编译器)是否尝试执行任何类型的内存并警告用户潜在的问题.我从来没有听说过,所以我怀疑情况并非如此,但我想知道.

这是我使用的例子:

#include <stdlib.h>

int main() {
  int* first = malloc(sizeof(int) *  10);
  int* second = malloc(sizeof(int) * 10);

  int i = 0;
  for (; i < 10; i++) {
    first[i] = i * 2;
    second[i] = i * 10;
  }

  free(first);  /* Forgot to free second */
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

gcc -Wall free_test.c没有警告的情况下进行编译时生成了.虽然我可以看到为什么编译器无法提供完美的答案,因为您正在处理堆内存并在运行时管理它,为什么编译器似乎没有尝试提供可能存在内存泄漏的警告?

我对其中的一些想法包括:

  1. 编译器可能没有完美的方法来告诉内存何时被释放.例如,如果其中一个指针被传递到函数中并从函数中释放,则编译器可能无法告诉它.
  2. 如果一个不同的线程拥有内存的所有权,编译器就没有办法告诉别人可能释放内存.

Oli*_*rth 11

无法通过静态分析检测到的情况(更不用说通过简单的静态分析)远远超过那些可以检测到的情况.编译器的作者可能认为增加GCC的额外复杂性的好处被成本所抵消.