>
>
>
V2524. MISRA. A switch-label should onl…


V2524. MISRA. A switch-label should only appear at the top level of the compound statement forming the body of a 'switch' statement.

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

Область видимости, в которой находится метка, должна быть составным выражением, которое представляет собой тело 'switch'. Это означает, что метка не должна быть вложена ни в какой блок, кроме как в тело 'switch', и это тело должно быть составным выражением.

Следовательно, все метки, принадлежащие одному 'switch', должны находиться в одной области видимости. Следование этому правилу позволяет сохранить читаемость и структурированность кода.

Пример 1:

void example_1(int param, bool b)
{
  switch (param)
  {
  case 1:
    DoSmth1();
    if (b)
    {
  case 2: // <=
    DoSmth2();
    }
    break;
  default:
    assert(false);
    break;
  }
}

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

void example_1(int param, bool b)
{
  switch (param)
  {
  case 1:
    DoSmth1();
    if (b)
    {
      DoSmth2();
    }
    break;
  case 2:
    DoSmth2();
    break;
  default:
    assert(false);
    break;
  }
}

В следующем примере тело 'switch' не является составным, поэтому анализатор также выдаст предупреждение:

void example_2(int param)
{
  switch (param)
    default:
      DoDefault();
}

Исправленный вариант:

void example_2(int param)
{
  switch (param)
  {
    default:
      DoDefault();
      break;
  }
}

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

  • MISRA-C-16.2
  • MISRA-CPP-6.4.4