exponenta event banner

Правило AUTOSAR C++ 14 A8-4-9

параметры «in-out», объявленные как T &, должны быть изменены

Описание

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

Параметры «in-out», объявленные как T &, должны быть изменены.

Объяснение

Параметр функции, предназначенный для чтения и изменения внутри функции, называется параметром «входящий-исходящий».

Если вы не читаете и не изменяете параметр, избегайте передачи поconst , чтобы прототип функции отражал истинный характер параметра.

  • Если параметр считывается только внутри функции, он фактически является параметром «in».

    Передать параметр по const ссылка.

  • При замене всего содержимого параметра в функции параметр фактически является параметром «out».

    По возможности полностью избегайте параметров «out» и сохраните любой вывод функции в возвращаемом значении функции. См. также AUTOSAR C++14 Rule A8-4-8.

Внедрение Polyspace

Средство проверки проверяет каждый параметр функции, переданный не -const и вызывает нарушение, если параметр считывается только внутри функции или его значение полностью заменяется внутри функции.

Проверка не вызывает нарушения, если:

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

  • Указатель или ссылка на параметр передаются другой функции.

  • Функция является виртуальной. Причина заключается в том, что даже если текущая функция не может изменить свой параметр, переопределение функции может изменить соответствующий параметр.

  • Функция является неиспользуемым методом класса.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#include <cstdint>
#include <vector>
#include <numeric>
#include <string>

int32_t addAllElements (std::vector<int32_t>& aVec) { //Noncompliant
     return std::accumulate(aVec.cbegin(), aVec.cend(), 0); 
}

int32_t addEveryElement (const std::vector<int32_t>& anotherVec) { //Compliant
     return std::accumulate(anotherVec.cbegin(), anotherVec.cend(), 0); 
}

В этом примере вектор aVec передается как не -const ссылка на функцию addAllElements. Однако вектор считывается только внутри функции и является только параметром «in», а не параметром «in-out».

Функция addEveryElement является совместимой версией той же функции. Параметр «» in anotherVec передается как const ссылка.

#include <string>

void replaceString(std::string &Source, const std::string Replacement) { //Noncompliant
    if(Replacement.at(0)=='_')
         Source = Replacement; 
    else
         Source = "_null";
}

std::string replacementString(const std::string str) { //Compliant
    if(str.at(0)=='_')
         return str; 
    else
         return "_null";
}

В этом примере строка Source передается как не -const ссылка на функцию replaceString. Однако строка полностью заменяется внутри функции и является только параметром «out», а не параметром «in-out».

Функция replacementString является совместимой версией той же функции, которая также не нарушает AUTOSAR C++14 Rule A8-4-8. Функция имеет тот же выход, что и replaceString но сохраняет выходные данные в возвращаемом значении.

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

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