Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для С. Имена структур, перечислений и объединений должны быть уникальны для всех пространств имён и блоков. Повторное использование имён тегов может запутать разработчика.
Рассмотрим следующий пример:
int foo()
{
{
struct MyStuct
{
unsigned char data; // (1)
};
struct MyStuct sample = { .data = 250 }; // ok
}
// ....
{
struct MyStruct
{
signed char data; // (2)
};
struct MyStruct sample = { .data = 250 }; // error
}
}
При работе с типом 'unsigned char' допускается диапазон значений от 0 до 255, а с типом 'signed char' от -128 до 127. Поработав с первой структурой 'MyStruct', программист может привыкнуть, что член структуры 'data' имеет тип 'unsigned char'. После чего, во втором блоке легко совершить ошибку, записав 'sample.data' значение, которое приведет к переполнению.
Исправленный пример:
int foo()
{
{
struct MyStuctUnsigned
{
unsigned char data; // (1)
};
struct MyStuctUnsigned sample = { .data = 250 }; // ok
}
// ....
{
struct MyStructSigned
{
signed char data; // (2)
};
struct MyStructSigned sample = { .data = 127 }; // ok
}
}
В этом случае сложнее допустить ошибку, так как имена структур различаются.
Псевдоним типа, объявляемый через 'typedef', может дублировать имя при объявлении 'struct', 'union' или 'enum', если они ассоциированы с этим 'typedef':
typedef struct list
{
struct list* next;
int element;
} list; // ok
Данная диагностика классифицируется как:
|