exponenta event banner

Правило AUTOSAR C++ 14 A20-8-2

Для представления исключительного права собственности используется std::unique_ptr

Описание

Определение правила

Для представления исключительного права собственности используется std::unique_ptr.

Объяснение

Необработанные указатели на кучу памяти имеют две связанные проблемы:

  • Когда необработанный указатель выходит из области действия, указанная память может не быть освобождена и привести к утечке памяти. Не забудьте явно освободить память (delete указатель), прежде чем указатель выйдет из области действия.

  • При передаче необработанного указателя на функцию неясно, принимает ли функция исключительную собственность на указанный ресурс и может ли она освободить память или должна оставить удаление вызывающей стороне. Если функция освобождает память, существует риск того, что другой указатель, указывающий на ту же самую ячейку памяти, останется зависшим.

A std::unique_ptr объект является интеллектуальным указателем, который решает обе задачи и не требует значительных дополнительных накладных расходов над необработанными указателями:

  • Нет необходимости явно освобождать указанную память. Память освобождается, прежде чем указатель выходит из области.

  • Указатель имеет исключительную собственность на указанный объект. При передаче указателя на функцию с помощью операции перемещения функция принимает на себя право собственности на память через указатель и неявно освобождает память при завершении (если только вы не передаете право собственности другой функции).

Внедрение Polyspace

Флаги средства проверки выполняют функции, отличные от main которые имеют необработанные указатели в качестве параметров или возвращаемых значений.

Шашка поднимает нарушение как этого правила, так и AUTOSAR C++14 Rule A20-8-3.

  • Если требуется, чтобы функция приобрела исключительную собственность на указанный объект, преобразуйте необработанный указатель в std::unique_ptr тип.

  • Если требуется, чтобы функция приобрела общее владение указанным объектом, преобразуйте необработанный указатель в std::shared_ptr тип.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#include <memory>
#include <cstdint>
#include <thread>
constexpr std::uint32_t SIZE=100;

class Resource {
  public:
    bool lookup(std::int32_t);
  private:
    std::int32_t arr[SIZE];
};

bool doesValueExist(Resource *aResource, std::int32_t val) { //Noncompliant
    return aResource->lookup(val);
}

bool doAllSmallerValuesExist(std::unique_ptr<Resource> aResource, std::int32_t val) { 
//Compliant
    bool valueExists = true;
    for(std::int32_t i = 0; i <= val; i++) {
        valueExists = aResource->lookup(i);
        if(!valueExists)
            break;
    }
    return valueExists;
}

std::int32_t getAVal();

void main(void) {
    Resource *aResourcePtr = new Resource;
    auto anotherResourcePtr = std::make_unique<Resource>();
    bool valueFound, allSmallerValuesFound;
    
    //Initialize resources
    
    valueFound = doesValueExist(aResourcePtr, getAVal());
    allSmallerValuesFound = doAllSmallerValuesExist(std::move(anotherResourcePtr), getAVal());
}

В этом примере функция doesValueExist принимает необработанный указатель на Resource объект как параметр и нарушает правило.

Функция doAllSmallerValuesExist выполняет аналогичные операции с Resource объект, но принимает std::unique_ptr указатель на объект в качестве параметра.

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

Группа: Библиотека общих утилит
Категория: Обязательно, Автоматизировано
Представлен в R2020b