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

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

Описание

Управляйте определением

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

Объяснение

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

Обменивайтесь сообщениями в отчете

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

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

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, чтобы отметить входные ошибки. Если ваши пункты переключателя касаются всего ожидаемого входа, то случаи по умолчанию отмечают любые входные ошибки.

short func1(short xyz){

    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
Категория: необходимый
Категория AGC: консультация
Язык: C90, C99