CERT C: Rec. MEM01-C

Сохраните новое значение в указателях сразу после свободный ()

Описание

Управляйте определением

Сохраните новое значение в указателях сразу после свободный (). [1]

Реализация Polyspace

Это средство проверки проверяет на Недостающий сброс освобожденного указателя.

Примеры

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

Проблема

Недостающий сброс освобожденного указателя обнаруживает указатели, которые были освобождены и не повторно присвоили другое значение. После освобождения указателя данные оперативной памяти все еще доступны. Чтобы очистить эти данные, указатель должен также быть установлен в 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);
    }
}

Проверяйте информацию

Группа: Rec. 08. Управление памятью (MEM)
Введенный в R2019a

[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.