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. The 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