exponenta event banner

Правило AUTOSAR C++ 14 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