Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для С. Язык C имеет специальный синтаксис инициализирующих выражений, называемый designated initializer. Он позволяет инициализировать элементы массива или структуры в произвольном порядке.
Например, можно инициализировать конкретные элементы массива:
int arr[4] = { [1] = 1, [3] = 2, };
Этот синтаксис работает и для структур:
struct point { int x; int y; }; struct point pt1 = { .x = 1, .y = 1, };
Однако при его использовании можно допустить ошибку и инициализировать один и тот же элемент дважды:
int arr[4] = { [3] = 1, [3] = 2, }; struct point pt1 = { .x = 1, .x = 1, };
MISRA запрещает данную конструкцию, т.к. стандарт языка не определяет, должны ли проявляться побочные эффекты в данной ситуации или нет. Скорее всего, такая ситуация возникла из-за опечатки.
Данная диагностика классифицируется как:
|