exponenta event banner

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

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

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

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

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

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