exponenta event banner

Правило AUTOSAR C++ 14 A5-0-1

Значение выражения должно быть одинаковым при любом порядке оценки, который допускает стандарт

Описание

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

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

Объяснение

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

Внедрение Polyspace

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

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

  • Выражение допускает более одного порядка вычисления.

  • Выражение содержит один volatile объект, который встречается несколько раз.

  • Выражение содержит более одного volatile объект.

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

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

int a[10], b[10];
#define COPY_ELEMENT(index) (a[(index)]=b[(index)]) // Non-compliant  

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

    COPY_ELEMENT (k);         // Compliant 
    COPY_ELEMENT (i++);    // Violation happens on this line but macro definition is flagged.   
}

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

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

void main () {
    unsigned int i=0;
    f ( i++, i );                 // Noncompliant 
}

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

volatile int a, b;
int mathOp(int x, int y);

int foo(void){
	int temp = mathOp(5,a) + mathOp(6,b);//Noncompliant
	return temp * mathOp(a,a);//Noncompliant
}

В этом примере это правило нарушается дважды.

  • Объявление temp использует два volatile объектов в выражении. Потому что значение volatile объекты могут изменяться в любое время, выражение может вычисляться до различных значений в зависимости от порядка вычисления. Polyspace маркирует второе volatile объект в выражении.

  • return оператор использует то же самое volatile объект дважды. Поскольку выражение может иметь разные результаты в зависимости от порядка оценки, Polyspace поднимает этот дефект.

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

Группа: Выражения
Категория: Обязательно, Автоматизировано
Представлен в R2019a