Как отключить в санитайзере предупреждения при закрытии программы?

Рейтинг: 0Ответов: 1Опубликовано: 19.04.2023

Все мы знаем, что после завершения работы программы, память возвращается ОС и лично я не знаю причин, для того, чтобы перед завершением работы вызывать деструкторы и чистить за собой память.
Однако санитайзер на это ругается.
1 Разберём пример:

#include <iostream>

int main(int argc, char *argv[])
{
    int* a = new int(17);
    return 0;
}

санитайзер выдал :

=================================================================
==59301==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x7f91118bb1c7 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99
    #1 0x5653388f9285 in main ../sanitizerTest/main.cpp:5
    #2 0x7f9110d74d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58

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

Хотя я не считаю это утечкой памяти.
2 Для примера давайте используем явно эту память

#include <iostream>

void test(int* a){
    *a = 17;
}

int main(int argc, char *argv[])
{
    int* a = new int();
    test(a);
    std :: cout << *a;
    return 0;
}

и всё равно санитайзер ругается :

17
=================================================================
==59580==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 4 byte(s) in 1 object(s) allocated from:
    #0 0x7f6af3f7d1c7 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cpp:99
    #1 0x55cb1f806319 in main ../sanitizerTest/main.cpp:9
    #2 0x7f6af3436d8f in __libc_start_call_main ../sysdeps/nptl/libc_start_call_main.h:58

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

3 Однако, если немного обернуть код, то санитайзер не ругается:

#include <iostream>

void test(int** a){
    *a = new int(17);
}

int main(int argc, char *argv[])
{
    int* a;
    test(&a);
    std :: cout << *a;
    return 0;
}

PS: оптимизацию отключил , мой qmake:

CONFIG += c++20 console
QMAKE_CXXFLAGS_RELEASE -= -O0

SOURCES += \
        main.cpp

Подскажите пожалуйста, почему в первых 2 случаях санитайзер ругается, а в последнем нет? Хотя и там и там я не чищу память после себя.

И если я всё правильно понимаю и нигде не ошибаюсь, как сделать так, чтобы в первых 2 случаях санитайзер не ругался?

Ответы

▲ 0

По определению, memory leak — это потеря процессом ссылки на какой-то участок памяти. Именно такие случаи пытается найти санитайзер. Если он не смог найти его в определённой ситуации, то увы, но это не изменяет того, что утечка есть.

Утечек стоит избегать в реальных программах, где используется большое количество памяти, т.к. потерянную память без GC не вернуть, а значит все такие потерянные объекты могут как минимум ухудшить быстродействие программы за счёт уменьшения пула доступной памяти, а как максимум привести к крашу программы.

А на некоторых realtime системах возможна ситуация, когда ОС не очищает память после завершения процесса (или вообще нет абстракции процесса). Так что можно навредить и более глобально как минимум до ребута.