exponenta event banner

MISRA C:2012 Правило 16.4

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

Описание

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

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

Объяснение

Требование для default label - это защитное программирование. Даже если коммутатор охватывает все возможные значения, нет гарантии, что вход примет одно из этих значений. Заявления после 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;
}

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

Группа: Операторы переключения
Категория: Обязательно
СМЖЛ Категория: Консультативные услуги