# 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-2012-16.2 MISRA-C-2023-16.2 MISRA-CPP-2008-6.4.4