Missing case for switch condition

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