exponenta event banner

Правило AUTOSAR C++ 14 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++) { // Noncompliant
          runSomeCheck(index);
      }
  }
}

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

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

Группа: идентификаторы
Категория: Обязательно, Автоматизировано
Представлен в R2019a