MISRA C:2012 Rule 13.1

Списки инициализаторов не должны содержать стойких побочных эффектов

Описание

Определение правила

Списки инициализаторов не должны содержать стойких побочных эффектов.

Объяснение

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

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

volatile int v;
int x;
int y;

void f(void) {
    int arr[2] = {x+y,x-y};  /* Compliant */
    int arr2[2] = {v,0};      /* Non-compliant */
    int arr3[2] = {x++,y};    /* Non-compliant */
}

В этом примере правило не нарушается при первой инициализации, потому что инициализатор также не изменяется x или y. Правило нарушается в других инициализациях.

  • Во второй инициализации, потому что v является летучим, инициализатор может изменять v.

  • В третьей инициализации инициализатор изменяет переменную x.

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

Группа: Побочные эффекты
Категория: Требуемая
Категория AGC: Требуется
Введенный в R2014b