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