AUTOSAR C++14 Rule A18-5-9

Пользовательские реализации функций динамического выделения памяти и освобождения должны удовлетворить семантические требования, заданные в соответствующем "Необходимом поведении" пункт из Стандарта C++

Описание

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

Пользовательские реализации функций динамического выделения памяти и освобождения должны удовлетворить семантические требования, заданные в соответствующем "Необходимом поведении" пункт из Стандарта C++.

Объяснение

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

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

Реализация Polyspace

Polyspace® отмечает эти заменяющие реализации динамических функций выделения и освобождения.

  • Замена operator new это возвращает nullptr когда ожидаемое поведение должно выдать bad_alloc исключение на отказе.

  • Замена operator new или operator delete тот бросок прямо или косвенно на отказе, когда ожидаемое поведение не должно выдавать. Polyspace также подсвечивает местоположение броска в вашем коде.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#include<new>

extern void* custom_alloc(std::size_t);

void* operator new (std::size_t count) //Non-compliant
{
    return custom_alloc(count);
}

void func()
{
    int* ptr1;
    try {
        ptr1 = new int;
    } catch (const std::bad_alloc&) {
        //handle exception
    }

    //Use ptr1

}

В этом примере пользовательское выделение функционирует custom_alloc, то, которое задано в другом месте, может возвратить nullptr onFailure. Функциональный func, который ожидает bad_alloc исключение, если выделение памяти перестало работать, может разыменовать нулевого указателя потому что operator new не выдает.

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

Группа: вспомогательная библиотека Языка
Категория: необходимый, автоматизированный
Введенный в R2020b