Недостающий случай для условия переключателя

Переменная switch, не покрытая случаями и случаем по умолчанию, отсутствует

Описание

Недостающий случай для условия переключателя происходит, когда переменная 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;
}

Информация о результате

Группа: безопасность
Язык: C | C++
Значение по умолчанию: 'off'
Синтаксис командной строки: MISSING_SWITCH_CASE
Влияние: низко
ID CWE: 478

Введенный в R2015b