AddressSanitizer是否从全局变量跟踪内存泄漏?

时间:2019-04-04 08:00:29

标签: c gcc address-sanitizer

我正在尝试将-fsanitize=addressgcc一起使用。

我声明了全局变量(例如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。

1 个答案:

答案 0 :(得分:2)

类似于Valgrind LeakSanitizer,它仅报告“直接”泄漏,即,无法从任何现有用户数据(在LSan design document中称为“ root-set”)访问的地址。对于全局变量,该地址显然仍然可以访问。