exponenta event banner

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 для возврата нулевого указателя при сбое не обрабатывает исключение, что может привести к внезапному завершению программы.

Исправление

Одной из возможных корректировок является замена 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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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