>
>
>
V2624. MISRA. The initializer for an ag…


V2624. MISRA. The initializer for an aggregate or union should be enclosed in braces.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

Это правило актуально только для C. Оно требует, чтобы инициализаторы для агрегатов и объединений оборачивались в фигурные скобки. Правило применимо как для объектов, так и для всех подобъектов.

Исключения:

  • Для инициализации подобъектов используется инициализатор в виде '{ 0 }'.
  • Массив инициализируется через строковый литерал.
  • Структура или объединение с automatic storage duration инициализируется через выражение, совместимое со структурой или объединением.
  • Для инициализации части подобъекта используется назначенная (designated) инициализация.

Рассмотрим пример:

int num[3][2] = { 1, 2, 3, 4, 5, 6 };

В данном коде представлены инициализаторы массива, которые не оборачиваются в фигурные скобки. Корректный код:

int num[3][2] = { { 1, 2 }, { 3, 4 }, { 5, 6 } };

Рассмотрим ещё один пример:

struct S1
{
  char buf;
  int num[3][2];

} s1[4] = { 
        'a', { 1, 2 }, { 0, 0 }, { 5, 6 },
        'b', { 1, 2 }, { 0, 0 }, { 5, 6 },
        'c', { 1, 2 }, { 0, 0 }, { 5, 6 },
        'd', { 1, 2 }, { 0, 0 }, { 5, 6 }
};

Правило требует, чтобы инициализаторы агрегатов также оборачивались в фигурные скобки. Корректный код будет выглядеть так:

struct S1
{
  char buf;
  int num [3][2];

} s1[4] = {
        { 'a', { { 1, 2 }, { 0, 0 }, { 5, 6 } } },
        { 'b', { { 1, 2 }, { 0, 0 }, { 5, 6 } } },
        { 'c', { { 1, 2 }, { 0, 0 }, { 5, 6 } } },
        { 'd', { { 1, 2 }, { 0, 0 }, { 5, 6 } } }
};

Рассмотрим вот такой случай:

struct S2 {
  char color[8];
  int num;
} s2[3] = {
        { "Red",   1 },
        { "Green", 2 },
        { "Blue",  3 }
};

В данном примере символьный литерал также должен оборачиваться в фигурные скобки. Корректный код:

struct S2 {
  char color[8];
  int num;
} s2[3] = {
        { { "Red" },   1 },
        { { "Green" }, 2 },
        { { "Blue" },  3 }
};

Пример кода с назначенными (designated) инициализаторами:

int num[2][2] = { [0][1] = 0, { 0, 1 } };

Примеры кода с инициализатором в виде '{ 0 }':

int num1[3][2]  = { 0 }; 
int num2[3][2] = { { 1, 2 }, { 0 }, { 5, 6 } };
int num3[2][2] = { { 0 }, [1][1] = 1 };

Данная диагностика классифицируется как:

  • MISRA-C-9.2