AUTOSAR C++14 Rule 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 объект в выражении.

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

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

Группа: Выражения
Категория: Необходимый, Автоматизированный
Введенный в R2019a