MISRA C:2012 Rule 13.2

Значение выражения и его персистентных побочных эффектов должно быть тем же самым согласно всем разрешенным порядкам оценки

Описание

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

Значение выражения и его персистентных побочных эффектов должно быть тем же самым согласно всем разрешенным порядкам оценки.

Объяснение

Если выражение приводит к различным значениям в зависимости от порядка оценки, ее значение становится заданным реализацией.

Реализация Polyspace

Выражение может иметь различные значения при следующих условиях:

  • Та же переменная изменяется несколько раз в выражении, или и считана и записана.

  • Выражение позволяет больше чем один порядок оценки.

Поэтому это правило запрещает выражения, где переменная изменяется несколько раз и может вызвать различные результаты согласно различным порядкам оценки.

Дополнительное сообщение в отчете

Значение 'XX' зависит от порядка оценки. Значение энергозависимых 'XX' зависит от порядка оценки из-за нескольких доступов.

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

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

Примеры

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

int a[10], b[10];
#define COPY_ELEMENT(index) (a[(index)]=b[(index)])

void main () {
    int i=0, k=0;

    COPY_ELEMENT (k);         /* Compliant */
    COPY_ELEMENT (i++);       /* Noncompliant  */
}

В этом примере правило нарушено оператором COPY_ELEMENT(i++) потому что i++ происходит дважды, и порядок оценки этих двух выражений не задан.

void f (unsigned int param1, unsigned int param2) {}

void main () {
    unsigned int i=0;
    f ( i++, i );                 /* Non-compliant */
}

В этом примере нарушено правило, потому что это не задано ли операция i++ происходит прежде или после того, как второй аргумент передается f. Вызов f(i++,i) может перевести в любой f(0,0) или f(0,1).

volatile float res;
volatile float x; 
volatile float y; 

float xCopy;
float yCopy;


void function4(void) {
    res = x + y;          //Noncompliant
    xCopy = x;
    yCopy = y;
    res = xCopy + yCopy;  //Compliant
} 

В этом примере, выражение x + y несовместимо, потому что выражение включает несколько энергозависимых переменных. Выражение эффективно состоит из трех операций, получая доступ к значению x, доступ к значению y, и наконец сложение. Значения энергозависимых переменных x и y может варьироваться, в зависимости от которого переменная читается сначала. Стандарт не задает порядок, в котором читаются переменные. Поэтому результат выражения может отличаться согласно позволенным порядкам оценки. Например, это возможно то чтение x первые результаты в изменении в значении y, который впоследствии читается.

Чтобы избежать нарушения, присвойте энергозависимые переменные энергонезависимым временным переменным и используйте эти временные переменные в выражении.

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

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

Введенный в R2014b