GCC 和 -fsanitize=泄漏

GCC and -fsanitize=leak

我正在处理一个大型 C++ 项目,用 clang 编译它会很痛苦,所以我坚持使用 GCC。

我想使用漂亮的 -fsanitize=leak 标志,我已经在以前的工作中使用过 clang,但它似乎不起作用。

我做了一个很简单的例子来测试一下:

#include <stdlib.h>
void FooBar() {
  malloc(7);
}
int main() {
  FooBar();
  return 0;
}

使用 clang 它按预期工作:

>> clang -fsanitize=leak main.cpp
>> LSAN_OPTIONS=detect_leaks=1 ./a.out
=================================================================
==18052==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x41dcbc  (~/dev/addresssanitizertest/a.out+0x41dcbc)
#1 0x431ac3  (~/dev/addresssanitizertest/a.out+0x431ac3)
#2 0x431ae3  (~/dev/addresssanitizertest/a.out+0x431ae3)
#3 0x7f8077e71a3f  (/lib/x86_64-linux-gnu/libc.so.6+0x20a3f)
SUMMARY: LeakSanitizer: 7 byte(s) leaked in 1 allocation(s).
>>

但是对于 gcc,它似乎没有检测到任何东西:

>> gcc -fsanitize=leak main.cpp
>> LSAN_OPTIONS=detect_leaks=1 ./a.out
>>

我是不是错过了一个不错的环境变量?有人让它与 gcc 一起工作吗?

编辑:例如这有效:

g++ -fsanitize=address main.cpp
ASAN_OPTIONS=detect_leaks=1 ./a.out

但我做不到:perf 缺点太多了。我只想要检漏。

您必须阅读本文并使用补丁:

https://gcc.gnu.org/ml/gcc-patches/2013-11/msg01874.html

我用 gcc 5.1 解决了它(我用的是 4.9)。

编辑:看起来 5.2 也不起作用 EDIT2:它不适用于 ubuntu 15.10 (5.2.1) 提供的 gcc,但是我从源代码重新编译了 5.2.0,它工作正常。我真的不知道。

我有同样的问题(Ubuntu 15.04 和 gcc 4.9.2)。

使用 ldd 我注意到 liblsan.so 没有链接,所以我是这样修复它的:

1) 编译时强制链接

>> gcc -fsanitize=leak main.cpp -llsan

2) 使用

执行

./a.out