Данное диагностическое правило основано на руководстве 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
Данная диагностика классифицируется как:
|