# V551. Unreachable code under a 'case' label.

Анализатор обнаружил потенциальную ошибку связанную с тем, что одна из ветвей оператора switch() никогда не получит управление. Причина этого в том, что аргумент оператора switch() не может принять значение, которое прописано в операторе case.

Рассмотрим пример:

    char ch = strText[i];
    switch (ch)
    {
    case '<':
      strHTML += "<";
      bLastCharSpace = FALSE;
      nNonbreakChars++;
      break;
    case '>':
      strHTML += ">";
      bLastCharSpace = FALSE;
      nNonbreakChars++;
      break;
    case 0xB7:
    case 0xBB:
      strHTML += ch;
      strHTML += "<wbr>";
      bLastCharSpace = FALSE;
      nNonbreakChars = 0;
      break;
    ...
    }

Здесь ветка расположенная после "case 0xB7:" и "case 0xBB:" никогда не получит управление. Переменная 'ch' имеет тип 'char', а, следовательно, диапазон её значений лежит в пределах [-128..127]. Результатом сравнения "ch == 0xB7" и "ch==0xBB" всегда будет ложь (false). Чтобы код был корректен переменная 'ch' должна иметь тип 'unsigned char'. Исправленный код:

    unsigned char ch = strText[i];
    switch (ch)
    {
    ...
    case 0xB7:
    case 0xBB:
      strHTML += ch;
      strHTML += "<wbr>";
      bLastCharSpace = FALSE;
      nNonbreakChars = 0;
      break;
    ...
    }

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

CWE-561 CERT-MSC12-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V551.