メインコンテンツ

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

A switch statement shall be a well-formed switch statement.

説明

ルール定義

A switch statement shall be a well-formed switch statement. 1

根拠

C++ 規約の構文ルールの他に、MISRA は適格 switch ステートメントの作成に関する独自の構文ルールを定義しています。この追加の構文ルールにより、switch ステートメントの構造の一貫性が確保されます。

追加の MISRA 構文ルールには以下のものがあります。

ルール構文
switch-statementswitch (condition) {case-label-clause-list default-label-clauseopt}
case-label-clause-list

case-label case-clauseopt

case-label-clause-list case-label case-clauseopt

case-labelcase const-expression
case-clause

case-block-seqopt break ;

case-block-seqopt throw assignment-expressionopt ;

{ statement-seqopt break ; }

{ statement-seqopt throw assignment-expressionopt ; }

default-label-clausedefault-label default-clause
default-label default-clausedefault : case-clause
case-block

expression_statement

compound_statement

selection_statement

iteration_statement

try_block

case-block-seq

case-block

case-block-seq case-block

この表の項目の定義は次のとおりです。

  • switch-labelcase-label または default-label

  • case-clause — 任意の 2 つの switch-labels で囲まれたコード。

  • default-clausedefault-label から switch ステートメントの終わりまでの間のコード。

  • switch-clausecase-clause または default-clause

MISRA C++ switch 構文ルールは、次のステートメントを含まないものの、switch-clause ステートメントの本体を形成する複合ステートメント内でこれらを使用することを許可します。

  • labelled_statement

  • jump_statement

  • declaration_statement

Polyspace 実装

ルール チェッカーは、次の場合に違反を報告します。

  • switch ステートメントと最初の case ステートメントの間に別のステートメントが発生する。

    次に例を示します。

    switch(ch) {
      int temp;
      case 1:
        break;
      default:
        break;
    }

  • switch ブロック内にラベルまたは gotoreturn などのジャンプ ステートメントが発生する。

  • すべてのブロックの外の case ステートメント内で変数を宣言している。

    次に例を示します。

    switch(ch) {
      case 1: 
        int temp;
        break;
      default:
        break;
    }

トラブルシューティング

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

すべて展開する

この例は、MISRA の適格 switch ステートメントに関する 2 つのルールに従っていません。

  • switch ステートメントと最初の case ステートメントの間に int temp; ステートメントが発生する。

  • case 2 に return ステートメントが含まれている。

switch ステートメント内に複数の違反がありますが、Polyspace は、switch ステートメント全体について 1 つの違反を報告します。

int example(int x)
{
	switch (x) {			//Noncompliant
		int temp;
		case 0:
			break;
		case 1:
		case 2:
			return x;
		default:  
			break;
	}

	return x;
}

チェック情報

グループ: 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.