Данное диагностическое правило основано на руководстве 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 запрещает данную конструкцию, т.к. стандарт языка не определяет, должны ли проявляться побочные эффекты в данной ситуации или нет. Скорее всего, такая ситуация возникла из-за опечатки.
Данная диагностика классифицируется как:
|