MISRA C:2012 Rule 13.5

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

Описание

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

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

Объяснение

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

Реализация 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: необходимый
Введенный в R2014b