# V2597. MISRA. Cast should not convert pointer to function to any other pointer type.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

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

Пример кода с нарушениями правила, в котором все четыре приведения типа являются недопустимыми:

    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;
    }

Вызов функции через такие указатели может потенциально привести к ошибкам сегментации.

Данная диагностика классифицируется как:

MISRA-CPP-2008-5.2.6