メインコンテンツ

MISRA C++:2008 Rule 6-4-5

An unconditional throw or break statement shall terminate every non - empty switch-clause.

説明

ルール定義

An unconditional throw or break statement shall terminate every non - empty switch-clause. 1

根拠

switch 句の終わりで throw または break ステートメントが使用されていない場合、制御フローは次の switch 句にフォール スルーします。この動作が意図されていない場合、予期しない結果になる可能性があります。意図されていないフォール スルー動作を防ぐには、throw または break ステートメントの使用が役立ちます。case 句と default 句のそれぞれで、最後のステートメントとして throw または break ステートメントを使用してください。

まったく同じステートメントが不要になるよう、フォール スルーを使用して複数の句をグループ化する場合は、空の case ラベルの使用が許容されます。

Polyspace 実装

Polyspace® は、case ラベルにステートメントが含まれていて、throw または break ステートメントが case ラベルの最後のステートメントになっていない場合は常に、この欠陥を報告します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cstdint>

int x, y = 2;

int example(int x)	 
{
    switch (x) { //Noncompliant error shows here
    case 0:              //Compliant empty fall through
    case 1:
        break;           //Compliant break
    case 2:
        x = y ^ 2;       //Unintentional fall through
    case 3:              //Compliant throw
        throw;

    default:             //Compliant break
        break;
    }

    return x;
}

case 2 に throw または break ステートメントが含まれていないため、このラベルは case 3 にフォール スルーします。このようなフォール スルーは非準拠です。

Case 0 は空の case ラベルであるため、case 1 にフォール スルーします。これはルールに準拠する、空の case ラベルのフォール スルーです。

チェック情報

グループ: Statements
カテゴリ: 必要

バージョン履歴

R2013b で導入


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.