exponenta event banner

MISRA C:2012 Правило 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.

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

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

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