メインコンテンツ

ISO/IEC TS 17961 [swtchdflt]

switch ステートメントでの暗黙的な既定値の使用

説明

ルール定義

switch ステートメントでの暗黙的な既定値の使用。1

Polyspace 実装

このチェッカーは、switch 条件の case がありませんをチェックします。

すべて展開する

問題

switch 条件の case がありませんは、switch 変数が case ステートメントでカバーされていない値を取る可能性があると発生します。

メモ

Bug Finder では、switch 変数が全範囲でない場合にのみ欠陥が報告されます。

リスク

switch 変数が case ステートメントでカバーされていない値を取る場合、プログラムで想定外の動作になることがあります。

セキュリティについての判定をする switch ステートメントは、取りうる値が必ずしもすべて明示的に扱われているわけではない場合、特に脆弱になります。攻撃者はこの状況を利用して正規の実行フローを逸脱させることができます。

修正方法

case ステートメントでカバーされない値をすべてキャッチする受け皿として default ステートメントを使用することをお勧めします。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 は、case ステートメントでカバーされていない値 UNKNOWN を取ることができます。

修正 — 既定の条件を追加

1 つの修正方法として、取りうる値のうち 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 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.