我正在尝试将-fsanitize=address
与gcc
一起使用。
我声明了全局变量(例如int*
)并使用malloc分配了内存,然后我没有调用自由函数。我希望消毒剂会显示有关内存泄漏的错误消息,但是它退出时没有错误消息。
因此,我使用局部变量进行测试。 Sanitizer在该测试代码上运行良好。我将代码放在下面。
这是一个全局变量代码。
#include<stdio.h>
#include<stdlib.h>
int *gv;
int main(){
gv = (int*)malloc(sizeof(int)*4);
printf("yooooolooooooo\n");
return 0;
}
这是局部变量代码。
#include<stdio.h>
#include<stdlib.h>
int main(){
int *gv = (int*)malloc(sizeof(int)*4);
printf("yooooolooooooo\n");
return 0;
}
我使用gcc -fsanitize=address -o test test.c
进行编译。
上面的代码仅显示
yooooolooooooo
但显示局部变量代码
yooooolooooooo
=================================================================
==15484==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 16 byte(s) in 1 object(s) allocated from:
#0 0x7f6e43395b60 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.5+0xedb60)
#1 0x564b5f8bd936 in main (/home/jiho/lab/test+0x936)
#2 0x7f6e42ed8b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
SUMMARY: AddressSanitizer: 16 byte(s) leaked in 1 allocation(s).
我想知道为什么消毒剂不能与全局变量一起使用...
谢谢,我希望有人知道。
ps。我的系统是ubuntu 18.04和x86_64。
答案 0 :(得分:2)
类似于Valgrind LeakSanitizer,它仅报告“直接”泄漏,即,无法从任何现有用户数据(在LSan design document中称为“ root-set”)访问的地址。对于全局变量,该地址显然仍然可以访问。