メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CERT C: Rec.MSC17-C

case ラベルに関連付けるステートメントのすべてのセットを break ステートメントで終了する

説明

ルール定義

case ラベルに関連付けるステートメントのすべてのセットを break ステートメントで終了します。1

Polyspace 実装

ルール チェッカーは、"switch case の break がありません" をチェックします。

すべて展開する

問題

switch case の break がありませんでは、break ステートメントで終了しない switch case を調べます。

case ブロックの最後のエントリがコード コメントの場合の例:

switch (wt)
    {
      case WE_W:
        do_something_for_WE_W();
        do_something_else_for_WE_W();
        /* fall through to WE_X*/
      case WE_X:
        ...
    }
Polyspace は、break がないのは意図的であると判断され、欠陥が発生しないことを前提とします。

リスク

switch case に break ステートメントがないと、次の switch case が実行されます。この動作が意図的でない場合、switch case のコードが意図せず実行され、switch が予期しない結果で終わる可能性があります。

修正方法

強調表示された switch case を break しない場合は、コードにコメントを追加して、この case に続いて次の case が実行される理由を示します。このコメントにより、結果から欠陥が削除され、コードの保守が容易になります。

break ステートメントを忘れた場合は、switch case が終わる前に追加します。

例 - break ステートメントのない switch

この例には、break ステートメントがない case が 2 つあります。wtWE_W のとき、プログラムでは 2 つの case を中断しないでそのまま続行するため、WE_WWE_X のステートメントと default のケースが実行されます。default の case または最後の case には break ステートメントが必要ないため、違反は報告されません。

enum WidgetEnum { WE_W, WE_X, WE_Y, WE_Z } widget_type;

extern void demo_do_something_for_WE_W(void);
extern void demo_do_something_for_WE_X(void);
extern void demo_report_error(void);

void bug_missingswitchbreak(enum WidgetEnum wt)
{
   
    switch (wt)
    {
      case WE_W:  //Noncompliant
        demo_do_something_for_WE_W();
      case WE_X:  //Noncompliant
        demo_do_something_for_WE_X();
      default:
        /* Handle error condition */
        demo_report_error();
    }
}
修正 — コメントまたは break を追加

この例を修正するには、コメントを追加して印を付け、この動作を許可する理由を説明するか、break ステートメントを追加してこの動作を回避します。この例では、case WE_W はそのまま続行することを想定しているため、コメントを追加して明示的にこの動作を示します。2 つ目の case では、default ケースの続行を回避するため break ステートメントを追加します。

enum WidgetEnum { WE_W, WE_X, WE_Y, WE_Z } widget_type;

extern void demo_do_something_for_WE_W(void);
extern void demo_do_something_for_WE_X(void);
extern void demo_report_error(void);

void corrected_missingswitchbreak(enum WidgetEnum wt)
{
    switch (wt)
    {
      case WE_W:
        demo_do_something_for_WE_W();
        /* fall through to WE_X*/
      case WE_X:
        demo_do_something_for_WE_X();
        break;  
      default:
        /* Handle error condition */
        demo_report_error();
    }
}

チェック情報

グループ: Rec.48.その他 (MSC)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.