メインコンテンツ

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

MISRA C:2012 Rule 14.2

A for loop shall be well-formed

説明

ルール定義

A for loop shall be well-formed 1 .

根拠

for ループは柔軟なループ機能を提供します。制御ステートメント内のループ カウンターの初期化、終了およびインクリメントや、ループ本体内の任意の場所でのループ カウンターのインクリメントの他にも演算を実行できます。ただし、制限されたループ形式を使用すると、コードのレビューと解析が容易になります。

Polyspace 実装

for ループは、ループ カウンター、ループ フラグ、ループ本体の 3 つの式で構成されます。最初の式で最後に代入される変数がループ カウンターと見なされます。チェッカーは、for ループのコンポーネントが次のプロパティを示す場合に違反を報告します。

  • for ループの最初の式 —

    • ループ カウンターを初期化しない。

    • ループ カウンターの値を設定する以外の二次的影響がある。

  • for ループの 2 番目の式 —

    • ループ カウンターを含む比較演算が含まれていない。

    • ループ本体でも使用されているオブジェクトを使用している。

    • 二次的影響がある。

  • for ループの 3 番目の式 —

    • ループ カウンターのインクリメントまたはデクリメント以外の (コンマで区切られてインクリメントまたはデクリメントから分離された) 演算が含まれている。

    • ループ本体でも使用されているオブジェクトを使用している。

    • ループ カウンターを更新する以外の二次的影響がある。

  • ループ カウンター —

    • 整数ではないデータ型、またはポインター型が使用されている。

    • ループ本体内で更新される。

Polyspace® は、2 番目の式にループ カウンターを含む二項演算が含まれている場合、違反を報告しません。複数のループ カウンターを使用するループは、このルールに対する違反として報告されます。ループ カウンターが構造体またはクラスに含まれている場合、その構造体またはクラスの更新は、ループ カウンターの更新と見なされます。

トラブルシューティング

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

すべて展開する

void foo(void){

    for(short index=0; index < 5; index++){  /* Non-compliant */
        index = index + 3;       /* Altering the loop counter */
    }
}

この例では、ループ カウンター indexfor ループ内で変化します。ループがいつ終了するか判定するのは困難です。

修正 — break を使用してループを終了する

1 つの修正方法として、break ステートメントを使用してループを早期終了します。

この修正では、条件が true の場合に、ループ本体が明示的にループを終了します。

void foo(void) {
	for(short index = 0; (index < 5); index++) { /* Compliant */
		if((index % 4) == 0) {
			break;       /* allows early termination of loop */
		}
	}
}
void foo(void){
    for(short index = 0; ; index++) {}   /* Non-compliant */

    for(short index = 0; index < 10;) {} /* Non-compliant */

    short index;
    for(; index < 10;) {}     /* Non-compliant */

    for(; index < 10; index++) {} /* Compliant */

    for(;;){}  
          /* Compliant - Exception all three clauses can be empty */
}

この例では、さまざまな空の句をもつ for ループ定義を示しています。準拠するには、for ループ (9 行目) の前に最初の句の変数を初期化します。ただし、2 番目と 3 番目の句がなければ、for ループは成立しません。

例外は無限ループを許可するように 3 つの句をすべて空にした for ループです。

チェック情報

グループ: 制御ステートメントの式
カテゴリ: 必要
AGC カテゴリ: Readability

バージョン履歴

すべて展開する


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.