メインコンテンツ

ISO/IEC TS 17961 [ptrcomp]

Accessing an object through a pointer to an incompatible type

説明

ルール定義

互換性のない型を指すポインターによるオブジェクトへのアクセス。1

Polyspace 実装

このチェッカーは、異なるオブジェクトを指すポインター間の変換をチェックします。

すべて展開する

問題

この問題は、あるオブジェクト型へのポインターと別のオブジェクト型へのポインターの間でキャストが実行される場合に発生します。

リスク

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

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

例外:オブジェクト型を指すポインターは、以下のいずれかの型を指すポインターに変換できます。

  • char

  • signed char

  • unsigned char

例 - 非準拠: 範囲のより広いオブジェクト型を指すポインターへのキャスト
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) の結果を見ると、その高位ビットがクリアされていないことがあります。

例 - 準拠: 型修飾子を追加するキャスト
const short *p;
const volatile short *q;
void foo (void){
  q = ( const volatile short * ) p;  /* Compliant */								
}

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

チェック情報

決定可能性:決定不可能

バージョン履歴

R2019a で導入

すべて展開する


1 Extracts from the standard "ISO/IEC TS 17961 Technical Specification - 2013-11-15" are reproduced with the agreement of AFNOR. Only the original and complete text of the standard, as published by AFNOR Editions - accessible via the website www.boutique.afnor.org - has normative value.