MISRA C:2012 Rule 9.4

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

Описание

Примечание

Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.

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

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

Объяснение

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

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

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

Вопросы совместимости

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

Не рекомендуемый запуск в R2021b

Введенный в R2014b