exponenta event banner

MISRA C:2012 Rule 16.4

Каждый оператор switch должен иметь метку по умолчанию

Описание

Определение правила

Каждый оператор switch должен иметь метку по умолчанию

Объяснение

Требование к default метка является защитным программированием. Даже если ваш переключатель покрывает все возможные значения, нет гарантии, что вход принимает одно из этих значений. Операторы, следующие за default Метка примите соответствующие меры. Если на default метка не требует никаких действий, используйте комментарии, чтобы описать, почему нет конкретных действий.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

short func1(short xyz){

    switch(xyz){      /* Non-compliant - default label is required */
        case 0:
            ++xyz;
            break;
        case 1:
        case 2:
            break;
    }
    return xyz;
}

В этом примере оператор switch не включает в себя default метка, и, следовательно, несовместима.

Коррекция - Добавить default С флагом ошибки

Одной из возможных коррекций является использование default пометить, чтобы пометить входные ошибки. Если ваши предложения switch покрывают все ожидаемые входы, то случаи по умолчанию помечают любые входные ошибки.

short func1(short xyz){
int errorflag = 0;
    switch(xyz){      /* Compliant */
        case 0:
            ++xyz;
            break;
        case 1:
        case 2:
            break;
        default:
            errorflag = 1;
            break;
    }
    if (errorflag == 1)
        return errorflag;
    else 
        return xyz;
}
enum Colors{ 
    RED, GREEN, BLUE 
};

enum Colors func2(enum Colors color){
    enum Colors next;
    
    switch(color){      /* Non-compliant - default label is required */
        case RED:
            next = GREEN;
            break;
        case GREEN:
            next = BLUE;
            break;
        case BLUE:
            next = RED;
            break;
    }
    return next;
}

В этом примере оператор switch не включает в себя default метка, и, следовательно, несовместима. Несмотря на то, что этот оператор switch обрабатывает все значения перечисления, нет гарантии, что цвет принимает одно из этих значений.

Коррекция - Добавить default

Чтобы быть совместимым, добавьте default пометьте конец вашего коммутатора. Можно использовать этот случай, чтобы пометить неожиданные входы.

enum Colors{ 
    RED, GREEN, BLUE, ERROR
};

enum Colors func2(enum Colors color){
    enum Colors next;
    
    switch(color){      /* Compliant */
        case RED:
            next = GREEN;
            break;
        case GREEN:
            next = BLUE;
            break;
        case BLUE:
            next = RED;
            break;
        default: 
            next = ERROR;
            break;
    }

    return next;
}

Проверяйте информацию

Группа: Операторы Switch
Категория: Требуемая
Категория СМЖЛ: Консультационная