﻿# V2592\. MISRA\. An identifier declared in an inner scope should not hide an identifier in an outer scope\.

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Идентификатор, объявленный в области видимости и не отличающийся по имени от другого идентификатора, объявленного в обрамляющей области видимости, "скрывает" внешний идентификатор\. Это может привести к путанице или программной ошибке\.

Например, такая коллизия имен может привести к логической ошибке, как в примере ниже:

```cpp
int foo(int param)
{
  int i = 0;
  if (param > 0)
  {
    int i = var + 1;
  }
  return i;
}
```

При прочтении этого кода на первый взгляд кажется, что когда в функцию 'foo' передается положительное значение параметра, то результатом вычисления будет это значение, увеличенное на '1'\. Однако это не так, и на самом деле функция всегда возвращает '0'\. Чтобы показать, что происходит в действительности, исключим из кода коллизию идентификаторов:

```cpp
int foo(int param)
{
  int i_outer = 0;
  if (param > 0)
  {
    int i_inner = var + 1;
  }
  return i_outer;
}
```

Теперь видно, что присваивание внутри ветки 'if' в переменную 'i' не влияет на результат вычисления функции 'foo'\. Внутренний идентификатор 'i' \('i\_inner'\) скрывает внешний идентификатор 'i' \('i\_outer'\), что приводит к ошибке\.