MISRA C:2012 Rule 13.5

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

Описание

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

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

Объяснение

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

Реализация 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