メインコンテンツ

ポインターの信頼性の低いキャスト

暗黙的に別のデータ型にキャストされるポインター

説明

この欠陥は、ポインターが宣言の型とは異なるデータ型に暗黙的にキャストされた場合に発生します。このような暗黙的なキャストは、たとえば、データ型 char へのポインターに整数のアドレスが割り当てられる場合に行われます。

この欠陥は、プロジェクトのコード言語が C の場合にのみ当てはまります。

リスク

ポインターを宣言の型とは異なるデータ型にキャストすると、バッファー オーバーフローなどの問題が発生する可能性があります。このキャストが暗黙的な場合、コーディング エラーを示す可能性があります。

修正方法

ポインターを宣言の型と異なるデータ型に "暗黙的に" キャストすることは避けます。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

すべて展開する

 #include <string.h>
 
 void Copy_Integer_To_String()
 {
  int src[]={1,2,3,4,5,6,7,8,9,10};
  char buffer[]="Buffer_Text";
  strcpy(buffer,src);   
  /* Defect: Implicit cast of (int*) to (char*) */
 }

srcint* ポインターとして宣言されています。strcpy ステートメントは、buffer へのコピーに際して、暗黙的に srcchar* にキャストします。

修正 — ポインターをキャストしない

1 つの修正方法として、ポインター srcbuffer と同じデータ型で宣言することができます。

 #include <string.h>
  void Copy_Integer_To_String()
 {
  /* Fix: Declare src with same type as buffer */
  char *src[10]={"1","2","3","4","5","6","7","8","9","10"};  
  char *buffer[10];

  for(int i=0;i<10;i++)
    buffer[i]="Buffer_Text";

  for(int i=0;i<10;i++)
    buffer[i]= src[i];
  }

結果情報

グループ: 静的メモリ
言語: C
既定値: オン
コマンド ライン構文: PTR_CAST
影響度: Medium

バージョン履歴

R2013b で導入