exponenta event banner

Правило AUTOSAR C++ 14 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-pointer v_ptr1 не соответствует, так как в нем отсутствует ссылка func без проверки, имеет ли указатель значение NULL. Если v_ptr1 не может иметь значение NULL, передайте этот параметр по ссылке. Если v_ptr1 может иметь значение NULL, проверьте, имеет ли указатель значение NULL, прежде чем отменить привязку, чтобы избежать ошибки сегментации.

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

v_ptr3 соответствует, так как не имеет ссылки внутри func.

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

Группа: Деклараторы
Категория: Обязательно, Автоматизировано
Представлен в R2021a