AddressSanitizer 不会跟踪全局变量的内存泄漏吗?

Does not AddressSanitizer trace memory leak from global variable?

我正在尝试将 -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.

类似于 Valgrind LeakSanitizer 仅报告 "direct" 泄漏,即无法再从任何现有用户数据访问的地址(在 LSan design document 中称为 "root-set")。如果是全局变量,地址显然仍然可以访问。