メインコンテンツ

MISRA C:2023 Rule 11.3

A conversion shall not be performed between a pointer to object type and a pointer to a different object type

R2024a 以降

説明

ルール定義

A conversion shall not be performed between a pointer to object type and a pointer to a different object type 1 .

根拠

オブジェクトを指すポインターが別のオブジェクトを指すポインターに変換される場合、結果のポインターは正しく配置されない可能性があります。不適切なアライメントは未定義の動作を発生させます。

変換によって正しく配置されたポインターが生成されたとしても、そのポインターがオブジェクトへのアクセスに使用される場合、動作が未定義となることがあります。

例外として、MISRA C:2023 規約では、修飾子がないオブジェクト型へのポインターを次のいずれかの型へのポインターに変換することを許可しています。

  • char

  • signed char

  • unsigned char

Polyspace 実装

オブジェクトが、そのオブジェクトの型とは異なる型を使用してアクセスされる場合、Polyspace® は違反を報告します。ポインターの型と、ポイントされているオブジェクトの型の型修飾子 (const など) が異なる場合は、違反が報告されます。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

signed   char *p1;
unsigned int *p2;

void foo(void){ 
  p2 = ( unsigned int * ) p1;     /* Non-compliant */				
}

この例では、p1signed char オブジェクトを指します。しかしながら、p1 は範囲のより広いオブジェクト型 unsigned int を指すポインターにキャストされています。

extern unsigned int read_value ( void );
extern void display ( unsigned int n );

void foo ( void ){
  unsigned int u = read_value ( );
  unsigned short *hi_p = ( unsigned short * ) &u;    /* Non-compliant  */	
  *hi_p = 0;                                         
  display ( u );                                     
}

この例では、uunsigned int 変数です。&u は、範囲のより狭いオブジェクト型 unsigned short を指すポインターにキャストされています。

ビッグエンディアン マシンでは、ステートメント *hi_p = 0&u が指すメモリ位置の高位ビットをクリアしようと試みます。しかし、display(u) の結果を見ると、その高位ビットがクリアされていないことがあります。

typedef struct {
	int iNum1;
}A;

typedef struct {
	int iNum2;
}B;

void bar(A*);

void foo() {
	B wrappedNum2;
	bar(&wrappedNum2); /* Noncompliant*/

}

この例では、Bstruct 型のオブジェクト wrappedNum2 は、bar の呼び出しで暗黙的に Astruct 型のオブジェクトにキャストされます。Polyspace はこの暗黙的なキャストにフラグを設定します。

const short *p;
const volatile short *q;
void foo (void){
  q = ( const volatile short * ) p;  /* Compliant */								
}

この例では、pq のいずれも short オブジェクトを指します。この両者間のキャストは volatile 修飾子のみを追加し、したがって準拠性をもちます。

チェック情報

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

バージョン履歴

R2024a で導入

すべて展開する


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.