Deallocation of previously deallocated pointer

Память освобождается более одного раза без выделения

Описание

Этот дефект возникает, когда блок памяти освобождается более одного раза с помощью free функция без промежуточного распределения.

Риск

Когда указателю выделяется динамическая память с malloc, calloc или realloc, это указывает на место памяти на куче. Когда вы используете free функция на этом указателе, связанный блок памяти освобождается для перераспределения. Попытка освободить этот блок памяти может привести к ошибке сегментации.

Зафиксировать

Исправление зависит от первопричины дефекта. Посмотрите, намеревались ли вы выделить блок памяти указателю между первой деаллокацией и второй. В противном случае удалите вторую free оператор.

Как хорошая практика, после освобождения блока памяти присвойте соответствующий указатель NULL. Перед освобождением указателей проверьте их на значения NULL и обработайте ошибку. Таким образом, вы защищены от освобождения уже освобожденного блока.

Примеры

расширить все

#include <stdlib.h>

void allocate_and_free(void)
{

    int* pi = (int*)malloc(sizeof(int));
    if (pi == NULL) return;

    *pi = 2;
    free(pi);
    free (pi);       
    /* Defect: pi has already been freed */
}

Первый free оператор освобождает блок памяти, который pi относится к. Вторая free оператор по pi освобождает блок памяти, который уже был освобожден.

Коррекция - Удаление повторяющейся отмены присвоения

Одной из возможных коррекций является удаление второго free оператор.

#include <stdlib.h>

void allocate_and_free(void)
{

    int* pi = (int*)malloc(sizeof(int));
    if (pi == NULL) return;

    *pi = 2;
    free(pi);
    /* Fix: remove second deallocation */
 }

Информация о результатах

Группа: Динамическая память
Язык: C | C++
По умолчанию: On
Синтаксис командной строки: DOUBLE_DEALLOCATION
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 415, 825
Введенный в R2013b