MISRA C:2012 Rule 9.4

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

Описание

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

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

Объяснение

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

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

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

Примеры

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

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: необходимый
Введенный в R2014b