8

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

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

我做了一个非常简单的例子来测试它:

#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

但我不能那样做:性能缺点太多了。我只想要泄漏检测。

4

3 回答 3

2

您必须阅读并使用补丁:

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

于 2015-07-03T15:26:27.287 回答
2

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

编辑:看起来 5.2 也不起作用 EDIT2:它不适用于 ubuntu 15.10 (5.2.1) 提供的 gcc,但是我从源代码重新编译了 5.2.0,它运行良好。我真的一点头绪都没有。

于 2015-07-06T07:56:46.780 回答
2

我遇到了同样的问题(使用 Ubuntu 15.04 和 gcc 4.9.2)。

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

1) 编译时强制链接

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

2)执行

./a.out

于 2016-04-05T10:23:51.023 回答