﻿# V2590\. MISRA\. Conversions should not be performed between pointer to function and any other type\.

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

Это правило актуально только для С\. Приведение типов между указателем на функцию и любым другим типом ведёт к неопределённому поведению\. Приведение типов между указателями на функцию несоответствующего типа также станет причиной неопределённого поведения при вызове этой функции\. 



Ниже представлен пример, в котором происходит приведение типов между указателями на функцию несоответствующего типа, и оба приведения являются недопустимыми:

```cpp
void foo(int32_t x);
typedef void (*fp)(int16_t x);

void bar(void)
{
  fp fp1 = (fp)&foo;
  int32_t(*fp2)(void) = (int32_t (*)(void))(fp1);
}
```

Рассмотрим ещё один пример некорректного кода, где указатель на функцию приводится другим типам:

```cpp
void* vp = (void*)fp1;
int32_t i32 = (int32_t)foo;
fp fp3 = (fp)i32;
```

Вызов функции через полученные таким образом указатели может потенциально привести к [ошибкам сегментации](https://pvs-studio.ru/ru/blog/terms/0063/)\.

**Исключения:**

Константа нулевого указателя может быть приведена к указателю на функцию:

```cpp
fp fp3 = NULL;
```

Указатель на функцию может быть приведен к типу 'void':

```cpp
(void) fp4;
```

Функция может быть неявно приведена к указателю на такую же функцию:

```cpp
(void(*)(int32_t)) foo;
```