AUTOSAR C++14 Rule A3-1-6

Тривиальные функции доступа и мутатора должны быть встроены

Описание

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

Тривиальные функции доступа и мутатора должны быть встроены.

Объяснение

Встроенные функции избегают служебных данных во время выполнения вызовов функций, но могут привести к возникновению запаха кода. Если метод accessor (getter) или mutator (setter) тривиален, двоение кода не является проблемой. Можно встроить эти методы, чтобы избежать ненужных накладных расходов на вызовы функций. Можно также избежать повторения нескольких синтаксических элементов внутри и вне определения класса.

Методы, заданные внутри классов, неявно рассматриваются как встроенные методы. Встроенные методы, заданные вне классов, можно явно использовать при помощи inline ключевое слово.

Реализация Polyspace

Чтобы определить, является ли метод тривиальным, чекер использует следующие критерии:

  • Метод accessor тривиален, если он не имеет параметров и содержит один return оператор, который возвращает нестатический представитель данных или ссылку на нестатический представитель данных.

    Тип возврата метода должен точно совпадать или быть ссылкой на тип представителя данных.

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

    Тип параметра должен точно совпадать или быть ссылкой на тип представителя данных.

Шашечные флаги тривиального метода доступа и мутатора, заданные вне их классов без inline ключевое слово.

Проверка не помечает методы шаблона или виртуальные методы.

Поиск и устранение проблем

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

Примеры

расширить все

class PhysicalConstants {
    public:
       double getSpeedOfLight() const;
       void setSpeedOfLightInMedium(double newSpeed);
       double getRefractiveIndexGlass() { //Compliant
           return refractiveIndexGlass;
       }
    private:
       double speedOfLight;
       double refractiveIndexGlass;
};

double PhysicalConstants::getSpeedOfLight() const{ //Noncompliant
    return speedOfLight;
}

void PhysicalConstants::setSpeedOfLightInMedium(double newSpeed) {//Noncompliant
    speedOfLight = newSpeed;
}

В этом примере методы доступа getSpeedOfLight и getRefractiveIndexGlass тривиальны. The getSpeedOfLight метод определяется вне его класса и не совместим. The getRefractiveIndexGlass метод определяется внутри определения класса и соответствует правилу.

Метод тривиального мутатора setSpeedOfLightInMedium также определяется вне определения класса и нарушает правило.

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

Группа: Основные концепции
Категория: Консультационные, Автоматизированные
Введенный в R2020b