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