ISO/IEC TS 17961 [swtchdflt]

Использование подразумеваемого значения по умолчанию в операторе switch

Описание

Определение правила

Использование подразумеваемого значения по умолчанию в операторе switch.[1]

Реализация Polyspace

Эта проверка проверяет Отсутствующий случай для условия switch.

Примеры

расширить все

Проблема

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

Проверяйте информацию

Решимость: Решаема
Введенный в R2019a

[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.