【问题标题】:GCC warn for non-freed heap blocksGCC 警告未释放的堆块
【发布时间】:2016-04-24 11:33:48
【问题描述】:

所以问题很简单,有没有办法告诉 GCC,如果我不释放堆分配的块,我想得到警告?我知道我们可以出于某些目的使用未释放的块/我们已经到达程序结束或类似的东西。

int main(){
    int *a = malloc(sizeof(int));
    return 0;
}

如果我能收到警告,那就太棒了。

【问题讨论】:

  • 海合会?当然不是。 Valgrind 是的
  • @Idos 我知道 Valgrind 可以检查,但如果有办法在崩溃之前获得警告,那就太棒了。

标签: c gcc gcc-warning


【解决方案1】:

这不是 GCC 可以做的工作。静态分析不能证明免费被遗忘,这是运行时分析器的工作,例如 valgrind'smemcheck,或者最终是 gcc -fsanitize=leak,我在 yet 那里没有看到,只有 clang -fsanitize=leak

但是即使 gcc 或 clang 支持它,您也不会收到编译时警告。这将是一个运行时警告。

【讨论】:

  • 但是运行时是不是在每种情况下都有点不同。那么它是否可以不被证明,因为它需要太多时间来检查程序的所有状态?
  • -fsanitize=leak 只是一种优化,AFAIK 你可以用-fsanitize=address 编译,它适用于 gcc。
  • Yakup:是的,运行时只会捕获测试套件中的泄漏,而不是未发现的泄漏。 Marc:-fsanitize=address 不会真正捕获泄漏,-fsanitize=memory 会,但泄漏和 valgrind 是最好的。
  • @rurban 你真的试过用gcc -fsanitize=address 编译OP 的测试用例吗?如果您运行结果,它会打印“错误:LeakSanitizer:检测到内存泄漏”...
  • @MarcGlisse 哦,那很酷。我是最早的 AddressSanitizer 用户之一,但他们在过去几年添加了更多有用的捕获,我不知道。
【解决方案2】:

编译器无法预测和警告未释放的块。这是运行时作业,而不是编译时。您可以实现自己的 malloc-free-check 子系统或修改内存管理库。

【讨论】:

  • 我知道编译器无法检查内存是否是从堆分配的,但我教过“堆分配函数”会使用一个属性。这是可能的。
  • 我想有内存管理的诊断实现。每个分配的块必须有额外的信息,用于分配它的程序中的地址(使用malloc)。然后您可以在程序终止时调用一些_mem_leak 函数,该函数将扫描所有未释放的块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2016-10-07
  • 2016-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多