exponenta event banner

Отмена назначения ранее отмененного указателя

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

Описание

Этот дефект возникает, когда блок памяти освобождается более одного раза с помощью 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++
По умолчанию: Вкл.
Синтаксис командной строки: DOUBLE_DEALLOCATION
Воздействие: Высокое
CWE ID: 415, 825
Представлен в R2013b