﻿# V2589\. MISRA\. Casts between a pointer and a non\-integer arithmetic type should not be performed\.

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

Диагностическое правило актуально только для C\.

Преобразование выражений нецелочисленных типов к указателю и наоборот может привести к неопределённому поведению\.

Стандарт MISRA C определяет собственную модель типов — [Essential type model](https://pvs-studio.ru/ru/blog/terms/7007/)\.

Преобразование `essential Boolean`, `essential character` или `essential enum` типа к указателю может привести к формированию указателя с неверным выравниванием, что, в свою очередь, может привести к неопределённому поведению\.

Пример:

```cpp
enum Nums
{
  ONE, 
  TWO,
  ....
};

double* bar(Nums num)
{
  ....
  return (double*)num;
}
```

Преобразование указателя к вышеописанным сущностным типам может привести к тому, что результирующее значение не cможет быть представлено в выбранном сущностном типе, что также может привести к неопределённому поведению\.

Пример:

```cpp
void foo(void)
{
  ....
  char *a = "something";
  char b = a;
  ....
}
```

Преобразование `essential floating` типа к указателю или наоборот может привести к неопределённому поведению\.

Пример:

```cpp
void foo(short *p)
{
  // ....
  float f = (float) p;
  // ....
}
```