メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ポインターの無効な解放

対応する動的割り当てのないポインターの割り当て解除

説明

この欠陥は、関数 free を使用して解放されたメモリのブロックが、過去に malloccalloc または realloc を使用して割り当てられていなかった場合に発生します。

リスク

関数 free はヒープに割り当てられたメモリのブロックを解放します。以前に割り当てていないヒープ上の位置にアクセスしようとすると、セグメンテーション違反が発生する可能性があります。

この問題により、コーディング エラーが強調表示される場合があります。たとえば、関数 free または前の関数 malloc を別のポインターに対して使用する必要があった可能性があります。

修正方法

ほとんどの場合、free ステートメントを削除することによって問題を修正できます。malloc または calloc を使用してポインターにヒープのメモリが割り当てられていない場合、このポインターを解放する必要はありません。単に必要に応じてポインターを再利用できます。

この問題によって、間違ったポインターに対して free または malloc を使用するなどのコーディング エラーが明らかになった場合は、そのエラーを修正します。

new 演算子で割り当てられたメモリを解放するために関数 free を使用したことが原因で問題が発生している場合は、関数 freedelete 演算子に置き換えます。

すべて展開する

#include <stdlib.h>

void Assign_Ones(void) 
{
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1; 
 
  free(p);   
  /* Defect: p does not point to dynamically allocated memory */
}

ポインター p は、関数 free を使用して割り当て解除されています。しかし、p は動的に割り当てられていないメモリの場所を指しています。

修正 — ポインターの割り当て解除を削除

配列 p の要素数がコンパイル時にわかっている場合、1 つの修正方法として、ポインター p の割り当て解除を削除することができます。

#include <stdlib.h>

void Assign_Ones(void)
 {
  int p[10];
  for(int i=0;i<10;i++)
     *(p+i)=1;   
  /* Fix: Remove deallocation of p */
 }
修正 — ポインターを割り当てる

配列 p の要素数がコンパイル時にわかっていない場合、1 つの修正方法として、配列 p に動的にメモリを割り当てることができます。

#include <stdlib.h>

void Assign_Ones(int num) 
{
  int *p;
  /* Fix: Allocate memory dynamically to p */
  p=(int*) calloc(10,sizeof(int)); 
  for(int i=0;i<10;i++)
     *(p+i)=1; 
  free(p); 
}

結果情報

グループ: 動的メモリ
言語: C | C++
既定値: オン
コマンド ライン構文: BAD_FREE
影響度: High

バージョン履歴

R2013b で導入