(57)【要約】【課題】ソフトウェアの開発段階において、メモリにアクセスする際に、または、割り当てたメモリを解放する際に発生し得るメモリエラーを容易に検出する方法を提供する。【解決手段】メモリエラーの検出法は、(a)コンピュータプログラムに含まれた変数に対し割り当てたメモリ領域中に最初のメモリブロックを指示する変数を生成する段階と、(b)前記割り当てたメモリ領域にアクセスする前に、前記割り当てたメモリ領域のアクセス対象メモリブロックを指示する変数、および/または、前記最初のメモリブロックを指示する変数を用いる演算を遂行して、前記割り当てたメモリ領域にアクセスする際に発生し得るメモリエラーを検出する段階と、(c)前記検出したメモリエラーに関する情報を出力する段階と、を含む。【選択図】図１
2008276763.tif 000002
【特許請求の範囲】
【請求項１】
(a)コンピュータプログラムに含まれた変数に対し割り当てたメモリ領域中に最初のメモリブロックを指示する変数を生成する段階と、
(b)前記割り当てたメモリ領域にアクセスする前に、前記割り当てたメモリ領域のアクセス対象メモリブロックを指示する変数、および/または、前記最初のメモリブロックを指示する変数を用いる演算を遂行して、前記割り当てたメモリ領域にアクセスする際に発生し得るメモリエラーを検出する段階と、
(c)前記検出したメモリエラーに関する情報を出力する段階と、
を含むメモリエラーの検出法。
【請求項２】
前記(b)段階が、
(b1)前記アクセス対象メモリブロックを指示する変数の値がナル(NULL)値と一致するかどうかを調べる段階と、
(b2)前記アクセス対象メモリブロックを指示する変数の値がナル値と一致する場合、メモリエラーと判断する段階と、
を含む請求項１に記載のメモリエラーの検出法。
【請求項３】
前記(b)段階が、
(b1)前記最初のメモリブロックを指示する変数の値が初期化されたか否かを判断する段階と、
(b2)前記最初のメモリブロックを指示する変数の値が初期化されなかった場合、メモリエラーと判断する段階と、
を含む請求項１に記載のメモリエラーの検出法。
【請求項４】
前記(b)段階が、
(b1)前記最初のメモリブロックを指示する変数の値がナル値であるか否かを判断する段階と、
(b2)前記最初のメモリブロックを指示する変数の値がナル値である場合、メモリエラーと判断する段階と、
を含む請求項１に記載のメモリエラーの検出法。
【請求項５】
前記(b)段階が、
(b1)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域以外のメモリブロックを指示するか否かを判断する段階と、
(b2)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域以外のメモリブロックを指示する場合、メモリエラーと判断する段階と、
を含む請求項１に記載のメモリエラーの検出法。
【請求項６】
前記(b)段階の前に、(d)前記割り当てたメモリ領域の各々のメモリブロックに対して識別符号を割り当てる段階をさらに含み、前記(b1)段階において、前記識別符号を用い、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域以外のメモリブロックを指示するか否かを判断する請求項５に記載のメモリエラーの検出法。
【請求項７】
１つの前記割り当てたメモリ領域に含まれた前記各々のメモリブロックに対応する前記識別符号が、コンピュータメモリの識別符号マップ領域に連続して記憶され、１つの識別符号グループを形成し、
前記(d)段階において、前記１つの識別符号グループに属する前記識別符号は互いに一致し、前記識別符号マップ領域において隣接する前記識別符号グループにそれぞれ属する間の識別符号は互いに異なるように前記識別符号を割り当て、
前記(b1)段階が、
(b1-1)前記アクセス対象メモリブロックを指示する変数が指示するメモリブロックに対応する識別符号と、前記最初のメモリブロックを指示する変数が指示するメモリブロックに対応する識別符号が一致するか否かを判断する段階と、
(b1-2)前記(b1-1)段階における判断に基づいて、前記識別符号が互いに一致しない場合、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域以外のメモリブロックを指示するものと判断する段階と、を含む請求項６に記載のメモリエラーの検出法。
【請求項８】
前記識別符号グループの識別符号が、第1ないし第3ビット値のうち１つであり、前記識別符号マップ領域における、前記識別符号グループが形成されていない部分に第4ビット値を記憶させる請求項７に記載のメモリエラーの検出法。
【請求項９】
請求項１から８のいずれか１項に記載のメモリエラーの検出法をコンピュータにおいて実行させるためのプログラムを記録したコンピュータ読取り可能な記録媒体。
【請求項１０】
(a)コンピュータプログラムに含まれた変数に対し割り当てたメモリ領域における最初のメモリブロックを指示する変数を生成する段階と、
(b)前記メモリ領域の割り当てを解放する前に、前記メモリ領域のアクセス対象メモリブロックを指示する変数、および/または、前記最初のメモリブロックを指示する変数を用いる演算を遂行して、前記メモリ領域の割り当てを解放する際に発生し得るメモリエラーを検出する段階と、
(c) 前記検出したメモリエラーに関する情報を出力する段階と、
を含むメモリエラーの検出法。
【請求項１１】
前記(b)段階が、
(b1)前記アクセス対象メモリブロックを指示する変数の値がナル(NULL)値と一致するかどうかを調べる段階と、
(b2)前記アクセス対象メモリブロックを指示する変数の値がナル値と一致する場合、メモリエラーと判断する段階と、
を含む請求項１０に記載のメモリエラーの検出法。
【請求項１２】
前記(b)段階が、
(b1)前記最初のメモリブロックを指示する変数の値が初期化されたか否かを判断する段階と、
(b2)前記最初のメモリブロックを指示する変数の値が初期化されなかった場合、メモリエラーと判断する段階と、
を含む請求項１０に記載のメモリエラーの検出法。
【請求項１３】
前記(b)段階が、
(b1)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域が属するヒープメモリ領域以外のメモリブロックを指示するか否かを判断する段階と、
(b2)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域が属するヒープメモリ領域以外のメモリブロックを指示する場合、メモリエラーと判断する段階と、
を含む請求項１０に記載のメモリエラーの検出法。
【請求項１４】
前記(b)段階が、
(b1)前記最初のメモリブロックを指示する変数の値がナル値であるか否かを判断する段階と、
(b2)前記最初のメモリブロックを指示する変数の値がナル値である場合、メモリエラーと判断する段階と、
を含む請求項１０に記載のメモリエラーの検出法。
【請求項１５】
前記(b)段階が、
(b1)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域内で前記最初のメモリブロックを指示するか否かを判断する段階と、
(b2)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域内で前記最初のメモリブロックを指示しない場合、メモリエラーと判断する段階と、
を含む請求項１０に記載のメモリエラーの検出法。
【請求項１６】
前記(b)段階の前に、(d)前記割り当てたメモリ領域の各々のメモリブロックに対して識別符号を割り当てる段階をさらに含み、前記(b1)段階において、前記識別符号を用い、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域内で前記最初のメモリブロックを指示するか否かを判断する請求項１５に記載のメモリエラーの検出法。
【請求項１７】
１つの前記割り当てたメモリ領域に含まれた前記各々のメモリブロックに対応する前記識別符号が、コンピュータメモリの識別符号マップ領域に連続して記憶され、１つの識別符号グループを形成し、
前記(d)段階において、前記１つの識別符号グループに属する前記識別符号は互いに一致し、前記識別符号マップ領域において隣接する前記識別符号グループにそれぞれ属する識別符号は互いに異なるように前記識別符号を割り当て、
前記(b1)段階が、
(b1-1)前記アクセス対象メモリブロックを指示する変数が指示するメモリブロックに対応する識別符号と、前記識別符号マップ領域における直ぐ前の識別符号とが一致するか否かを判断する段階と、
(b1-2)前記(b1-1)段階における判断に基づいて、前記識別符号が互いに一致する場合、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域における最初のメモリブロックを指示しないと判断する段階と、を含む請求項１６に記載のメモリエラーの検出法。
【請求項１８】
前記識別符号グループの識別符号が、2ビットで表される第1ないし第3ビット値のうち１つであり、前記識別符号マップ領域における、前記識別符号グループが形成されていない部分に、2ビットで表される第4ビット値を記憶させる請求項１７に記載のメモリエラーの検出法。
【請求項１９】
請求項１０から１８のいずれか１項に記載のメモリエラーの検出法をコンピュータに実行させるためのプログラムを記録したコンピュータ読取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリエラーの検出法に関し、具体的には、ソフトウェアの開発段階において、メモリにアクセス(access)する際に、または、割り当てたメモリを解放する際に発生し得るメモリエラーを容易に検出する方法に関する。
【背景技術】
【０００２】
ソフトウェアプログラミングのプロセスにおける頻繁に発生するエラーの一つがメモリ使用上のエラーである。ソフトウェアが動作するためには通常、多くの変数がメモリに割り当てられ、使用される。プログラムにおいてメモリを不正にアクセスしたり解放したりする場合、プログラム実行段階において致命的なエラーが発生し得る。したがって、プログラム開発者は、プログラミングの段階において不正なメモリエラーが発生しないようにしなければならず、デバッギング(debugging)またはテスティング(testing)を経て、メモリエラーが発生しないようにプログラムコードを修正する。
【０００３】
しかし、ソフトウェア開発時において、前記プログラミングにおけるメモリ使用上のエラーを除去するために、現在に至るまで、プログラマーが注意深くコーディングし、コーディング後もプログラムソースコードを直接検討している。そして、プログラムをさまざまな遂行環境下で実行させ、エラーが発生するたびにデバッギングを行う方法が用いられてきた。このような方法では、メモリ使用上のエラーを検出するために相当の費用と時間がかかり、メモリが不正に使用されても、実行したときにエラーが生じなければ、メモリエラーを検出することは難しい。そのため、事後的にプログラムを使用する段階において致命的なエラーが発生し、膨大な費用がかかるといった問題があった。
【発明の開示】
【発明が解決しようとする課題】
【０００４】
本発明は、上記問題点を解決するために、プログラムソースコードにおいてメモリを使用するたびに、メモリエラーを起こす可能性があるか否かを確認するメモリエラーの検出法を提供する。
【課題を解決するための手段】
【０００５】
本発明に係るメモリエラーの検出法は、(a)コンピュータプログラムに含まれた変数に対し割り当てたメモリ領域中に最初のメモリブロックを指示する変数を生成する段階と、(b)前記割り当てたメモリ領域にアクセスする前に、前記割り当てたメモリ領域のアクセス対象メモリブロックを指示する変数、および/または、前記最初のメモリブロックを指示する変数を用いる演算を遂行して、前記割り当てたメモリ領域にアクセスする際に発生し得るメモリエラーを検出する段階と、(c)前記検出したメモリエラーに関する情報を出力する段階と、を含む。
【０００６】
ここで、前記(b)段階は、(b1)前記アクセス対象メモリブロックを指示する変数の値がナル(NULL)値と一致するかどうかを調べる段階と、(b2)前記アクセス対象メモリブロックを指示する変数の値がナル値と一致する場合、メモリエラーと判断する段階と、を含んでも良い。
【０００７】
また、前記(b)段階は、(b1)前記最初のメモリブロックを指示する変数の値が初期化されたか否かを判断する段階と、(b2)前記最初のメモリブロックを指示する変数の値が初期化されなかった場合、メモリエラーと判断する段階と、を含んでも良い。
【０００８】
さらに、前記(b)段階は、(b1)前記最初のメモリブロックを指示する変数の値がナル値であるか否かを判断する段階と、(b2)前記最初のメモリブロックを指示する変数の値がナル値である場合、メモリエラーと判断する段階と、を含んでも良い。
【０００９】
さらに、前記(b)段階は、(b1)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域以外のメモリブロックを指示するか否かを判断する段階と、(b2)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域以外のメモリブロックを指示する場合、メモリエラーと判断する段階と、を含んでも良い。
【００１０】
本発明に係るメモリエラーの検出法は、さらに、前記(b)段階の前に、(d)前記割り当てたメモリ領域の各々のメモリブロックに対して識別符号を割り当てる段階を含み、前記(b1)段階において、前記識別符号を用い、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域以外のメモリブロックを指示するか否かを判断しても良い。
【００１１】
ここで、１つの前記割り当てたメモリ領域に含まれた前記各々のメモリブロックに対応する前記識別符号は、コンピュータメモリの識別符号マップ領域に連続して記憶され、１つの識別符号グループを形成し、前記(d)段階において、前記１つの識別符号グループに属する前記識別符号は互いに一致し、前記識別符号マップ領域において隣接する前記識別符号グループにそれぞれ属する識別符号は互いに異なるように前記識別符号を割り当て、前記(b1)段階が、(b1-1)前記アクセス対象メモリブロックを指示する変数が指示するメモリブロックに対応する識別符号と、前記最初のメモリブロックを指示する変数が指示するメモリブロックに対応する識別符号が一致するか否かを判断する段階と、(b1-2)前記(b1-1)段階における判断に基づいて、前記識別符号が互いに一致しない場合、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域以外のメモリブロックを指示するものと判断する段階と、を含んでも良い。
【００１２】
ここで、前記識別符号グループの識別符号は、第1ないし第3ビット値のうち１つであり、前記識別符号マップ領域における、前記識別符号グループが形成されていない部分に第4ビット値を記憶させても良い。
【００１３】
また、本発明によれば、前記メモリエラーの検出法をコンピュータにおいて実行させるためのプログラムを記録したコンピュータ読取り可能な記録媒体が提供される。
【００１４】
本発明に係るメモリエラーの検出法は、(a)コンピュータプログラムに含まれた変数に対し割り当てたメモリ領域における最初のメモリブロックを指示する変数を生成する段階と、(b)前記メモリ領域の割り当てを解放する前に、前記メモリ領域のアクセス対象メモリブロックを指示する変数、および/または、前記最初のメモリブロックを指示する変数を用いる演算を遂行して、前記メモリ領域の割り当てを解放する際に発生し得るメモリエラーを検出する段階と、(c) 前記検出したメモリエラーに関する情報を出力する段階と、を含む。
【００１５】
ここで、前記(b)段階は、(b1)前記アクセス対象メモリブロックを指示する変数の値がナル(NULL)値と一致するかどうかを調べる段階と、(b2)前記アクセス対象メモリブロックを指示する変数の値がナル値と一致する場合、メモリエラーと判断する段階と、を含んでも良い。
【００１６】
また、前記(b)段階は、(b1)前記最初のメモリブロックを指示する変数の値が初期化されたか否かを判断する段階と、(b2)前記最初のメモリブロックを指示する変数の値が初期化されなかった場合、メモリエラーと判断する段階と、を含んでも良い。
【００１７】
さらに、前記(b)段階は、(b1)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域が属するヒープメモリ領域以外のメモリブロックを指示するか否かを判断する段階と、(b2)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域が属するヒープメモリ領域以外のメモリブロックを指示する場合、メモリエラーと判断する段階と、を含んでも良い。
【００１８】
さらに、前記(b)段階は、(b1)前記最初のメモリブロックを指示する変数の値がナル値であるか否かを判断する段階と、(b2)前記最初のメモリブロックを指示する変数の値がナル値である場合、メモリエラーと判断する段階と、を含んでも良い。
【００１９】
さらに、前記(b)段階は、(b1)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域内で前記最初のメモリブロックを指示するか否かを判断する段階と、(b2)前記アクセス対象メモリブロックを指示する変数が、前記割り当てたメモリ領域内で前記最初のメモリブロックを指示しない場合、メモリエラーと判断する段階と、を含んでも良い。
【００２０】
本発明に係るメモリエラーの検出法は、さらに、前記(b)段階の前に、(d)前記割り当てたメモリ領域の各々のメモリブロックに対して識別符号を割り当てる段階を含み、前記(b1)段階において、前記識別符号を用い、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域内で前記最初のメモリブロックを指示するか否かを判断しても良い。
【００２１】
ここで、１つの前記割り当てたメモリ領域に含まれた前記各々のメモリブロックに対応する前記識別符号が、コンピュータメモリの識別符号マップ領域に連続して記憶され、１つの識別符号グループを形成し、前記(d)段階において、前記１つの識別符号グループに属する前記識別符号は互いに一致し、前記識別符号マップ領域において隣接する前記識別符号グループにそれぞれ属する識別符号は互いに異なるように前記識別符号を割り当て、前記(b1)段階が、(b1-1)前記アクセス対象メモリブロックを指示する変数が指示するメモリブロックに対応する識別符号と、前記識別符号マップ領域における直ぐ前の識別符号とが一致するか否かを判断する段階と、(b1-2)前記(b1-1)段階における判断に基づいて、前記識別符号が互いに一致する場合、前記アクセス対象メモリブロックを指示する変数が前記割り当てたメモリ領域における最初のメモリブロックを指示しないと判断する段階と、を含んでも良い。
【００２２】
ここで、前記識別符号グループの識別符号は、2ビットで表される第1ないし第3ビット値のうち１つであり、前記識別符号マップ領域における、前記識別符号グループが形成されていない部分に、2ビットで表される第4ビット値を記憶させても良い。
【００２３】
本発明によれば、前記メモリエラーの検出法をコンピュータにおいて実行させるためのプログラムを記録したコンピュータ読取り可能な記録媒体が提供される。
【発明の効果】
【００２４】
本発明によって、コンピュータプログラムのプログラミングプロセスやコンピュータプログラムの実行プロセスなど、メモリをアクセスしたり解放したりする場合に発生し得るようなメモリエラーを自動的かつ確実に検出することができる。
【発明を実施するための最良の形態】
【００２５】
以下、図面を参照しながら、本発明に関して当業者が容易に実施できるように詳細に説明する。
【００２６】
まず、本発明を適用し得るメモリエラーの種類について説明する。メモリにアクセスする際に発生し得るメモリエラーには、ナルポインタアクセスエラー(Null pointer access error)、無効ポインタアクセスエラー(invalid pointer access error)、領域外アクセスエラー(out of bound access error)などがある。
【００２７】
ナルポインタアクセスエラーとは、メモリをアクセスするためのポインタ変数の値がナル(NULL)値であるにもかかわらず、そのポインタ変数を用いてメモリにアクセスする命令を実行する場合に発生するエラーである。無効ポインタアクセスエラーとは、まだ割り当てられていないメモリをアクセスする場合に発生するメモリエラー、および、アクセスしようとするメモリが、すでにその割り当てが解放されたメモリである場合に発生するメモリエラーを含む。領域外アクセスエラーとは、特定変数についての演算のためにメモリにアクセスする際に、該変数に割り当てられたメモリ領域を超えたメモリにアクセスする場合に発生するメモリエラーを意味する。
【００２８】
また、メモリを解放する際に発生し得るメモリエラーは、大きく不正な解放エラー(illegal free error)と、重複解放エラー(duplicate free error)に分けられる。
【００２９】
不正な解放エラーには、割り当てを解放しようとするメモリを指示するポインタ変数の値がナル値である場合に発生するメモリエラー、割り当てられていないメモリを解放する場合に発生するメモリエラー、割り当てを解放しようとするメモリがヒープメモリ領域外のメモリである場合に発生するメモリエラー、割り当てを解放しようとするメモリを指示するポインタ変数が該メモリの最初のメモリブロックを指示しない場合に発生するメモリエラーなどが含まれる。
【００３０】
重複解放エラーは、すでに解放されたメモリを再び解放しようとする場合に発生するエラーである。
【００３１】
以下では、添付した図面を参照しながら、本発明に係るメモリエラーの検出法について説明する。
【００３２】
図１をみると、プログラムに含まれた変数に対してメモリを割り当てた場合、その割り当てたメモリ領域における最初のメモリブロックを指示する変数（ファーストブロック指示変数とも呼ぶ）を生成する(S102)。すなわち、プログラムソースコードにおいてメモリを割り当てるたびに最初のメモリブロックを指示する変数を定義し、初期化する。このようなプロセスは、プログラムコーディング時に開発者によって手動で入力されても良く、プログラムコーディングが完了した後に自動的に遂行されても良い。
【００３３】
次に、該変数に関して割り当てた該メモリ領域にアクセスするたびに、その割り当てたメモリ領域のアクセス対象メモリブロックを指示する変数（ターゲットブロック指示変数とも呼ぶ）、および/または、最初のメモリブロックを指示する変数を利用した所定の演算を遂行することで、割り当てたメモリ領域へアクセスする際に発生し得るメモリエラーを検出する(S104)。すなわち、プログラムソースコードにおいてメモリアクセスの発生が予想される箇所毎に、メモリアクセス発生前にこの演算を遂行するようにAPI関数を呼び出すソースコードを追加する。このようなソースコードの追加は、プログラムコーディング時に開発者によって手動で入力されても良く、プログラムコーディングが完了した後に自動的に遂行されても良い。
【００３４】
検出の結果、メモリエラーが予想される場合には検出されたメモリエラーに関する情報を出力する(S106)。
【００３５】
前述したように、手動または不正なプログラムソースコードを修正し、その修正されたプログラムを実行し、メモリエラー関連の情報を出力し、メモリエラーが発生しないようにプログラムを修正しなければならない。プログラムの開発が完了した後には、プログラムソースコードに追加した内容は削除するのが望ましく、このような削除は、開発者によって手動で遂行されても良く、自動的に遂行されても良い。
【００３６】
たとえば、プログラムにおいてmalloc()を呼び出す場合、使用者によって望まれた大きさのメモリを割り当て、メモリアドレスを返却することになるが、malloc()を呼び出してメモリを割り当てたとき、その割り当てられたメモリ領域のメモリアドレスを返却する変数が、アクセス対象メモリブロックを指示する変数であり、その割り当てられたメモリ領域における最初のメモリブロックを指示する変数が最初のメモリブロックを指示する変数、即ち、ファーストブロック指示変数である。malloc()関数以外にも、メモリを割り当てたりアクセスしたりする任意の関数に対しても本発明を適用することができる。さらに、本発明は特定のプログラミング言語においてのみ適用されるのではなく、メモリまたはこれに等しい記憶手段を含む任意のシステムにおいて、そのような記憶手段をアクセス、または、解放する任意の場合にも適用できることは、当業者にとって自明である。以下、メモリエラーを検出する方法を、メモリエラーの種類毎に詳細に説明していく。
【００３７】
割り当てられたメモリ領域にアクセスする際に、ナルポインタアクセスエラー(Null pointer access error)を検出するために、アクセス対象メモリブロックを指示する変数の値がナル(NULL)値と一致するかどうかを調べて、その結果、アクセス対象メモリブロックを指示する変数の値がナル値と一致する場合、メモリエラーと判断する(S201)。
【００３８】
また、割り当てられたメモリ領域にアクセスする際に、まだ割り当てられていないメモリにアクセスする場合に発生するメモリエラーを検出するために、最初のメモリブロックを指示する変数の値が初期化されたか否かを判断し、最初のメモリブロックを指示する変数の値が初期化されなかった場合、無効ポインタアクセスエラーと判断する(S202)。
【００３９】
さらに、アクセスしようとするメモリが、すでにその割り当てが解放されたメモリである場合に発生するメモリエラーを検出するために、最初のメモリブロックを指示する変数の値がナル値であるか否かを判断し、最初のメモリブロックを指示する変数の値がナル値である場合、無効メモリアクセスエラーと判断する(S203)。
【００４０】
その他に、領域外アクセスエラーを検出する(S204)。領域外アクセスエラーを検出する方法については、図２を参照して詳細に説明する。
【００４１】
前述の通り、領域外アクセスエラーは、特定変数を演算するためにメモリ(110)にアクセスする際に、該変数に割り当てられたメモリ領域を超えてメモリにアクセスする場合に発生するメモリエラーを意味する。したがって、領域外アクセスエラーを検出するために、アクセス対象メモリブロックを指示する変数が割り当てられたメモリ領域外のメモリブロックを指示するか否かを判断する。本発明に係るエラー検出法では、領域外アクセスエラーを検出するために、ビットマップ方式（bit Map Coloring）を用いる。以下、前記方式について説明する。
【００４２】
たとえば、コンピュータプログラムに含まれた変数毎にメモリ領域(112,114,116)をそれぞれ割り当てた場合、その割り当てたメモリ領域のメモリブロック毎に識別符号を割り当てる。たとえば、割り当てたメモリ領域(116)のメモリブロック(116a,116b)に識別符号を割り当てる。この際に、同じメモリ領域に属するメモリブロックには、同じ識別符号を割り当てる。
【００４３】
１つの割り当てたメモリ領域(112,114,116)に含まれたメモリブロック(たとえば、116a,116b)にそれぞれ対応する識別符号は、コンピュータメモリの識別符号マップ領域(120)に連続して記憶され、ひとつの識別符号グループ(122,124,126)を形成する。たとえば、プログラムにおいて変数a,b,cに順次にメモリを割り当てた場合、変数aに対して割り当てたメモリ領域(112)の5つのメモリブロックに対応する識別符号"11"が識別符号マップ領域(120)に連続して記憶され、識別符号グループ(122)を形成し、変数bに対して割り当てたメモリ領域(114)の4つのメモリブロックに対応する識別符号"10"が識別符号マップ領域(120)に連続して記憶され、識別符号グループ(124)を形成する。識別符号マップ領域(120)は、識別符号グループが形成される前には"00"値として、すべて初期化されている。
【００４４】
"11"、"10"、"01"の順序は、任意に割り当てることが可能であり、ひとつの識別符号グループ内の識別符号は互いに一致し、識別符号マップ領域における隣接する識別符号グループの識別符号とは互いに異なるように識別符号を割り当てる。隣接する識別符号グループの識別符号と互いに異なる識別符号を割り当てるためには３つの識別符号が必要となる。また、識別符号マップ領域の初期化状態をあらわす識別符号が必要となる。この実施例においては、２ビットのビット値を識別符号として用い、このような4つの識別符号を表現したが、これはあくまでも例示的なものであり、ビット値はそれに限定されるものではなく、さらには識別符号は互いに異なる４つの識別符号であれば十分である。各々の識別符号にカラー値を割り当て、メモリの割り当てと利用状態を使用者にディスプレイすることもできる。また、識別符号マップ領域(120)は、識別符号を必ずしも物理的に連続して記憶する必要はなく、論理的に連続的な任意のデータ記憶構造を有していても良い。
【００４５】
このようなビットマップ方式を用いて領域外アクセスエラーを検出する方法は、アクセス対象メモリブロックを指示する変数が指示するメモリブロックに対応する識別符号と、最初のメモリブロックを指示する変数が指示するメモリブロックに対応する識別符号とが一致するか否かを判断する方法を利用する。識別符号が互いに一致しない場合、該変数に対する、アクセス対象メモリブロックを指示する変数（即ち、ターゲットブロック指示変数）が割り当てたメモリ領域外のメモリブロックを指示するものであるため、領域外アクセスエラーであると検出することができる。
【００４６】
前述した複数のメモリエラーの検出法のうち１つ以上の方法を順序に関わらず遂行して、メモリエラーを検出することができる。
【００４７】
次に、図３を参照して、メモリを解放する場合に発生可能なメモリエラーを検出する方法について説明する。この方法は、コンピュータプログラムに含まれた変数に対して割り当てたメモリ領域内に、最初のメモリブロックを指示する変数を生成する段階(S302)、前記メモリ領域の割り当てを解放する前に割り当てたメモリ領域のアクセス対象メモリブロックを指示する変数、および/または、最初のメモリブロックを指示する変数を用いて所定の演算を遂行して、前記メモリ領域の割り当てを解放する際に発生し得るメモリエラーを検出する段階(S304)、検出されたメモリエラーに関する情報を出力する段階(S306)を含む。
【００４８】
まず、ナル値をもつポインタ変数を用いてメモリを解放する場合を検出するために、アクセス対象メモリブロックを指示する変数の値がナル(NULL)値と一致するかどうかを調べ、ナル値と一致する場合には不正な解放エラーと判断する(S401)。
【００４９】
次に、割り当てられていないメモリを解放する場合を検出するために、最初のメモリブロックを指示する変数の値が初期化されたか否かを判断し、初期化されなかった場合には不正な解放エラーと判断する(S402)。この方法が有効となるためには、メモリを割り当てるたびに、最初のメモリブロックを指示する変数を生成し、その値を初期化することが必要となる。したがって、最初のメモリブロックを指示する変数が初期化されていない場合であるならば、メモリが割り当てられなかったと判断することができる。
【００５０】
次に、割り当てを解放しようとするメモリがヒープメモリ領域外のメモリである場合、致命的なメモリエラーが起こり得るため、アクセス対象メモリブロックを指示する変数が、割り当てたメモリ領域が属するヒープメモリ以外のメモリブロックを指示するか否かを判断し、ヒープメモリ領域外のメモリブロックを指示する場合には不正な解放エラーと判断する(S403)。
【００５１】
次に、割り当てを解放しようとするメモリを指示するポインタ変数が適切な値をもっているか否かを判断することで、メモリエラーかどうかを検出する。たとえば、free()関数を呼び出してメモリを解放する場合、入力ポインタ変数はその割り当てを解放しようとするメモリ領域の最初のメモリブロック（ファーストブロック）を指示していなければならない。これに関連するメモリエラーを検出するために、すでに説明したビットマップ方式を用いる。これについては図２に戻って説明する必要がある。変数bに対して割り当てたメモリ領域(114)を解放するために、アクセス対象メモリブロックを指示する変数が指示するメモリブロックに対応する識別符号(T_ADDRの識別符号; 識別符号グループ(124)の最初の識別符号 "10")がすぐ前の識別符号(T_ADDR-1の識別符号)と一致するか否かを判断し、識別符号が互いに一致する場合には、アクセス対象メモリブロックを指示する変数が割り当てたメモリ領域内で最初のメモリブロックを指示しないものであるため、不正な解放エラーであると検出することができる(S404)。
【００５２】
次に、割り当てたメモリ領域を重複して解放するケースを検出するために、最初のメモリブロックを指示する変数の値がナルであるか否かを判断し、最初のメモリブロックを指示する変数の値がナル値である場合、重複解放エラーであると検出する。この方法が有効となるためには、割り当てたメモリ領域を正しく解放する場合、その最初のメモリブロックを指示する変数にナル値を割り当てることが必要である(S405)。前述した複数のメモリエラーのエラー検出法のうち１つ以上の方法を順序にかかわらず遂行して、メモリエラーを検出することができる。
【００５３】
以上、本発明に係るメモリエラーの検出法について説明したが、ここに記載された幾つかのメモリエラーはあくまで例示的なものであり、メモリを割り当てるときに、最初のメモリブロックを指示する変数を生成し、その変数に関する演算を行うことで、発生可能なメモリエラーを検出したり、または、前述したビットマップ方式を用いてメモリエラーを検出するという本発明の思想を利用して、さまざまなメモリエラーを検出することができることは当業者にとって自明である。
【図面の簡単な説明】
【００５４】
【図１】本発明に係るメモリにアクセスする際にメモリエラーを検出する方法を表した順序図である。
【図２】本発明に係るメモリエラーの検出法を説明するために、メモリの領域を模式的に表したものである。
【図３】本発明に係るメモリを解放する際にメモリエラーを検出する方法を表した順序図である。
【図１】
2008276763.tif 000003
【図２】
2008276763.tif 000004
【図３】
2008276763.tif 000005