AddressSanitizer не обнаружил явной утечки после изменения printf - PullRequest
1 голос
/ 06 ноября 2019

Я ломаю голову, пытаясь понять, почему ASAN не обнаруживает простую утечку памяти. Вэлгринд находит это просто прекрасно. Помощь?

Пример, который ASAN находит .

#include <stdlib.h>
#include <stdio.h>

void blah(void)
{
        int *some_int = malloc(sizeof(int));
        *some_int = 1;
        printf("hello %p\n", some_int);
        // some_int is lost here
}

int main()
{
        blah();
        return 0;
}

mbryan@remotedev-mbryan:~/git/mbryan/onefs$ clang -fsanitize=address -O0 q.c
mbryan@remotedev-mbryan:~/git/mbryan/onefs$ ./a.out
hello 0x602000000010

=================================================================
==10751==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x4d9bd0 in malloc (/ifs/home/mbryan/git/mbryan/onefs/a.out+0x4d9bd0)
    #1 0x5120f3 in blah (/ifs/home/mbryan/git/mbryan/onefs/a.out+0x5120f3)
    #2 0x512183 in main (/ifs/home/mbryan/git/mbryan/onefs/a.out+0x512183)
    #3 0x7f3515000b96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310

SUMMARY: AddressSanitizer: 4 byte(s) leaked in 1 allocation(s).

Пока все хорошо. Теперь выведите значение вместо указателя:

#include <stdlib.h>
#include <stdio.h>

void blah(void)
{
        int *some_int = malloc(sizeof(int));
        *some_int = 1;
        printf("hello %d\n", *some_int);  // <---------------
}

int main()
{
        blah();
        return 0;
}

mbryan@remotedev-mbryan:~/git/mbryan/onefs$ clang -fsanitize=address -O0 q.c
mbryan@remotedev-mbryan:~/git/mbryan/onefs$ ./a.out
hello 1

... теперь утечка не проявляется.

В последнем случае, если я перекомпилирую без дезинфицирующего средства и запускаю valgrind, valgrindдействительно показывает утечку: == 10782 == определенно потеряно: 4 байта в 1 блоках

Просмотр сборки: я вижу, что оптимизатор не сделал мою переменную malloc локальной или какой-то другой хитростью. Итак: почему AddressSanitizer не принимает это? Я что-то упускаю из виду?

Это на Ubuntu18.04 с использованием clang 6.0.0-1ubuntu2.

1 Ответ

2 голосов
/ 07 ноября 2019

Мне сообщили от людей из ASAN, что это известная ошибка: https://github.com/google/sanitizers/issues/937

LeakSanitizer: ложноотрицательный, когда фрейм стека функций перекрывается # 937

...