Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C. Оно требует, чтобы инициализаторы для агрегатов и объединений оборачивались в фигурные скобки. Правило применимо как для объектов, так и для всех подобъектов.
Исключения:
Рассмотрим пример:
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 };
Данная диагностика классифицируется как:
|