Правило 9.4 MISRA C:2012

Элемент объекта не должен быть инициализирован несколько раз

Описание

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

Элемент объекта не должен быть инициализирован несколько раз.

Объяснение

Обозначенные инициализаторы позволяют явным образом инициализировать элементы объектов, такие как массивы в любом порядке. Однако с помощью обозначенных инициализаторов, можно непреднамеренно инициализировать тот же элемент дважды и поэтому перезаписать первую инициализацию.

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

Элемент объекта не должен быть инициализирован несколько раз.

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

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

Примеры

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

void func(void) {
    int a[5] = {-2,-1,0,1,2};               /* Compliant */
    int b[5] = {[0]=-2, [1]=-1, [2]=0, [3]=1, [4]=2};
                                            /* Compliant */
    int c[5] = {[0]=-2, [1]=-1, [1]=0, [3]=1, [4]=2};
                                            /* Non-compliant */
}

В этом примере нарушено правило, когда элемент массива c[1] инициализируется дважды с помощью обозначенного инициализатора.

struct myStruct {
    int a;
    int b;
    int c;
    int d;
};

void func(void) {
    struct myStruct struct1 = {-4,-2,2,4};   /* Compliant */
    struct myStruct struct2 = {.a=-4, .b=-2, .c=2, .d=4};
                                             /* Compliant */
    struct myStruct struct3 = {.a=-4, .b=-2, .b=2, .d=4};
                                             /* Non-compliant */
}

В этом примере нарушено правило, когда struct3.b инициализируется дважды с помощью обозначенного инициализатора.

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

Группа: инициализация
Категория: необходимый
Категория AGC: необходимый
Язык: C99

Введенный в R2014b