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

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

Описание

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

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

Объяснение

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

Реализация Polyspace

Выражение может иметь различные значения при следующих условиях:

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

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

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

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

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).

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

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