メインコンテンツ

データ型は switch 式に不適切な可能性があります

switch 式に char、short、int、または enum 以外のデータ型が含まれている

説明

この欠陥は、switch 式に charshortint、または enum 以外のデータ型が含まれている場合に発生します。

チェッカーは、boolean 型、ビット フィールド、long などの他の整数データ型にフラグを設定します。

リスク

以下の代わりに、charshortint、または enumswitch 式で使用することをお勧めします。

  • boolean 型。boolean 型を含む switch 式は、同じ式を評価する if 条件で置き換えることができます。switch 式は、boolean 条件に基づく単純な制御フローには重すぎます。

  • ビット フィールド型。ビット フィールド型はメモリ制限を意味します。有限個の値をもつ変数を指定するだけであれば、列挙型をお勧めします。列挙型を使用すれば、コードの読みやすさが向上します。

  • サイズが int より大きい型。サイズが int より大きい型が必要な switch 式は、case ラベルが多すぎることを意味し、再設計が必要になる可能性があります。

switch 式では、非整数型がサポートされていません。

修正方法

charshortint、または enum データ型の変数を switch 式に使用します。

すべて展開する

#ifndef __cplusplus
#include <stdbool.h>
#endif

void func(bool s) {
    switch(s) {
        case 0: //Perform some operation
        break;
        case 1: //Perform another operation
        break;
    }
}

この C++ の例では、チェッカーが switch 式での bool 変数の使用にフラグを設定します。

修正 — if 条件を switch の代わりに使用する

switch 式に 2 つの値が必要な場合は、代わりに if ステートメントを使用します。

#ifndef __cplusplus
#include <stdbool.h>
#endif


void func(bool s) {
    if(s) {
        //Perform some operation
        }
    else {
        //Perform another operation
        }
}
修正 — 別のデータ型を使用

後で switch 式内のラベルの数を増やす予定の場合は、より大きな値を格納可能なデータ型を使用します。

void func(char s) {
    switch(s) {
        case 0: //Perform some operation
        break;
        case 1: //Perform another operation
        break;
        default: //Default behavior
    }
}

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: INAPPROPRIATE_TYPE_IN_SWITCH
影響度: Low

バージョン履歴

R2020a で導入