Unicorn with delicious cookie
Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
>
>
>
V2590. MISRA. Conversions should not...
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

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

02 Июл 2021

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