MISRA C:2012 Rule 15.4

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

Описание

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

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

Объяснение

Если вы используете один 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 оператор во внутреннем цикле.

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

Группа: Поток управления
Категория: консультация
Категория AGC: консультация
Введенный в R2014b