メインコンテンツ

MISRA C:2012 Rule 15.4

There should be no more than one break or goto statement used to terminate any iteration statement

説明

ルール定義

There should be no more than one break or goto statement used to terminate any iteration statement 1 .

根拠

ループ内で break または goto ステートメントの使用を 1 つにすると、ループからの二次的な出口は 1 つになります。この方法でループの出口の数を制限すると、コードの視覚上の複雑さが軽減します。

トラブルシューティング

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

すべて展開する

volatile int stop;

int func(int *arr, int size, int sat) {
    int i,j;
    int sum = 0;
    for (i=0; i< size; i++) {   /* Compliant  */
        if(sum >= sat)
            break;
        for (j=0; j< i; j++) {  /* Compliant */
            if(stop)
                break;
            sum += arr[j];
        }
    }
}

この例では、内側と外側のループに break ステートメントが 1 つずつあり、どちらのループもルールに違反しません。

volatile int stop;

void displayStopMessage();

int func(int *arr, int size, int sat) {
    int i;
    int sum = 0;
    for (i=0; i< size; i++) {
        if(sum >= sat)
            break;
        if(stop)
            goto L1;   /* Non-compliant  */
        sum += arr[i];
    }
    
    L1: displayStopMessage();
}

この例では、for ループに break ステートメントが 1 つと goto ステートメントが 1 つあるため、ルールに違反します。

volatile int stop;

void displayMessage();

int func(int *arr, int size, int sat) {
    int i,j;
    int sum = 0;
    for (i=0; i< size; i++) {
        if(sum >= sat)
            break;
        for (j=0; j< i; j++) { /* Compliant */
            if(stop)
                goto L1;  /* Non-compliant */ 
            sum += arr[i];
        }
    }
   
    L1: displayMessage();
}

この例では、内側のループでは 1 つの goto ステートメントを介してのみループを抜けられるので、ルールに違反しません。しかし、外側のループでは、内側のループ内の break ステートメントまたは 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.