Анализатор обнаружил подозрительный код: в функцию 'memset' передаётся адрес указателя, который ссылается на динамически выделенную память. Такой код может привести к утечке памяти после использования функции 'memset'.
Рассмотрим следующую ситуацию. Допустим, что в проекте существовал следующий корректно работающий код:
void foo() { constexpr size_t count = ....; char array[count]; memset(&array, 0, sizeof(array)); .... }
На стеке создаётся массив, а затем его содержимое зануляется при помощи функции 'memset'. В исходном примере нет ошибок: первым аргументом передаётся адрес массива, а третьим аргументом – реальный размер массива в байтах.
Чуть позже программист по каким-либо причинам заменил аллокацию буфера со стека на кучу:
void foo() { constexpr size_t count = ....; char *array = (char*) malloc(count * sizeof(char)); .... memset(&array, 0, sizeof(array)); // <= .... }
При этом он не изменил вызов функции 'memset'. Это означает, что теперь первым аргументом передаётся адрес указателя на стеке функции, а третьим аргументом — его размер. Это приводит к занулению указателя вместо содержимого массива и утечке памяти.
Пример исправленного кода:
void PointerFixed() { .... constexpr size_t count = ....; char *array = (char*) malloc(count * sizeof(char)); .... memset(array, 0, count * sizeof(char)); .... }
Теперь первым параметром передаётся адрес участка памяти на куче, а третьим параметром — его размер.