Правило 15.4 MISRA C:2012

Должен быть не больше, чем один оператор завершения, или оператор перехода раньше отключал любой оператор цикла

Описание

Управляйте определением

Должен быть не больше, чем один оператор завершения, или оператор перехода раньше отключал любой оператор цикла.

Объяснение

Если вы используете один оператор 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++) {   /* Non-compliant  */
        if(sum >= sat)
            break;
        if(stop)
            goto L1;
        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++) {  /* Non-compliant */ 
        if(sum >= sat)
            break;
        for (j=0; j< i; j++) { /* Compliant */
            if(stop)
                goto L1;
            sum += arr[i];
        }
    }
   
    L1: displayMessage();
}

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

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

Группа: Поток управления
Категория: консультация
Категория AGC: консультация
Язык: C90, C99

Введенный в R2014b