MISRA C:2012 Rule 13.2

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

Описание

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

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

Объяснение

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

Реализация Polyspace

Polyspace® повышает нарушение, если выражение удовлетворяет какому-либо из этих условий:

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

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

  • Выражение содержит один volatile объект, который происходит многократно.

  • Выражение содержит больше чем один volatile объект.

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

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

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

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

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

Примеры

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

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

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

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

В этом примере правило нарушено оператором 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).

struct {
	volatile float x; 
	volatile float y; 
} volData;

float xCopy;
float yCopy;
float res, res2;

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

В этом примере, выражение volData.x + volData.y несовместимо, потому что выражение включает несколько энергозависимых объектов. Выражение состоит из трех операций: доступ к значению volData.x, доступ к значению volData.y, и сложение. Значения энергозависимых полей x и y в volData структура может измениться в любое время. Значение res может варьироваться, в зависимости от которого переменная читается сначала. Поскольку стандарт C не задает порядок, в котором переменные читаются, значение res может зависеть от аппаратного и программного обеспечения, которое вы используете. Polyspace отмечает один из volatile объекты в выражении. Точно так же Polyspace отмечает один из volatile объекты в выражении volData.x * volData.x.

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

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

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