exponenta event banner

MISRA C++: 2008 Правило 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