exponenta event banner

MISRA C:2012 Правило 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.

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

Группа: Преобразования типов указателей
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b