Missing case for switch condition

switch переменная, не охваченная случаями, и случай по умолчанию отсутствует

Описание

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

Примечание

Bug Finder поднимает дефект, только если переменная switch не является полной области значений.

Риск

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

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

Зафиксировать

Рекомендуется использовать default оператор как catch-all для значений, которые не охвачены 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
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 478
Введенный в R2015b