MISRA C++:2008 Rule 5-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 повышает этот дефект.

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

Группа: Выражения
Категория: необходимый
Введенный в R2013b