AUTOSAR C++14 Rule A8-4-9

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

Описание

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

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

Объяснение

Функциональный параметр, предназначенный для чтения и изменения в функции, называется параметром «in-out».

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

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

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

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

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

Реализация Polyspace

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

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

  • Параметр является объектом, и вы получаете доступ к одним или нескольким его представителям данных или активируете non- 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