exponenta event banner

Правило AUTOSAR C++ 14 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