exponenta event banner

ISO/IEC TS 17961 [swtchdflt]

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

Описание

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

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

Внедрение Polyspace

Эта проверка проверяет наличие отсутствующего варианта для условия переключения.

Примеры

развернуть все

Проблема

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

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

Разрешимость: Разрешимая
Представлен в R2019a

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