exponenta event banner

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

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

Описание

Определение правила

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

Объяснение

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

Внедрение 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 комментарий и обоснование, объясняющие, почему вы сохранили код.

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

Группа: Побочные эффекты
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b