MISRA C++:2008 Rule 5-0-1

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

Описание

Примечание

Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.

Управляйте определением

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

Объяснение

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

Реализация Polyspace

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

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

  • Выражение позволяет больше чем один порядок оценки.

  • Выражение содержит один volatile объект, который происходит многократно.

  • Выражение содержит больше чем один volatile объект.

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

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

int a[10], b[10];
#define COPY_ELEMENT(index) (a[(index)]=b[(index)]) 
void main () {
    int i=0, k=0;

    COPY_ELEMENT (k);         // Compliant 
    COPY_ELEMENT (i++);    // // Non-compliant  
}

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

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 повышает этот дефект.

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

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

Вопросы совместимости

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

Не рекомендуемый запуск в R2021b

Введенный в R2013b