﻿# V2597\. MISRA\. Cast should not convert pointer to function to any other pointer 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() 
{ 
  fp fp1 = reinterpret_cast<fp>(&foo);
  fp fp2 = (fp)foo;
  void* vp = reinterpret_cast<void*>(fp1);
  char* chp = (char*)fp1;
}
```

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