AUTOSAR C++14 Rule A8-4-9

"в -" параметры, объявленные как T &, буду изменен

Описание

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

"в -" параметры, объявленные как T &, буду изменен.

Объяснение

Параметр функции, предназначенный, чтобы быть и считанным и измененным в функции, называется "в -" параметр.

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

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

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

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

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

Реализация Polyspace

Средство проверки проверяет каждый параметр функции, переданный non-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 передается как non-const ссылка на функциональный addAllElements. Однако вектор только читается в функции и только "в" параметре, не "в -" параметр.

Функциональный addEveryElement совместимая версия той же функции. "В" параметре 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 передается как non-const ссылка на функциональный replaceString. Однако строка полностью заменяется в функции и только параметр, не "в -" параметр.

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

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

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