ISO/IEC TS 17961 [swtchdflt]

Использование подразумеваемого значения по умолчанию в операторе switch

Описание

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

Использование подразумеваемого значения по умолчанию в операторе switch. [1]

Примеры

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

Описание

Недостающий случай для условия переключателя происходит когда switch переменная может принять значения, которые не покрыты case оператор.

Примечание

Средство поиска ошибки только повышает дефект, если переменная переключателя не является полным спектром.

Риск

Если switch переменная принимает значение, которое не покрыто case оператор, ваша программа может иметь непреднамеренное поведение.

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

Фиксация

Это - хорошая практика, чтобы использовать default оператор как вместилище для значений, которые не покрыты case оператор. Даже если switch переменная принимает непреднамеренное значение, получившееся поведение может ожидаться.

Пример - Недостающее условие по умолчанию

#include <stdio.h>
#include <string.h>

typedef enum E
{
    ADMIN=1,
    GUEST,
    UNKNOWN = 0
} LOGIN;

static LOGIN system_access(const char *username) {
  LOGIN user = UNKNOWN;

  if ( strcmp(username, "root") == 0 )
    user = ADMIN;

  if ( strcmp(username, "friend") == 0 )
    user = GUEST;

  return user;
}

int identify_bad_user(const char * username)
{
    int r=0;

    switch( system_access(username) ) 
    {
    case ADMIN:
        r = 1;
        break;
    case GUEST:
        r = 2;
    }

    printf("Welcome!\n");
    return r;
}

В этом примере, enum параметр User может принять значение UNKNOWN это не покрыто case оператор.

Коррекция — добавляет условие по умолчанию

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

#include <stdio.h>
#include <string.h>

typedef enum E
{
    ADMIN=1,
    GUEST,
    UNKNOWN = 0
} LOGIN;

static LOGIN system_access(const char *username) {
  LOGIN user = UNKNOWN;

  if ( strcmp(username, "root") == 0 )
    user = ADMIN;

  if ( strcmp(username, "friend") == 0 )
    user = GUEST;

  return user;
}

int identify_bad_user(const char * username)
{
    int r=0;

    switch( system_access(username) ) 
    {
    case ADMIN:
        r = 1;
        break;
    case GUEST:
        r = 2;
	break;
    default:
        printf("Invalid login credentials!\n");
    }

    printf("Welcome!\n");
    return r;
}

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

Разрешимость: разрешимый

Введенный в R2019a


[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.