Динамически выделенная память для определенного потока не освобождается до конца потока
Этот дефект возникает, когда перед окончанием потока не освобождается динамически выделенная память для конкретного потока.
Для создания системы хранения данных, зависящей от потока, обычно выполняются следующие действия:
Создается ключ для хранения данных, специфичных для потоков.
Вы создаете нити.
В каждом потоке вы выделяете хранилище динамически, а затем связываете ключ с этим хранилищем.
После сопоставления сохраненные данные можно будет прочитать позже с помощью ключа.
Перед окончанием потока освободите специфическую для потока память с помощью клавиши.
Средство проверки помечает пути выполнения в потоке, где отсутствует последний шаг.
Средство проверки работает с этими семействами функций:
tss_get и tss_set (C11)
pthread_getspecific и pthread_setspecific (POSIX)
Данные, хранящиеся в памяти, доступны другим процессам даже после окончания потоков (утечка памяти). Помимо уязвимостей безопасности, утечки памяти могут уменьшить объем доступной памяти и снизить производительность.
Освободить динамически выделяемую память до конца потока.
Можно явно освободить динамически выделенную память с помощью таких функций, как free.
Кроме того, при создании ключа можно связать функцию деструктора с ключом. Функция деструктора вызывается со значением ключа в качестве аргумента в конце потока. В теле функции деструктора можно освободить любую память, связанную с ключом. При использовании этого метода функция поиска ошибок по-прежнему помечает дефект. Игнорировать этот дефект с соответствующими комментариями. См. раздел Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований.
| Группа: Параллелизм |
| Язык: C | C++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
THREAD_MEM_LEAK |
| Воздействие: среднее |
| CWE ID: 401, 404 |