AUTOSAR C++14 Rule A0-1-1

Проект не должен содержать образцов энергонезависимых переменных с заданными значениями, которые впоследствии не используются

Описание

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

Проект не должен содержать образцов, когда энергонезависимым переменным придаются значения, которые впоследствии не используются.

Объяснение

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

Реализация Polyspace

Если присвоенные значения впоследствии не используются, то флажок «checker» присваивает локальным и статическим переменным возможности файла. Шашка рассматривает const-квалифицированные глобальные переменные без extern спецификатор как статические переменные с файлом возможностей.

Флажки шашки:

  • Инициализации, если инициализированная переменная не используется.

  • Назначения без инициализации, если присвоенные значения не используются.

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

Проверка не помечает избыточные назначения:

  • К переменным с типом класса.

  • В последней итерации цикла, если назначения в предыдущих итерациях не избыточны.

    Например, назначение prevIter = i в последней итерации цикла является избыточным, но назначения в предыдущих итерациях не являются.

    void doSomething(int);
    
    void func() {
      int prevIter=-1, uBound=100;
      for(int i=0; i < uBound; i++) {
            doSomething(prevIter);
            prevIter = i;
      }
    }

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

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

Примеры

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

class largeInteger {
       largeInteger(int d1, int d2, int d3):
            lastFiveDigits(d1), nextFiveDigits(d2), firstFiveDigits(d3){}
       largeInteger& operator=(const largeInteger& other) {
            if(&other !=this) {
              firstFiveDigits = other.firstFiveDigits;
              nextFiveDigits = other.nextFiveDigits;
              lastFiveDigits = other.lastFiveDigits;
            }
            return *this;
       }
       void printIntegerValue();
    private:
        int firstFiveDigits;
        int nextFiveDigits;
        int lastFiveDigits;
};

bool compareValues(largeInteger, largeInteger);

void func() {
    largeInteger largeUnit{10000,0,0}; //Compliant
    largeInteger smallUnit{1,0,0}; //Compliant
    largeInteger tinyUnit{0,1,0}; //Noncompliant
    if(compareValues (largeUnit, smallUnit)) {
        //Perform some action   
    }
}

В этом примере переменная tinyUnit инициализирован, но никогда не используется.

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

Группа: Языковые независимые вопросы
Категория: Необходимый, Автоматизированный
Введенный в R2020b