MISRA C:2012 Rule 15.4

Не должно быть более одного оператора break или goto, используемого для завершения любого оператора итерации

Описание

Определение правила

Для завершения любого оператора итерации не должно использоваться более одного оператора break или goto.

Объяснение

Если вы используете один break или goto оператор в вашем цикле, у вас есть одна вторичная выходная точка из цикла. Ограничение количества выходов из цикла таким образом уменьшает визуальную сложность вашего кода.

Поиск и устранение проблем

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

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 каждый оператор.

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 оператор и один goto оператор.

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();
}

В этом примере правило не нарушается во внутреннем цикле, потому что вы можете выйти из цикла только через тот goto оператор. Однако правило нарушается во внешнем контуре, потому что вы можете выйти из цикла через break оператор или goto оператор во внутреннем цикле.

Проверяйте информацию

Группа: Управляйте Потоком
Категория: Консультационные
Категория СМЖЛ: Консультационная
Введенный в R2014b