Missing reset of a freed pointer

Указатель free не сопровождаемый оператором сброса, чтобы очистить оставшиеся данные

Описание

Этот дефект происходит, когда указатель освобожден и не повторно присвоил другое значение. После освобождения указателя данные оперативной памяти все еще доступны. Чтобы очистить эти данные, указатель должен также быть установлен в NULL или другое значение.

Риск

Не сброс указателей может вызвать висячие указатели. Висячие указатели могут вызвать:

  • Освобождение уже освобождено память.

  • Чтение от или запись в уже освобожденный память.

  • Хакеры, выполняющие код, сохраненный в освобожденных указателях или с уязвимыми полномочиями.

Фиксация

После освобождения указателя, если это сразу не присвоено другому допустимому адресу, устанавливает указатель в NULL.

Примеры

развернуть все

#include <stdlib.h>
enum {
    SIZE3   = 3,
    SIZE20  = 20
};

void missingfreedptrreset()
{
    static char *str = NULL;

    if (str == NULL)
        str = (char *)malloc(SIZE20);

    if (str != NULL)
        free(str);
}

В этом примере, указатель str освобожден в конце программы. Следующий вызов bug_missingfreedptrrese может перестать работать потому что str не является ПУСТЫМ, и инициализация к NULL может быть недопустимой.

Коррекция — переопределяет free к свободному и сбросу

Одна возможная коррекция должна настроить free так, чтобы, когда вы освобождаете указатель, он был автоматически сброшен.

#include <stdlib.h>
enum {
    SIZE3   = 3,
    SIZE20  = 20
};

static void sanitize_free(void **p)
{
    if ((p != NULL) && (*p != NULL))
    {
        free(*p);
        *p = NULL;
    }
}

#define free(X) sanitize_free((void **)&X)

void missingfreedptrreset()
{
    static char *str = NULL;

    if (str == NULL)
        str = (char *)malloc(SIZE20);

    if (str != ((void *)0))
    {
        free(str);
    }
}

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

Группа: хорошая практика
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: MISSING_FREED_PTR_RESET
Удар: низко
ID CWE: 415, 416, 825

Введенный в R2017b