# V2520. MISRA. Every switch-clause should be terminated by an unconditional 'break' or 'throw' statement.

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

Данное диагностическое правило различается для C и C++. Для обоих языков каждая метка в 'switch' должна быть завершена оператором 'break', не расположенным внутри условия. А для C++ последним оператором также может быть 'throw'.

Намеренное завершение каждой метки гарантирует, что поток управления не "провалится" в метку, расположенную ниже, и позволяет избежать ошибок при добавлении новых меток.

Исключением из этого правила являются пустые метки, расположенные последовательно.

Пример кода, на который анализатор выдаст предупреждение:

    void example_1(int cond, int a)
    {
      switch (cond)
      {
      case 1:
      case 2:
        break;
      case 3:  // <=
        if (a == 42)
        {
          DoSmth();
        }
      case 4:  // <=
        DoSmth2();
      default: // <=
        ;
      }
    }

Исправленный код:

    void example_1(int cond, int a)
    {
      switch (cond)
      {
      case 1:
      case 2:
        break;
      case 3:
        if (a == 42)
        {
           DoSmth();
        }
        break;
      case 4:
        DoSmth2();
        break;
      default:
        /* No action required */
        break;
      }
    }

Следует отметить, что метки не должны завершаться выражением 'return', так как это нарушает правило V2506.

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

MISRA-C-2012-16.3 MISRA-C-2023-16.3 MISRA-CPP-2008-6.4.5