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);
    //....

}

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

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

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

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

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