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

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

Описание

Примечание

Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.

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

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

Объяснение

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

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 цикл скрывает переменную с тем же именем во внешнем контуре.

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

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

Вопросы совместимости

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

Не рекомендуемый запуск в R2021b

Введенный в R2013b