Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для С. Приведение типов между указателем на функцию и любым другим типом ведёт к неопределённому поведению. Приведение типов между указателями на функцию несоответствующего типа также станет причиной неопределённого поведения при вызове этой функции.
Ниже представлен пример, в котором происходит приведение типов между указателями на функцию несоответствующего типа, и оба приведения являются недопустимыми:
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);
}
Рассмотрим ещё один пример некорректного кода, где указатель на функцию приводится другим типам:
void* vp = (void*)fp1;
int32_t i32 = (int32_t)foo;
fp fp3 = (fp)i32;
Вызов функции через полученные таким образом указатели может потенциально привести к ошибкам сегментации.
Исключения:
Константа нулевого указателя может быть приведена к указателю на функцию:
fp fp3 = NULL;
Указатель на функцию может быть приведен к типу 'void':
(void) fp4;
Функция может быть неявно приведена к указателю на такую же функцию:
(void(*)(int32_t)) foo;
Данная диагностика классифицируется как:
|