メインコンテンツ

MISRA C:2012 Rule 11.1

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

説明

ルール定義

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

根拠

ルールにより以下の 2 つの変換は禁止されています。

  • 関数ポインターから他の型への変換。この変換により未定義の動作が発生します。

  • 関数ポインターから別の関数ポインターへの変換 (それぞれの関数ポインターが異なる引数と戻り値の型をもつ場合)。

    互換性のない型のポインターを介した関数呼び出しは未定義の動作になるため変換は禁止されています。

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

この例では、次の場合にこのルールに違反します。

  • fp16 型のポインター fp1fp32 型にキャストされる。関数ポインターの fp16 型と fp32 の引数の型が異なる。

  • 整数が fp16 型にキャストされる。

関数ポインター fp1fp2NULL にキャストされる場合、ルールに違反しません。

チェック情報

グループ: Pointer Type Conversions
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2014b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.