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

Данное диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

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

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

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

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

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

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

```cpp
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](https://pvs-studio.ru/ru/docs/warnings/v2506/)\.