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 - имеет нормативное значение.