>
>
>
V2590. MISRA. Conversions should not be…


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

Данное диагностическое правило основано на руководстве 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;

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

  • MISRA-C-11.1