﻿# V2529\. MISRA\. Any label should be declared in the same block as 'goto' statement or in any block enclosing it\.

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

Чрезмерное использование 'goto' приводит к плохой структурированности кода, усложняя его понимание\.

Для снижения визуальной сложности кода рекомендуется отказаться от переходов во вложенные блоки или между блоками, расположенными на одном уровне\. 

Пример 1: 

```cpp
void V2532_pos1()
{
  ...
  goto label;
  ...
  {
  label:
    ...
  }
}
```

Здесь 'goto' ссылается во вложенный блок, что нарушает данное правило\.

На следующий пример анализатор не будет выдавать предупреждение:

```cpp
void V2532_neg1()
{
  ...
  label:
  ...
  {
    goto label;
    ...
  }
}
```

Примечание: тела switch\-меток рассматриваются как составные выражения, даже если они не обернуты в фигурные скобки\. Поэтому прыжки в тело switch\-метки из внешнего кода и прыжки между разными switch\-метками нарушают данное правило\.

Приведем примеры\.

Прыжок в switch\-метку из внешнего кода \(ошибка\):

```cpp
void V2532_pos2(int param)
{
  goto label;

  switch (param)
  {
  case 0:
    break;
  default:
  label:;
    break;
  }
}
```

Прыжок между switch\-метками \(ошибка\):

```cpp
void V2532_pos3(int param)
{
  switch (param)
  {
  case 0:
    goto label;
    break;
  default:
  label:
    break;
  }
}
```

Прыжок из switch\-метки во внешний код \(ok\):

```cpp
void V2532_neg2(int param)
{
  label:
  switch (param)
  {
  case 0:
    goto label;
    break;
  default:
    break;
  }
}
```

Прыжок в пределах одной switch\-метки \(ok\):

```cpp
void neg3(int param)
{
  switch (param)
  {
  case 0:
  {
    ...
    {
      goto label;
    }
  }
  label:
    break;
  default:
    break;
  }
}
```