Main Content

MISRA C:2023 Rule 11.1

Conversions shall not be performed between a pointer to a function and any other type

Since R2024a

Description

Rule Definition

Conversions shall not be performed between a pointer to a function and any other type.

Rationale

The rule forbids the following two conversions:

  • Conversion from a function pointer to any other type. This conversion causes undefined behavior.

  • Conversion from a function pointer to another function pointer, if the function pointers have different argument and return types.

    The conversion is forbidden because calling a function through a pointer with incompatible type results in undefined behavior.

Polyspace Implementation

Polyspace® considers both explicit and implicit casts when checking this rule. However, casts from NULL or (void*)0 do not violate this rule.

Troubleshooting

If you expect a rule violation but do not see it, refer to Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

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 */}

In this example, the rule is violated when:

  • The pointer fp1 of type fp16 is cast to type fp32. The function pointer types fp16 and fp32 have different argument types.

  • An integer is cast to type fp16.

The rule is not violated when function pointers fp1 and fp2 are cast to NULL.

Check Information

Group: Pointer Type Conversions
Category: Required
AGC Category: Required

Version History

Introduced in R2024a