exponenta event banner

MISRA C:2012 Правило 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