

Rule16.7 switch文の制御式は、実質的なブール型を持ってはいけない

とありますが、制御式に定数を使用することは、「実質的なブール型」に該当するでしょうか。

例:

[code]

    #define NUM 20
    switch(NUM)
    {
    case 10:
     break;
    case 20:
     break;
    default:
     break
    }
    
[/code]


CC BY-SA 4.0
2021-02-16T05:16:51.260
74038
2021-02-16T11:15:28.747
2021-02-16T11:15:28.747
43811
43811
question
c
MISRA-C 2012 Rule16.7について


この場合の「ブール型」は `true` / `false` 類似の２値のことと考えてよくて

[code]

    switch (something) {
    case some_true:
       true_job();
       break;
    default:
       false_job();
       break;
    }
    
[/code]

はダメよ、これなら `if` にすべきであると MISRA は主張しています。

制御式に３値以上あるなら `switch`
内で使う値が１値であっても該当しないと考えています。例えば組み込み機器の通信仕様として「データ取得」「データ設定」「返信」など３種類以上のコマンドタイプがあるとして、とあるコマンドは（今のところ）「取得」しか受け付けないなら

[code]

    enum message_type { mt_query, mt_change, mt_reply };
    /* 通信電文上、このコマンドは今のところ query しか対応しない */
    switch (message_type()) {
    case mt_query:
        return build_query_result();
    default:
        return build_negative_acknowledge();
    }
    
[/code]

は OK でしょう。このコードに対して MISRA が警告出しても「今後、コマンドの仕様を拡張することがありうる」という理由でオイラは逸脱を選択します。

提示例は理解しがたいです（そのようなコードを本当に書いているなら MISRA 以前にソースコードレビューで拒絶対象） `NUM`
が定数でなくて変数であって、値 `10` が `true` 相当、値 `20` が `false`
相当、それ以外の値は通常ならありえなくて、もし渡されてくるなら `assert` 相当（要するにバグなりハードウエア上の RAM 化け）なら 16.7
に該当します。


CC BY-SA 4.0
2021-02-16T06:11:27.830
74040
2021-02-16T06:11:27.830
8589
74038
answer