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

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