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 при отказе. Функциональные func, который ожидает bad_alloc исключение в случае сбоя выделения памяти может лишиться нуля указателя, поскольку operator new не выдает.

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

Группа: Библиотека языковой поддержки
Категория: Необходимый, Автоматизированный
Введенный в R2020b