V2529. MISRA. Any label should be declared in the same block as 'goto' statement or in any block enclosing it.
Данное диагностическое правило основано на руководстве 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;
}
}
Данная диагностика классифицируется как:
|