Use of previously freed pointer

Доступ к памяти после отмены выделения памяти

Описание

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

Риск

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

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

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

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

Примеры

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

#include <stdlib.h>
#include <stdio.h>
 int increment_content_of_address(int base_val, int shift)
   { 
    int j;
    int* pi = (int*)malloc(sizeof(int));
    if (pi == NULL) return 0;

    *pi = base_val;
    free(pi);

    j = *pi + shift;
    /* Defect: Reading a freed pointer */
 
    return j;
   }

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

Коррекция - Свободный указатель после использования

Одна из возможных коррекций - освободить указатель мыши pi только после последнего образца, к которому осуществляется доступ.

#include <stdlib.h>

int increment_content_of_address(int base_val, int shift)
{
    int j;
    int* pi = (int*)malloc(sizeof(int));
    if (pi == NULL) return 0;

    *pi = base_val;

    j = *pi + shift;
    *pi = 0;

    /* Fix: The pointer is freed after its last use */
    free(pi);               
    return j;
}

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

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