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