Данное диагностическое правило основано на руководстве 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; }
Вызов функции через такие указатели может потенциально привести к ошибкам сегментации.
Данная диагностика классифицируется как:
|