Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V2529. MISRA. Any label should be...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

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

07 Фев 2019

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

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

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

Пример 1:

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

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

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

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

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

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

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

void V2532_pos2(int param)
{
  goto label;

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

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

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

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

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

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

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

Данная диагностика классифицируется как:

  • MISRA-C-15.3
  • MISRA-CPP-6.6.1