обнаружение утечек против утечки_для проверки_at_exit? - PullRequest
0 голосов
/ 06 июня 2018

Я использовал AddressSanitizer , чтобы проверить утечку памяти для моего приложения, но меня смущает разница между этими двумя флагами: detect_leaks против leak_check_at_exit.

Я думал, что код нижедолжен сообщать об утечке памяти, даже когда leak_check_at_exit=0, потому что утечка уже произошла во время каждого цикла, а не после того, как основная функция вернулась:

int main() {
    void *mem;
    for(int i=0; i<1000; i++) {
        mem = malloc(1024);
    }
    return 0;
}

При detect_leaks=1:leak_check_at_exit=1 программа выдаст правильный отчет об утечке памяти:

=================================================================
==73448==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 1024000 byte(s) in 1000 object(s) allocated from:
    #0 0x7f0933f053f8 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.3+0xc23f8)
    #1 0x42c8c1 in main src/main.cpp:10
    #2 0x7f0931b05ec4 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)

Но с detect_leaks=1:leak_check_at_exit=0 он НЕ сообщает об утечке памяти.Мне кажется, что настройка leak_check_at_exit=0 эквивалентна настройке detect_leaks=0.

Вопрос : В чем разница между detect_leaks и leak_check_at_exit?

1 Ответ

0 голосов
/ 06 июня 2018

LeakSanitizer работает, анализируя память программ на предмет указателей на выделенные фрагменты.Анализ очень медленный и выполняется только в конце выполнения (вы также можете запустить его, вызвав __lsan_do_leak_check).

Когда вы установите leak_check_at_exit=0, вы фактически отключите Lsan.Вы можете вручную вставлять __lsan_do_leak_check на каждой итерации цикла, но это замедлит работу программы и, возможно, не будет хорошо работать, если в вашем приложении несколько потоков.

...