メインコンテンツ

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

MISRA C:2023 Rule 14.2

A for loop shall be well-formed

R2024a 以降

説明

ルール定義

A for loop shall be well-formed

根拠

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

Polyspace 実装

for ループは、3 つの句とループ本体を含む制御ステートメントで構成されます。チェッカーは以下の場合に違反を報告します。

  • 最初の句に初期化が含まれていない (句が空の場合を除く)。チェッカーは、for ループの最初の句で最後に代入される変数をループ カウンターと見なします。最初の句が空の場合、チェッカーは 3 番目の句でインクリメントまたはデクリメントされる変数をループ カウンターと見なします。

  • 2 番目の句に、ループ カウンターを含む比較演算が含まれていない。

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

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

  • ループ カウンターがループ本体内でインクリメントされる。

Polyspace® は、2 番目の句にループ カウンターを含む二項演算が含まれている場合、違反を報告しません。

トラブルシューティング

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

すべて展開する

void foo(void){

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

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

修正 — 別の変数を使用して早期に終了

1 つの修正方法として、追加フラグを使用してループを早期終了します。

この修正では、for ループの 2 番目の句はカウンターの値 index < 5 および追加フラグ !flag に依存します。追加フラグにより、for ループ定義とカウンターは読み取り可能なままで、ループを早期に終了できます。

#define FALSE 0
#define TRUE  1

void foo(void){

    int flag = FALSE;

    for(short index=0; (index < 5) && !flag; index++){ /* Compliant */
        if((index % 4) == 0){
            flag = TRUE;        /* 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

バージョン履歴

R2024a で導入