ПроблемаОтсутствующий случай для условия 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;
}