メインコンテンツ

MISRA C:2012 Rule 15.3

Any label referenced by a goto statement shall be declared in the same block, or in any block enclosing the goto statement

説明

ルール定義

Any label referenced by a goto statement shall be declared in the same block, or in any block enclosing the goto statement 1 .

根拠

制限のない goto ステートメントの使用により、プログラムは構造化されず解読しにくくなります。goto ステートメントによるブロック間でのジャンプまたは入れ子にされたブロックへのジャンプを制限すると、コードの視覚的な複雑さが軽減します。

トラブルシューティング

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

すべて展開する

void f1(int a) {
    if(a <= 0) {
        goto L2;        /* Non-compliant - L2 in different block*/
    }
    
    goto L1;            /* Compliant - L1 in same block*/

    if(a == 0) {
        goto L1;        /* Compliant - L1 in outer block*/
    }

    goto L2;            /* Non-compliant - L2 in inner block*/

    L1: if(a > 0) {
            L2:;
    }
}

この例では、goto ステートメントにより異なるラベルへのジャンプが発生しています。次の場合、このルールに違反します。

  • ラベルが goto ステートメントを含むブロックと異なるブロックにある。

    ラベルを含むブロックが現在のブロックを囲んでおらず、また現在のブロックで囲まれていない。

  • ラベルが goto ステートメントを含むブロックで囲まれたブロック内にある。

次の場合、このルールに違反しません。

  • ラベルが goto ステートメントを含むブロックと同じブロック内にある。

  • ラベルが goto ステートメントを含むブロックを囲むブロック内にある。

void f2 ( int x, int z ) {
    int y = 0;

    switch(x) {
    case 0:
        if(x == y) {
            goto L1;  /* Non-compliant - switch-clauses are treated as blocks */
        }
        break;
    case 1:
        y = x;
        L1: ++x;
        break;
    default:
        break;
    }

}

この例では、goto ステートメントのラベルは goto ステートメントを含むブロックを囲むブロック内にあるように見えます。ただし、このルールの目的のために、ソフトウェアは各 case ステートメントが新しいブロックを開始すると見なします。したがって、goto ステートメントはルールに違反します。

チェック情報

グループ: 制御フロー
カテゴリ: 必要
AGC カテゴリ: 推奨

バージョン履歴

R2014b で導入


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.