Разве AddressSanitizer не отслеживает утечку памяти из глобальной переменной? - PullRequest
2 голосов
/ 04 апреля 2019

Я пытаюсь использовать -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).

Интересно, почему sanitizer не работает с глобальной переменной ...

спасибо, и я надеюсь, что кто-то знает об этом.

пс. моя система Ubuntu 18.04 и x86_64.

1 Ответ

2 голосов
/ 04 апреля 2019

Аналогично Valgrind LeakSanitizer сообщает только о «прямых» утечках, то есть адресах, которые больше не доступны из каких-либо существующих пользовательских данных (называемых «корневым набором» в документе проектирования LSan ).В случае глобальной переменной адрес, очевидно, все еще доступен.

...