メインコンテンツ

MISRA C:2012 Rule 16.4

Every switch statement shall have a default label

説明

ルール定義

Every switch statement shall have a default label 1

根拠

default ラベルの要件は防御的プログラミングです。switch が考えられるすべての値をカバーしていても、入力がそのいずれかの値を取る保証はありません。default ラベルの後に続くステートメントは適切なアクションを実行します。default ラベルにアクションが必要ない場合、コメントを使用して特定のアクションを取らない理由を記述します。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

short func1(short xyz){

    switch(xyz){      /* Non-compliant - default label is required */
        case 0:
            ++xyz;
            break;
        case 1:
        case 2:
            break;
    }
    return xyz;
}

この例では、switch ステートメントは、default ラベルを含まないため準拠しません。

修正 — エラー フラグをもつ default を追加

1 つの修正方法として、default ラベルを使用して入力エラーにフラグを立てます。switch 句が想定されるすべての入力をカバーしている場合、default ケースはすべての入力エラーにフラグを立てます。

short func1(short xyz){
int errorflag = 0;
    switch(xyz){      /* Compliant */
        case 0:
            ++xyz;
            break;
        case 1:
        case 2:
            break;
        default:
            errorflag = 1;
            break;
    }
    if (errorflag == 1)
        return errorflag;
    else 
        return xyz;
}
enum Colors{ 
    RED, GREEN, BLUE 
};

enum Colors func2(enum Colors color){
    enum Colors next;
    
    switch(color){      /* Non-compliant - default label is required */
        case RED:
            next = GREEN;
            break;
        case GREEN:
            next = BLUE;
            break;
        case BLUE:
            next = RED;
            break;
    }
    return next;
}

この例では、switch ステートメントは、default ラベルを含まないため準拠しません。この switch ステートメントがすべての列挙値を処理する場合でも、color がそのいずれかの値を取る保証はありません。

修正 — default を追加

準拠するには、switch の終わりに default ラベルを追加します。この case を使用して予期しない入力にフラグを立てられます。

enum Colors{ 
    RED, GREEN, BLUE, ERROR
};

enum Colors func2(enum Colors color){
    enum Colors next;
    
    switch(color){      /* Compliant */
        case RED:
            next = GREEN;
            break;
        case GREEN:
            next = BLUE;
            break;
        case BLUE:
            next = RED;
            break;
        default: 
            next = ERROR;
            break;
    }

    return next;
}

チェック情報

グループ: switch ステートメント
カテゴリ: 必要
AGC カテゴリ: 推奨

1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.