Правило 11.1 MISRA C:2012

Преобразования не должны выполняться между указателем на функцию и любым другим типом

Описание

Управляйте определением

Преобразования не должны выполняться между указателем на функцию и любым другим типом.

Объяснение

Правило запрещает следующие два преобразования:

  • Преобразование от указателя функции до любого другого типа. Это преобразование вызывает неопределенное поведение.

  • Преобразование от указателя функции до другого указателя функции, если указатели функции имеют различный аргумент и возвращают типы.

    Преобразование запрещается, потому что вызывание функции через указатель с несовместимым типом приводит к неопределенному поведению.

Реализация Polyspace

Polyspace® рассматривает и явные и неявные броски при проверке этого правила. Однако броски от NULL или (void*)0 не нарушают это правило.

Обменивайтесь сообщениями в отчете

Преобразования не должны выполняться между указателем на функцию и любым другим типом.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

typedef void (*fp16) (short n);
typedef void (*fp32) (int n);

#include <stdlib.h>                     /* To obtain macro  NULL */

void func(void) {   /* Exception 1 - Can convert a null pointer 
                     * constant into a pointer to a function */
  fp16 fp1 = NULL;                 /* Compliant - exception  */
  fp16 fp2 = (fp16) fp1;           /* Compliant */
  fp32 fp3 = (fp32) fp1;           /* Non-compliant */
  if (fp2 != NULL) {}              /* Compliant - exception  */
  fp16 fp4 = (fp16) 0x8000;        /* Non-compliant - integer to 
                                    * function pointer */}

В этом примере правило нарушено когда:

  • Указатель fp1 типа fp16 брошен, чтобы ввести fp32. Указатель функции вводит fp16, и fp32 имеют различные типы аргумента.

  • Целое число брошено, чтобы ввести fp16.

Правило не нарушено, когда указатели функции fp1 и fp2 брошены к NULL.

Проверяйте информацию

Группа: преобразования типа указателя
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2014b