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

Правый операнд логического && или || оператор не должен содержать персистентные побочные эффекты

Описание

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

Правый операнд логического && или || оператор не должен содержать персистентные побочные эффекты.

Объяснение

Правильный операнд оператора || не оценен, если левый операнд верен. Правильный операнд оператора && не оценен, если левый операнд ложный. В этих случаях, если правильный операнд изменяет значение переменной, не происходит модификация. После операции, если вы ожидаете измененное значение переменной, не может всегда происходить модификации.

Реализация Polyspace

  • Для этого правила Polyspace® полагает, что все вызовы функции имеют персистентный побочный эффект.

    Если чистая функция отмечается, прежде, чем проигнорировать это нарушение правила, убедитесь, что функция не имеет никаких побочных эффектов. Например, функции с плавающей точкой, такие как abs(), кажется, только возвращают значение и не имеют никакого другого побочного эффекта. Однако эти функции используют Стек Регистра FPU и могут иметь побочные эффекты в определенной архитектуре, например, определенной архитектуре Intel®.

  • Если правильный операнд является энергозависимой переменной, Polyspace не отмечает это, как правило, нарушение.

Обменивайтесь сообщениями в отчете

Правый операнд && оператора не должен содержать побочные эффекты. Правый операнд || оператор не должен содержать побочные эффекты.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

int check (int arg) {
    static int count;
    if(arg > 0) {
        count++;                   /* Persistent side effect */
        return 1;
    }
    else
        return 0;
}

int getSwitch(void);
int getVal(void);

void main(void) {
    int val = getVal();
    int mySwitch = getSwitch();
    int checkResult;

    if(mySwitch && check(val)) {   /* Non-compliant */
    }

    checkResult = check(val);
    if(checkResult && mySwitch) {  /* Compliant */
    }
    
    if(check(val) && mySwitch) {   /* Compliant */
    }
}

В этом примере нарушено правило, когда правильный операнд операции && содержит вызов функции. Вызов функции имеет персистентный побочный эффект, потому что статическая переменная count изменяется в теле функции. В зависимости от mySwitch эта модификация может или не может произойти.

Правило не нарушено, когда левый операнд содержит вызов функции. Также, чтобы избежать нарушения правила, присвойте результат вызова функции к переменной. Используйте эту переменную в логической операции вместо вызова функции.

В этом примере вызов функции имеет побочный эффект изменения переменной static. Polyspace отмечает все вызовы функции, когда используется на правой стороне логического && или оператора ||, даже когда функция не имеет побочного эффекта. Вручную осмотрите свое тело функции, чтобы видеть, имеет ли оно побочные эффекты. Если функция не имеет побочных эффектов, добавьте комментарий и выравнивание в вашем результате Polyspace, объясняющем, почему вы сохранили свой код.

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

Группа: побочные эффекты
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2014b