AUTOSAR C++14 Rule A8-4-8

Выходные параметры не должны использоваться

Описание

Управляйте определением

Выходные параметры не должны использоваться.

Объяснение

Можно сохранить выходное значение функции в переменной, которую вы передаете этой функции как ссылка неconst или параметр указателя, например:

void func(const T* input_var, T* output_var); //declaration
void func(const T* input_var, T* output_var)
{
    *output_var = *input_var % 2;
}

Однако это неясно из объявления функции ли выходной параметр output_var передает значение func и затем хранит выход (изменяемый параметр), или ли output_var только хранит выход (параметр). Эта сила заставляет разработчика неправильно использовать параметр, например, путем передачи пустого параметра, когда функция ожидает непустой параметр.

Вместо этого используйте возвращаемое значение, чтобы сохранить функциональный выход. Возвращаемое значение ясно дает понять ваше намерение и предотвращает возможное неправильное употребление переданных параметров, например:

T* func(const T* input_var)
{
    return *input_var % 2;
}

Реализация Polyspace

Polyspace® отмечает все использование ссылок неconst или указателей в списке параметров:

  • Функции, за исключением main().

  • Конструкторы класса и операторы.

Если ваш код содержит объявление функции и его определение, Polyspace отмечает нарушение в функциональном определении.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

#include<iostream>

std::int32_t func(const std::vector<int32_t>& inParam,
                  std::vector<int32_t>& outParam)  //  Non-Compliant
{
    //...
	return 1;
}

class C
{
public:

    C(C* ptr) {}         //  Non-Compliant
    C(C& ref) {}         //  Non-Compliant
    C(C&& rvalue_ref) {} //  Compliant
    C(const C& c) {}     //  Compliant
    C(const C&& c) {}    //  Compliant

    C& operator=(C& ref) { return *this; }    //    Non-Compliant

};

В этом примере, func имеет возвращаемое значение типа std::int32_t но его список параметров все еще несовместим, потому что это содержит неconst lvalue ссылочный outParam. Точно так же параметры неconst ptr и ref в конструкторах класса и в operator= несовместимы.

Обратите внимание на то, что параметр неconst rvalue_ref совместимо, потому что rvalue параметры ссылки связывают только с временными объектами, и на эти объекты нельзя сослаться после того, как функция выходит из осциллографа.

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

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