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 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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