AUTOSAR C++14 Rule A8-4-10

Параметр передается по ссылке, если он не может быть NULL

Описание

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

Параметр передается по ссылке, если он не может быть NULL

Объяснение

Ссылка не может быть NULL. Если требуется параметр (он не может быть NULL), передайте этот параметр по ссылке, чтобы сделать ваш намерение более ясным. Передача по ссылке также приводит к более чистому коду, потому что вам не нужно проверять, является ли параметр NULL, прежде чем использовать его.

Реализация Polyspace

Polyspace® флаги, переданные параметрами указателя, за исключением следующих случаев:

  • Указатель является умным указателем, таким как std::shared_ptr.

  • Указатель не разыменован в функции.

  • Указатель проверяется на значение NULL, даже если проверка происходит после дереференции.

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

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

Примеры

расширить все

#include <iostream>
#include <vector>

void other_func(std::vector<int32_t>*);

void func(std::vector<int32_t>* v_ptr1, //  Non-Compliant
             std::vector<int32_t>* v_ptr2, //  Compliant
             std::vector<int32_t>* v_ptr3) //  Compliant
{

    auto v = v_ptr1;
    auto ptr_size = 0;
    if (v_ptr2 != NULL) {
        ptr_size = v_ptr2->size();
    }
    v->resize(ptr_size);

    other_func(v_ptr3);
    //....

}

В этом примере параметр pass-by-указателя v_ptr1 является несоответствующим, потому что он разберётся внутри func не проверяя, имеет ли указатель значение NULL. Если v_ptr1 не может быть NULL, передайте этот параметр по ссылке. Если на v_ptr1 может иметь значение NULL, проверяйте, является ли указатель NULL, прежде чем просматривать его, чтобы избежать отказа сегментации.

Параметрический v_ptr2 является совместимым, поскольку он проверяется на значение NULL, что указывает на то, что он может быть NULL.

v_ptr3 совместим, потому что внутри не разберётся func.

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

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