MISRA C:2012 Rule 11.1

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

Описание

Определение правила

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

Объяснение

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

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

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

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

Реализация 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: Требуется
Введенный в R2014b