MISRA C:2012 Rule 13.2

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

Описание

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

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

Объяснение

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

Реализация Polyspace

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

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

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

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

Обменивайтесь сообщениями в отчете

Значение 'XX' зависит от порядка оценки. Значение энергозависимых 'XX' зависит от порядка оценки из-за нескольких доступов.

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

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

Примеры

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

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++);       /* Noncompliant  */
}

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

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

void main () {
    unsigned int i=0;
    f ( i++, i );                 /* Non-compliant */
}

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

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

Группа: побочные эффекты
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2014b