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,v};      /* Non-compliant */
    int arr3[2] = {x++,x+y};    /* Non-compliant */
}

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

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

  • В третьей инициализации инициализатор изменяет переменную x. Инициализация arr3 отличается в зависимости от ли x++ оценен ранее или позже.

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

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