exponenta event banner

AUTOSAR C++14 Rule A8-4-8

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

Описание

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

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

Объяснение

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

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 сохраняет только выход (выходной параметр). Это может привести к неправильному использованию параметра разработчиком, например, путем передачи параметра null, когда функция ожидает ненулевого параметра.

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

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

Реализация Polyspace

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

  • Функции, кроме 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 но его список параметров все еще не соответствует требованиям, поскольку он содержит несоответствующую ссылку lvalue outParam. Точно так же несоответствующие параметры ptr и ref в конструкторах классов и в operator= являются несоответствующими.

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

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

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