AUTOSAR C++14 Rule A2-10-1

Идентификатор, объявленный во внутреннем осциллографе, не должен скрывать идентификатор, объявленный во внешнем осциллографе

Описание

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

Идентификатор, объявленный во внутреннем осциллографе, не должен скрывать идентификатор, объявленный во внешнем осциллографе.

Объяснение

Правило отмечает ситуации, где то же имя идентификатора используется в двух объявлениях переменной, один во внешнем осциллографе и другом во внутреннем осциллографе.

int var; 
...
{
...
  int var;
...
}

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

Реализация Polyspace

Средство проверки правила отмечает все случаи переменного затенения кроме тех случаев, когда:

  • То же имя идентификатора используется во внешнем и внутреннем именованном пространстве имен.

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

  • То же имя используется в методе в основе и производном классе.

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

Правило не отмечает эти ситуации, потому что можно разъясниться, относится ли использование переменной к переменной во внутреннем или внешнем осциллографе. Например, в этом примере:

int var;

namespace n1 {
   int var;
}
в пространстве имен n1, можно обратиться к переменной во внутреннем осциллографе как n1::var и глобальная переменная как ::var.

Средство проверки правила также не обнаруживает эти проблемы:

  • Переменная в пространстве имен без имени скрывает другую переменную во внешнем осциллографе.

  • Переменная локальная переменная к лямбда-выражению скрывает полученную переменную.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

int varInit = 1;

void doSomething(void);

void step(void) {
    int varInit = 0; //Noncompliant
    if(varInit)
       doSomething(); 
}

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

void runSomeCheck(int);

void checkMatrix(int dim1, int dim2) {
  for(int index = 0; index < dim1; index++) {
      for(int index = 0; index < dim2; index++) {
          runSomeCheck(index);
      }
  }
}

В этом примере, переменной index заданный во внутреннем for цикл скрывает переменную с тем же именем во внешнем цикле.

Введенный в R2019a