CERT C++: MEM55-CPP

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

Описание

Определение правила

Уважайте требования к динамическому управлению хранением данных при замене[1] .

Реализация Polyspace

Эта проверка проверяет функции распределения/выделения замещения, которые не соответствуют требованиям стандарта.

Примеры

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

Проблема

Проблема возникает, когда вы предоставляете эти реализации замены функций динамического распределения и удаления в глобальном пространстве имен:

  • Замена operator new который возвращает nullptr.

    Ожидаемое поведение - выдать bad_alloc исключение при отказе.

  • Замена operator new или operator delete который прямо или косвенно бросает на отказ.

    Ожидаемое поведение состоит в том, что динамические функции выделения или удаления не должны выдавать. Polyspace® также подсвечивает местоположение броска в вашем коде.

Риск

Стандарт C++ ([new.delete]) задает определенные виды поведения для функций динамического выделения и удаления. Если вы реализуете глобальную функцию выделения или удаления замещения, которая не соответствует этим семантическим требованиям, другие функции, полагающиеся на необходимое поведение, могут вести себя неопределенным образом.

Для образца, void* operator new ( std::size_t count ) ожидается, что бросит bad_alloc исключение, если не удается выделить требуемый объем памяти. Если вы реализуете функцию выделения замещения, которая возвращает nullptr вместо выдачи функция, которая ожидает выделения памяти от отказа, может попытаться вместо этого отрешиться от нулевого указателя.

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

Если вы предоставляете глобальные замены для функций динамического распределения/удаления, реализуйте семантические требования, заданные стандартом, в соответствующих необходимых абзацах поведения.

Неперекидывающиеся operator new Что бросает

#include<cstdlib>
#include<new>

extern void* custom_alloc(std::size_t);

void* operator new (std::size_t count, const std::nothrow_t& tag) //Non-compliant
{
    if (void* ret = custom_alloc(count)) {
        return ret;
    }
    throw std::bad_alloc();
}

void func()
{
    int* ptr1 = new int;
    if (ptr1) {
        //Use ptr1
    }

}
В этом примере функция динамического распределения замещения задается как не-метание (std::nothrow_t) но выдает bad_alloc исключение при отказе. Функциональные func, который ожидает operator new для возврата указателя null при отказе не обрабатывает исключение, и это может привести к внезапному завершению программы.

Коррекция

Одной из возможных коррекций является обеспечение замены operator new функция, которая не выдает.

#include<cstdlib>
#include<new>

extern void* custom_alloc(std::size_t);

void* operator new (std::size_t count, const std::nothrow_t& tag)
{
    return custom_alloc(count);
}

void func()
{
    int* ptr1 = new int;
    if (ptr1) {
        //Use ptr1
    }

}

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

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

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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