ПроблемаНедостающий случай для условия переключателя происходит когда switch
переменная может принять значения, которые не покрыты case
оператор.
Примечание
Bug Finder только повышает дефект, если переменная переключателя не является полным спектром.
РискЕсли 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;
}