Deallocation of previously deallocated pointer

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

Описание

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

Риск

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

Фиксация

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

Как хорошая практика, после того, как вы освободите блок памяти, присваивают соответствующий указатель на 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
Удар: высоко
ID CWE: 415, 825
Введенный в R2013b