AUTOSAR C++14 Rule A0-1-1

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

Описание

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

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

Объяснение

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

Реализация Polyspace

Средство проверки отмечает присвоения значения к локальным и статическим переменным с осциллографом файла, если присвоенные значения впоследствии не используются. Средство проверки рассматривает 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