MISRA C++:2008 Rule 2-10-2

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

Описание

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

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

Объяснение

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

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

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

Реализация Polyspace

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

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

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

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

Чтобы исключить эти случаи, переключите на более современный стандартный AUTOSAR C++ 14 и проверяйте на правило AUTOSAR C++14 Rule A2-10-1.

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

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

Примеры

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

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++) { // Noncompliant
          runSomeCheck(index);
      }
  }
}

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

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

Группа: лексические соглашения
Категория: необходимый
Введенный в R2013b