﻿# MISRA Essential Type Model

Essential type model — это модель типов, определённая в стандарте MISRA C\. Она необходима в стандарте для формализации правил и директив\. Определение собственной модели над стандартными типами преследует следующие цели:

* увеличение строгости проверки типов;
* снижение зависимости от реализации типов на конкретных платформах и компиляторах;
* внедрение базовой терминологии для описания правил явных и неявных преобразований\.

Согласно стандарту MISRA C, тип любого выражения соотносится с Essential Type в соответствии с таблицей:

|Категория сущностного типа|Соответствующие базовые типы|
|---|---|
|\*\*Boolean \*\*essential type|\`\_Bool\`|
|\*\*signed \*\*essential type|\`signed char\`<br>\`signed short\`<br>\`signed int\`<br>\`signed long\`<br>\`signed long long\`<br>\`enum \{ \.\.\.\. \};\`|
|\*\*unsigned \*\*essential type|\`unsigned char\`<br>\`unsigned short\`<br>\`unsigned int\`<br>\`unsigned long\`<br>\`unsigned long long\`|
|\*\*real floating \*\*essential type|\`float\`<br>\`double\`<br>\`long double\`|
|\*\*complex floating \*\*essential type|\`\_Complex float\`<br>\`\_Complex double\`<br>\`\_Complex long double\`|
|\*\*character \*\*essential type|\`char\`|
|\*\*named enum\*\* essential type|\`enum <name\> \{ \.\.\.\. \};\`|



Например, выражение с signed `char`, signed `int` или любым другим `signed` типом будет соответствовать signed essential type\.

Рассмотрим пример:

```cpp
enum FIRST {
  f1, f2, f3
};

enum SECOND {
  s1, s2, s3
};

int main()
{
  enum FIRST lhs = f1;
  enum SECOND rhs = s1;

  if (lhs == rhs)
    return 0;
  return 1;
}
```

Программа вернёт `0`\. Переменные типа `enum` будут приведены к `int` и при сравнении окажутся равны\. Однако в essential type model тип перечисления учитывает его имя, следовательно `lhs` и `rhs` имеют типы `enum<FIRST>` и `enum<SECOND>` соответственно\. Стандарт MISRA C запрещает сравнивать перечисления разных типов\. Такое правило позволяет избежать ошибок и неоднозначности\.