exponenta event banner

Отсутствует вариант для условия переключения

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

Описание

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

Примечание

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

Риск

Если 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++
По умолчанию: Откл.
Синтаксис командной строки: MISSING_SWITCH_CASE
Воздействие: Низкий
CWE ID: 478
Представлен в R2015b