exponenta event banner

Использование ранее освобожденного указателя

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

Описание

Этот дефект возникает при доступе к блоку памяти после освобождения блока с помощью 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;
   }

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++
По умолчанию: Вкл.
Синтаксис командной строки: FREED_PTR
Воздействие: Высокое
CWE ID: 416, 825
Представлен в R2013b