exponenta event banner

MISRA C:2012 Правило 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.

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

Группа: Побочные эффекты
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b