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

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

Группа: Идентификаторы
Категория: Необходимый, Автоматизированный
Введенный в R2019a