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