﻿# V2621\. MISRA\. Tag names should be unique across all name spaces\.

Данное диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для С\. Имена структур, перечислений и объединений должны быть уникальны для всех пространств имён и блоков\. Повторное использование имён тегов может запутать разработчика\.

Рассмотрим следующий пример:

```cpp
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' значение, которое приведет к переполнению\.

Исправленный пример: 

```cpp
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':

```cpp
typedef struct list
{
  struct list* next;
  int element;
} list;               // ok
```