我正在工作,在一个大型的C++项目上,让它用clang编译将是痛苦的,所以我被GCC困住了。
我想使用在以前的作业中已经与clang一起使用的-fsanitize=leak标记,但它似乎不起作用。
我做了一个非常简单的例子来测试它:
#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但我不能这么做:好处的缺点太多了。我只想要检漏。
发布于 2015-07-06 07:56:46
我用gcc 5.1解决了这个问题(我用了4.9)。
编辑:看起来5.2也不起作用,EDIT2:它不适用于由ubuntu15.10 (5.2.1)提供的gcc,但是我从源代码中重新编译了一个5.2.0,运行良好。我真的毫无头绪。
发布于 2015-07-03 15:26:27
您必须阅读此文件并使用修补程序:
发布于 2016-04-05 10:23:51
我也有同样的问题(Ubuntu15.04和gcc 4.9.2)。
使用ldd时,我注意到liblsan.so没有链接,所以这里我是如何修复它的:
( 1)编译过程中的力连接
>> gcc -fsanitize=leak main.cpp -llsan
( 2)用
./a.out
https://stackoverflow.com/questions/31210053
复制相似问题