(57)【要約】【課題】オフセット加算以外の複雑な手順でアクセス先のアドレスを計算するプログラムに対しても境界検査を実施する。【解決手段】記憶領域管理部１３０は、各記憶領域に識別番号を付与し管理する。従実行部１４０は、主実行部１２０における記憶領域の配置アドレスを当該記憶領域の識別番号とアドレス値とを足し合わせた仮想アドレス値に変更して、被検査プログラムを実行した状態を再現する。メモリアクセス命令に対して、メモリアクセス検査部１５０は、従実行部１４０のメモリアクセス先である仮想アドレス値から主実行部１２０のアドレス値を減算し、得られた値に等しい識別番号が付与された記憶領域の範囲内に、主実行部１２０のアクセス先のアドレスが含まれるか否かを判定することで不正メモリアクセスの検出を行う。【選択図】図１
2010287061.tif 000002
【特許請求の範囲】
【請求項１】
被検査プログラムによる不正なメモリアクセスを検出する不正メモリアクセス検出装置であり、
前記被検査プログラムを実行する主実行手段と、
前記被検査プログラムに従って実行メモリ内の記憶領域を確保する記憶領域確保手段と、
前記記憶領域確保手段が確保した各記憶領域に識別番号を付与する識別番号付与手段と、
前記記憶領域を配置するアドレスを、前記主実行手段における当該記憶領域の配置アドレスに当該記憶領域の識別番号を足し合わせたアドレスを示す仮想アドレスに置換して、前記主実行手段が実行した同一の命令を実行する従実行手段と、
前記主実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値を取得するアドレス取得手段と、
前記従実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値である仮想アドレスを取得する仮想アドレス取得手段と、
前記仮想アドレス取得手段が取得した仮想アドレス値から、前記アドレス取得手段が取得したアドレス値を減算する減算手段と、
前記減算手段が減算した値と、前記記憶領域確保手段が確保した何れかの記憶領域の識別番号とが合致するか否かを判定する識別番号判定手段と、
前記識別番号判定手段が、前記減算手段が減算した値と前記何れかの記憶領域の識別番号とが合致すると判定した場合、前記合致したと判定された識別番号が示す記憶領域のアドレス範囲内に前記アドレス取得手段が取得したアドレス値が含まれるか否かを判定するアドレス範囲判定手段と、
前記識別番号判定手段が、前記アドレス減算手段が減算した値が前記何れの記憶領域の識別番号とも合致しないと判定した場合、または前記アドレス範囲判定手段が、前記アドレス取得手段が取得したアドレス値が前記アドレス範囲内に含まれないと判定した場合に、前記アドレス取得手段によるアドレス値の取得が不正なメモリアクセスであることを示すエラーを出力するエラー出力手段と、
を備えることを特徴とする不正メモリアクセス検出装置。
【請求項２】
前記従実行手段は、前記被検査プログラムに従ってなされる各メモリアクセスのアドレス値を前記主実行手段における当該メモリアクセスのアドレス値に変更して前記被検査プログラムを実行することで、各記憶領域の配置アドレスを主実行手段に等しくしながら、各記憶領域の配置アドレスを前記仮想アドレスに置換した場合の前記被検査プログラムの実行を再現し、
前記仮想アドレス取得手段は、変更前のアドレス値を仮想アドレスとして取得する、
ことを特徴とする請求項１に記載の不正メモリアクセス検出装置。
【請求項３】
被検査プログラムによる不正なメモリアクセスを検出する不正メモリアクセス検出装置を用いた不正メモリアクセス検出方法であり、
主実行手段は、前記被検査プログラムを実行し、
記憶領域確保手段は、前記被検査プログラムに従って実行メモリ内の記憶領域を確保し、
識別番号付与手段は、前記記憶領域確保手段が確保した各記憶領域に識別番号を付与し、
従実行手段は、前記記憶領域を配置するアドレスを、前記主実行手段における当該記憶領域の配置アドレスに当該記憶領域の識別番号を足し合わせたアドレスを示す仮想アドレスに置換して、前記主実行手段が実行した同一の命令を実行し、
アドレス取得手段は、前記主実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値を取得し、
仮想アドレス取得手段は、前記従実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値である仮想アドレスを取得し、
減算手段は、前記仮想アドレス取得手段が取得した仮想アドレス値から、前記アドレス取得手段が取得したアドレス値を減算し、
識別番号判定手段は、前記減算手段が減算した値と、前記記憶領域確保手段が確保した何れかの記憶領域の識別番号とが合致するか否かを判定し、
アドレス範囲判定手段は、前記識別番号判定手段が、前記減算手段が減算した値と前記何れかの記憶領域の識別番号とが合致すると判定した場合、前記合致したと判定された識別番号が示す記憶領域のアドレス範囲内に前記アドレス取得手段が取得したアドレス値が含まれるか否かを判定し、
エラー出力手段は、前記識別番号判定手段が、前記アドレス減算手段が減算した値が前記何れの記憶領域の識別番号とも合致しないと判定した場合、または前記アドレス範囲判定手段が、前記アドレス取得手段が取得したアドレス値が前記アドレス範囲内に含まれないと判定した場合に、前記アドレス取得手段によるアドレス値の取得が不正なメモリアクセスであることを示すエラーを出力する、
ことを特徴とする不正メモリアクセス検出方法。
【請求項４】
前記従実行手段は、前記被検査プログラムに従ってなされる各メモリアクセスのアドレス値を前記主実行手段における当該メモリアクセスのアドレス値に変更して前記被検査プログラムを実行することで、各記憶領域の配置アドレスを主実行手段に等しくしながら、各記憶領域の配置アドレスを前記仮想アドレスに置換した場合の前記被検査プログラムの実行を再現し、
前記仮想アドレス取得手段は、変更前のアドレス値を仮想アドレスとして取得する、
ことを特徴とする請求項３に記載の不正メモリアクセス検出方法。
【請求項５】
コンピュータを、
前記被検査プログラムを実行する主実行手段、
前記被検査プログラムに従って実行メモリ内の記憶領域を確保する記憶領域確保手段、
前記記憶領域確保手段が確保した各記憶領域に識別番号を付与する識別番号付与手段、
前記記憶領域を配置するアドレスを、前記主実行手段における当該記憶領域の配置アドレスに当該記憶領域の識別番号を足し合わせたアドレスを示す仮想アドレスに置換して、前記主実行手段が実行した同一の命令を実行する従実行手段、
前記主実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値を取得するアドレス取得手段、
前記従実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値である仮想アドレスを取得する仮想アドレス取得手段、
前記仮想アドレス取得手段が取得した仮想アドレス値から、前記アドレス取得手段が取得したアドレス値を減算する減算手段、
前記減算手段が減算した値と、前記記憶領域確保手段が確保した何れかの記憶領域の識別番号とが合致するか否かを判定する識別番号判定手段、
前記識別番号判定手段が、前記減算手段が減算した値と前記何れかの記憶領域の識別番号とが合致すると判定した場合、前記合致したと判定された識別番号が示す記憶領域のアドレス範囲内に前記アドレス取得手段が取得したアドレス値が含まれるか否かを判定するアドレス範囲判定手段、
前記識別番号判定手段が、前記アドレス減算手段が減算した値が前記何れの記憶領域の識別番号とも合致しないと判定した場合、または前記アドレス範囲判定手段が、前記アドレス取得手段が取得したアドレス値が前記アドレス範囲内に含まれないと判定した場合に、前記アドレス取得手段によるアドレス値の取得が不正なメモリアクセスであることを示すエラーを出力するエラー出力手段、
として機能させるための不正メモリアクセス検出プログラム。
【請求項６】
前記従実行手段は、前記被検査プログラムに従ってなされる各メモリアクセスのアドレス値を前記主実行手段における当該メモリアクセスのアドレス値に変更して前記被検査プログラムを実行することで、各記憶領域の配置アドレスを主実行手段に等しくしながら、各記憶領域の配置アドレスを前記仮想アドレスに置換した場合の前記被検査プログラムの実行を再現し、
前記仮想アドレス取得手段は、変更前のアドレス値を仮想アドレスとして取得する、
ことを特徴とする請求項５に記載の不正メモリアクセス検出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、被検査プログラムによる不正なメモリアクセスを検出する不正メモリアクセス検出装置、不正メモリアクセス検出方法及び不正メモリアクセス検出プログラムに関する。
【背景技術】
【０００２】
ＰＣ（Personal Computer、パーソナルコンピュータ）、ワークステーション、組み込み装置等を動作させるコンピュータプログラムの開発する際のテストやデバッグの工程で行われるプログラムの検査として、メモリアクセスの境界検査（Boundary Test）がある。これは、コンピュータの実行部が実行するプログラムに従ってメモリにアクセスする際に、実行部がアクセスを行うメモリの参照アドレスが、プログラムの実行用に割り当てられた記憶領域を示しているか否かを判定する検査である。例えば、アドレスの値を記憶するポインタ変数が使用できるＣ言語等を用いると、任意の記憶領域を参照することができるため、実行部がプログラムの実行用に割り当てられていない記憶領域の値へのアクセスを行ってしまう可能性がある。
実行部がプログラムの実行用に割り当てられていない記憶領域に対し値の書き込みや読み出しを行うと、当該プログラムが正常に動作しない惧れがある。あるいは、割り当てられた範囲外の記憶領域に値の書き込みを行うと、当該プログラムを実行する装置やシステムに重大な問題を生じさせる惧れがある。
【０００３】
境界検査の手法として、メモリアクセス先のアドレスを記憶するポインタ変数が保持する情報量を増加させた拡張ポインタ変数に、参照先のアドレスのみでなく、参照する記憶領域の範囲を示す情報を持たせるようにプログラムを書き換えて、さらにメモリアクセスを行う前にアドレス値の範囲を検査する命令を組み込み、得られた検査用プログラムを代わりに実行することで不正メモリアクセスを検出する手法が考案されている（例えば、非特許文献１を参照）。
【０００４】
例えば、境界検査装置が、図９（１）に示すプログラムを検査する場合を例に説明する。図９（１）は、ポインタ変数ｐに記憶領域ｓｅｇ１の先頭アドレスにオフセット１０を加算したアドレスを代入し、続いてポインタ変数ｐが示す記憶領域に値１を書き込ませるプログラムである。これに対し、拡張ポインタ変数を用いる境界検査装置は、ポインタ変数ｐの型を、図９（２）のプログラムに示すように、２つのメンバｖａｌ、ｂａｓｅを有するｃｈａｒ＿ｐｔｒ構造体に変換する。なお、ここで変換したｃｈａｒ＿ｐｔｒ構造体が拡張ポインタ変数である。
次に、変換前のプログラムのポインタ変数ｐに対する操作命令を、ｃｈａｒ＿ｐｔｒ構造体ｐのｖａｌメンバに対する操作命令に変換する。なお、ｃｈａｒ＿ｐｔｒ構造体ｐのｂａｓｅメンバは、変換前のプログラムのポインタ変数ｐが参照する記憶領域を示し、この例ではｓｅｇ１へのポインタが格納される。
そして、ｃｈａｒ＿ｐｔｒ構造体ｐを用いてメモリアクセスがなされる前に、_ｃｈｅｃｋ＿ｐｔｒ関数を呼び出し、ｃｈａｒ＿ｐｔｒ構造体ｐの指すアドレスが正常な範囲か検査を行う。_ｃｈｅｃｋ＿ｐｔｒ関数は、ｃｈａｒ＿ｐｔｒ構造体ｐのｂａｓｅメンバが示す記憶領域ｓｅｇ１の有効なアドレス範囲に、ｃｈａｒ＿ｐｔｒ構造体ｐのｖａｌメンバが示すアドレスが含まれるか否か検査する関数である。この例では、ｖａｌメンバの示すｓｅｇ１＋１０はｓｅｇ１の有効範囲外であるため、当該メモリアクセスを不正メモリアクセスと判定し、エラー情報を出力する。
これにより、拡張ポインタ変数を用いた手法では、ポインタ変数に誤ったオフセット値を加算することで割り当てられた記憶領域のアドレスの範囲外を参照する不正なメモリアクセスの検出を行うことができる。
【０００５】
また、非特許文献２に、ＣＰＵ用の機械語プログラムに対して境界検査を行う手法が記載されている。この手法では、機械語プログラムのＣＰＵによる実行をシミュレートするデバッガソフトウェアを用いるとともに、実行中にＣＰＵのレジスタやメモリに格納された変数が、メモリ領域のアドレスを格納している場合は、参照先のメモリ領域を示すポインタを、レジスタ及びメモリ上の変数の補助情報として記憶できるようにデバッガソフトウェアの機能を拡張する。このような拡張されたデバッガソフトウェアを用い、前述した拡張ポインタ変数を用いた検査と同様の手順で、参照先メモリ領域の情報を設定し、メモリアクセス前にアドレスの検査を行うことで、不正なメモリアクセスの検出を行なうことができる。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】Todd M. Austin、Scott E. Breach、Gurindar S. Sohi、「Efficient Detection of All Pointer and Array Access Errors」、ACM SIGPLAN Notices、（米国）、１９９４年６月、第２９巻、第６号、ｐ．２９０−３０１
【非特許文献２】N.Nethercote and J.Fintzhardinge、「Bounds-Checking Entire Programs without Recompiling」、Informal Proceedings of SPACE 2004、（伊国）２００４年１月
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、拡張ポインタ手法のようにポインタ変数が参照する記憶領域を追跡する境界検査手法は、オフセット加算以外のより複雑なアドレス計算を含むプログラムに対し、誤ったエラー情報を出力する可能性が有るという問題がある。
以下に、そのような問題を引き起こすアドレス計算を含むプログラムと、それに対して拡張ポインタ変数を用いた境界検査を実施した例を示す。
図７は、被検査プログラムのプログラムリストである。
被検査プログラムは、グローバル変数の宣言９１０、メイン関数９２０で構成されている。
宣言９１０では、ｃｈａｒ配列変数としてｓｅｇ１とｓｅｇ２とを宣言し、ｉｎｔ整数型変数ｄ、ポインタ変数ｐ、ｃｈａｒ変数ｃを宣言している。
メイン関数９２０は、命令９２１〜９２６で構成されている。
【０００８】
当該被検査プログラムの中で、命令９２４によるメモリアクセスは、ｓｅｇ１の先頭アドレスに「ｓｅｇ２の先頭アドレス−ｓｅｇ１の先頭アドレス」を加算して得られるアドレス、すなわちｓｅｇ２の先頭アドレスに該当する記憶領域からｃｈａｒ変数値を読み出すアクセスである。このアクセスはｓｅｇ２の正しい範囲内を参照しており、正常なメモリアクセスである。
【０００９】
しかし、監視部は、実行部が記憶領域ｓｅｇ１の先頭アドレスを示すポインタ変数ｐに整数値を加算する処理を行う関数を実行するため、実行部によるアクセスが、ｓｅｇ１へのアクセスであると判定してしまう。そのため、監視部は、当該アクセスがｓｅｇ１の範囲外へのアクセスであると判定し、当該アクセスが不正メモリアクセスであることを示すエラー情報を出力することとなる。
この問題が生じるのは、Ｃ言語で記述されたプログラムに限らない。図６と同様の処理をＣＰＵ用の機械語で記述されたプログラムに対して、非特許文献２に開示された検査を実行した場合も同様の問題が生じる。
【００１０】
本発明は上記の点に鑑みてなされたものであり、その目的は、オフセット加算以外の複雑な手順でメモリアクセス先のアドレスを計算するプログラムに対しても境界検査を実施することができる不正メモリアクセス検出装置、不正メモリアクセス検出方法及び不正メモリアクセス検出プログラムを提供することにある。
【課題を解決するための手段】
【００１１】
本発明は上記の課題を解決するためになされたものであり、被検査プログラムによる不正なメモリアクセスを検出する不正メモリアクセス検出装置であり、前記被検査プログラムを実行する主実行手段と、前記被検査プログラムに従って実行メモリ内の記憶領域を確保する記憶領域確保手段と、前記記憶領域確保手段が確保した各記憶領域に識別番号を付与する識別番号付与手段と、前記記憶領域を配置するアドレスを、前記主実行手段における当該記憶領域の配置アドレスに当該記憶領域の識別番号を足し合わせたアドレスを示す仮想アドレスに置換して、前記主実行手段が実行した同一の命令を実行する従実行手段と、前記主実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値を取得するアドレス取得手段と、前記従実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値である仮想アドレスを取得する仮想アドレス取得手段と、前記仮想アドレス取得手段が取得した仮想アドレス値から、前記アドレス取得手段が取得したアドレス値を減算する減算手段と、前記減算手段が減算した値と前記記憶領域確保手段が確保した何れかの記憶領域の識別番号とが合致するか否かを判定する識別番号判定手段と、前記識別番号判定手段が、前記減算手段が減算した値と前記何れかの記憶領域の識別番号とが合致すると判定した場合、前記合致したと判定された識別番号が示す記憶領域のアドレス範囲内に前記アドレス取得手段が取得したアドレス値が含まれるか否かを判定するアドレス範囲判定手段と、前記識別番号判定手段が、前記アドレス減算手段が減算した値が前記何れの記憶領域の識別番号とも合致しないと判定した場合、または前記アドレス範囲判定手段が、前記アドレス取得手段が取得したアドレス値が前記アドレス範囲内に含まれないと判定した場合に、前記アドレス取得手段によるアドレス値の取得が不正なメモリアクセスであることを示すエラーを出力するエラー出力手段と、を備えることを特徴とする。
【００１２】
また、本発明は、被検査プログラムによる不正なメモリアクセスを検出する不正メモリアクセス検出装置を用いた不正メモリアクセス検出方法であり、主実行手段は、前記被検査プログラムを実行し、記憶領域確保手段は、前記被検査プログラムに従って実行メモリ内の記憶領域を確保し、識別番号付与手段は、前記記憶領域確保手段が確保した各記憶領域に識別番号を付与し、従実行手段は、前記記憶領域を配置するアドレスを、前記主実行手段における当該記憶領域の配置アドレスに当該記憶領域の識別番号を足し合わせたアドレスを示す仮想アドレスに置換して、前記主実行手段が実行した同一の命令を実行し、アドレス取得手段は、前記主実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値を取得し、仮想アドレス取得手段は、前記従実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値である仮想アドレスを取得し、減算手段は、前記仮想アドレス取得手段が取得した仮想アドレス値から、前記アドレス取得手段が取得したアドレス値を減算し、識別番号判定手段は、前記減算手段が減算した値と、前記記憶領域確保手段が確保した何れかの記憶領域の識別番号とが合致するか否かを判定し、アドレス範囲判定手段は、前記識別番号判定手段が、前記減算手段が減算した値と前記何れかの記憶領域の識別番号とが合致すると判定した場合、前記合致したと判定された識別番号が示す記憶領域のアドレス範囲内に前記アドレス取得手段が取得したアドレス値が含まれるか否かを判定し、エラー出力手段は、前記識別番号判定手段が、前記アドレス減算手段が減算した値が前記何れの記憶領域の識別番号とも合致しないと判定した場合、または前記アドレス範囲判定手段が、前記アドレス取得手段が取得したアドレス値が前記アドレス範囲内に含まれないと判定した場合に、前記アドレス取得手段によるアドレス値の取得が不正なメモリアクセスであることを示すエラーを出力する、ことを特徴とする。
【００１３】
また、本発明は、コンピュータを、前記被検査プログラムを実行する主実行手段、前記被検査プログラムに従って実行メモリ内の記憶領域を確保する記憶領域確保手段、前記記憶領域確保手段が確保した各記憶領域に識別番号を付与する識別番号付与手段、前記記憶領域を配置するアドレスを、前記主実行手段における当該記憶領域の配置アドレスに当該記憶領域の識別番号を足し合わせたアドレスを示す仮想アドレスに置換して、前記主実行手段が実行した同一の命令を実行する従実行手段、前記主実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値を取得するアドレス取得手段、前記従実行手段において、前記被検査プログラムに従ってなされるメモリアクセスのアドレス値である仮想アドレスを取得する仮想アドレス取得手段、前記仮想アドレス取得手段が取得した仮想アドレス値から、前記アドレス取得手段が取得したアドレス値を減算する減算手段、前記減算手段が減算した値と、前記記憶領域確保手段が確保した何れかの記憶領域の識別番号とが合致するか否かを判定する識別番号判定手段、前記識別番号判定手段が、前記減算手段が減算した値と前記何れかの記憶領域の識別番号とが合致すると判定した場合、前記合致したと判定された識別番号が示す記憶領域のアドレス範囲内に前記アドレス取得手段が取得したアドレス値が含まれるか否かを判定するアドレス範囲判定手段、前記識別番号判定手段が、前記アドレス減算手段が減算した値が前記何れの記憶領域の識別番号とも合致しないと判定した場合、または前記アドレス範囲判定手段が、前記アドレス取得手段が取得したアドレス値が前記アドレス範囲内に含まれないと判定した場合に、前記アドレス取得手段によるアドレス値の取得が不正なメモリアクセスであることを示すエラーを出力するエラー出力手段、として機能させるための不正メモリアクセス検出プログラムである。
【発明の効果】
【００１４】
本発明によれば、主実行手段が、被検査プログラムを実行し、従実行手段が、記憶領域のアドレス値を当該記憶領域の識別番号とアドレス値とを足し合わせた仮想アドレス値を示す仮想アドレスに置換して主実行手段と同一の命令を実行し、アドレス取得手段が、主実行手段によるメモリアクセスのアドレス値を取得し、仮想アドレス取得手段が、従実行手段によるメモリアクセスのアドレス値を取得し、減算手段が、取得した仮想アドレス値からアドレス値を減算することで、被検査プログラムがアクセスを意図する記憶領域の識別番号を取得することができ、アクセスする記憶領域が、当該識別番号が示す記憶領域の範囲内で有効であるか否かを判定することで不正メモリアクセスの検出を行う。これにより、不正メモリアクセス検出装置は、オフセット加算以外の複雑な手順でメモリアクセス先のアドレスを計算するプログラムに対しても境界検査を実施することができる。
【図面の簡単な説明】
【００１５】
【図１】本発明の一実施形態による不正メモリアクセス検出装置の構成を示す概略ブロック図である。
【図２】メモリ情報記憶部が記憶する情報を示す図である。
【図３】不正メモリアクセス検出装置１００の動作を示すフローチャートである。
【図４】記憶領域確保・解放処理の動作を示すフローチャートである。
【図５】通常処理の動作を示すフローチャートである。
【図６】メモリアクセス処理の動作を示すフローチャートである。
【図７】被検査プログラムのプログラムリストである。
【図８】変数の記憶領域と指定されたアドレスを示す図である。
【図９】被検査プログラム及び検査用プログラムのプログラムリストである。
【発明を実施するための形態】
【００１６】
以下、図面を参照しながら本発明の一実施形態について詳しく説明する。
図１は、本発明の一実施形態による不正メモリアクセス検出装置の構成を示す概略ブロック図である。
不正メモリアクセス検出装置１００は、プログラム記憶部１１０、主実行部１２０、記憶領域管理部１３０、従実行部１４０、メモリアクセス検査部１５０を備える。
プログラム記憶部１１０は、境界検査を実行する被検査プログラムを記憶する。
主実行部１２０は、プログラム記憶部１１０が記憶する被検査プログラムを実行する。
記憶領域管理部１３０は、主実行部１２０のメモリ１２４の情報を管理する。
従実行部１４０は、主実行部１２０とは異なる環境で被検査プログラムを実行する。
メモリアクセス検査部１５０は、主実行部１２０と従実行部１４０によるメモリアクセスの境界検査を実行する。
【００１７】
主実行部１２０は、実行部１２１、アクセス部１２２、アドレス取得部１２３、メモリ１２４を備える。
実行部１２１は、プログラム記憶部１１０が記憶する被検査プログラムを実行する。
アクセス部１２２は、被検査プログラムに従って指定された記憶領域のメモリ１２４内への確保・解放と、メモリ１２４に格納された変数へのアクセスを行う。
アドレス取得部１２３は、被検査プログラムに従ってなされるメモリアクセスが参照する記憶領域のアドレスをメモリ１２４から取得する。
【００１８】
記憶領域管理部１３０は、メモリ情報処理部１３１、識別番号付与部１３２、メモリ情報記憶部１３３を備える。
メモリ情報処理部１３１は、メモリ情報記憶部１３３への情報の登録、削除を行う。
識別番号付与部１３２は、主実行部１２０のメモリ１２４内に確保された記憶領域に固有の識別番号を付与する。
メモリ情報記憶部１３３は、メモリ１２４の記憶領域を示す変数名と、記憶領域の識別番号と、記憶領域の先頭アドレスと、記憶領域の範囲とを関連付けて記憶する。
【００１９】
従実行部１４０は、シミュレータ部１４１、アクセス部１４２、仮想アドレス算出部１４３、仮想アドレス取得部１４４、メモリ１４５を備える。
シミュレータ部１４１は、主実行部１２０が実行した被検査プログラムの命令を、主実行部１２０に追従して実行する。
アクセス部１４２は、被検査プログラムに従って指定された記憶領域のメモリ１４５内への確保・解放と、メモリ１４５に格納された変数へのアクセスを行う。
仮想アドレス算出部１４３は、記憶領域のアドレス値と当該記憶領域の識別番号とを記憶領域管理部１３０のメモリ情報記憶部１３３から取得し、記憶領域のアドレス値と識別番号とを加算した仮想アドレスを算出する。
仮想アドレス取得部１４４は、被検査プログラムに従ってなされるメモリアクセスが参照する記憶領域のアドレスである仮想アドレスを取得する。
【００２０】
メモリアクセス検査部１５０は、減算部１５１、判定部１５２、エラー出力部１５３を備える。
減算部１５１は、従実行部１４０の仮想アドレス取得部１４４が取得した仮想アドレス値から主実行部１２０のアドレス取得部１２３が取得したアドレス値を減算する。
判定部１５２は、減算部１５１が減算した値が、メモリ情報記憶部１３３が記憶する何れかの記憶領域の識別番号と一致するか否かを判定する。
エラー出力部１５３は、判定部１５２の判定結果に基づいて不正メモリアクセスを示すエラーを出力する。
【００２１】
図２は、メモリ情報記憶部が記憶する情報を示す図である。
図２に示すように、メモリ情報記憶部１３３は、メモリ１２４の記憶領域を示す変数名と、記憶領域の識別番号と、記憶領域の先頭アドレスと、記憶領域の範囲とを関連付けて記憶する。
例えば、変数名がｐ１として確保された記憶領域は、変数名「ｐ１」、識別番号「０ｘ１０」、先頭アドレス「０ｘ１００」、範囲「０ｘ１００〜０ｘ１０Ｆ」として登録される。なお、「０ｘ」は、以降に続く数字が１６進数であることを示す。
【００２２】
そして、本発明による不正メモリアクセス検出装置１００において、主実行部１２０が被検査プログラムを実行し、アクセス部１２２が被検査プログラムに従ってメモリ１２４内の変数の記憶領域を確保し、識別番号付与部１３２が、アクセス部１２２が確保した各記憶領域に識別番号を付与する。また、従実行部１４０は、記憶領域を配置するアドレスを、主実行部１２０における同じ記憶領域の配置アドレスに、当該記憶領域の識別番号を足し合わせたアドレスを示す仮想アドレスに置換して、主実行部１２０が実行した同一の命令を実行する。
次に、アドレス取得部１２３は、主実行部１２０において、被検査プログラムに従ってなされるメモリアクセスのアドレス値を取得し、仮想アドレス取得部１４４は、従実行部１４０において、被検査プログラムに従ってなされるメモリアクセスのアドレス値である仮想アドレスを取得し、減算部１５１が、仮想アドレス取得部１４４が取得した仮想アドレス値から、アドレス取得部１２３が取得したアドレス値を減算する。
そして、判定部１５２は、アドレス値を減算した値が、何れかの記憶領域の識別番号と合致するか否かを判定し、何れかの記憶領域の識別番号と合致すると判定した場合、合致したと判定する識別番号が示す記憶領域のアドレス範囲内に前記アドレス取得手段が取得したアドレス値が含まれるか否かを判定し、エラー出力部１５３は、判定部１５２が何れの識別番号とも合致しないと判定した場合、またはアドレス範囲内にアドレス値が含まれないと判定した場合に、アドレス取得部１２３によるアドレス値の取得が不正なメモリアクセスであることを示すエラーを出力する。
これにより、不正メモリアクセス検出装置１００は、オフセット加算以外の複雑な手順でメモリアクセス先のアドレスを計算するプログラムに対しても境界検査を実施する。
【００２３】
次に、不正メモリアクセス検出装置１００の動作を説明する。
図３は、不正メモリアクセス検出装置１００の動作を示すフローチャートである。
まず、ユーザは、境界検査を実施する被検査プログラムをプログラム記憶部１１０に登録し、不正メモリアクセス検出装置１００が動作を開始する。不正メモリアクセス検出装置１００の動作の開始は、例えば、不正メモリアクセス検出装置１００の表示部に表示された検査開始ボタン等を押下することで行われる。
【００２４】
不正メモリアクセス検出装置１００が動作を開始すると、主実行部１２０の実行部１２１は、プログラム記憶部１１０が記憶する被検査プログラムから命令を読み取る（ステップＳ１）。なお、実行部１２１は、被検査プログラムを言語規約に従って逐次実行するインタープリタ型のプログラム実行部である。
実行部１２１によるプログラムの読み出しは、プログラムを正しく解釈しながら実行できるよう適切な順番で行われる。例えば、Ｃ言語で記述されたプログラムでは、関数や変数の宣言、グローバル変数の配置や初期化の命令を最初に読み出して実行し、次にメイン関数を読み出し、解釈実行する。
【００２５】
実行部１２１は、被検査プログラムから命令を読み取ると、当該命令の種類が、記憶領域の確保または解放を行う命令、メモリアクセス命令、その他の通常命令のいずれであるかを判定する（ステップＳ２）。
ここで、記憶領域の確保を行う命令は、例えばＣ言語では、プログラム実行開始時のグローバル変数の宣言や、関数やスコープ内の自動変数の宣言、ｍａｌｌｏｃ関数などのメモリ領域確保関数を呼び出す命令などがある。
また、記憶領域の解放を行う命令は、例えばＣ言語では、関数やスコープから脱出する際の自動変数の解放や、ｆｒｅｅ関数などメモリ領域解放関数を呼び出す命令などがある。
また、メモリアクセス命令は、明示的にアドレスを指定して変数への読み書きを行う命令のことを示す。例えばＣ言語では、ポインタ変数に対する間接演算子＊や配列演算子［］を用いた命令がある。なお、ここでは、変数に対してアドレスを指定せずに、変数名で直接扱う命令は、メモリアクセス命令ではなく通常命令とみなす。
また、通常命令は、記憶領域の確保または解放を行う命令、メモリアクセス命令、以外の命令を示す。
【００２６】
なお、説明を簡略化するため、上述した命令を複数含む命令は、等価な処理を行う複数の命令列に適切に分割して実行されるものとする。例えば、ｃｈａｒポインタ変数ｐ１、ｐ２に対してメモリアクセスを２つ実行する「＊ｐ１＝＊ｐ２；」という命令は、ｃｈａｒ一時変数ｃ１を用いて「ｃｈａｒ  ｃ１；ｃ１＝＊ｐ１；＊ｐ２＝ｃ１；」のように複数の命令に分割して実行する。また例えば、「＊ｐ１＝ｃ１＋１；」という命令も同様に、「ｃｈａｒ  ｃ２；ｃ２＝ｃ１＋１；＊ｐ１＝ｃ２；」のように複数の命令に分割して実行する。
【００２７】
実行部１２１が、命令の種類が記憶領域の確保または解放を行う命令であると判定した場合（ステップＳ２：記憶領域の確保・解放）、不正メモリアクセス検出装置１００は、記憶領域確保・解放処理を実行する（ステップＳ３）。なお、記憶領域確保・解放処理の詳細は後述する。
実行部１２１が、命令の種類が通常命令であると判定した場合（ステップＳ２：通常）、不正メモリアクセス検出装置１００は、通常処理を実行する（ステップＳ４）。なお、通常処理の詳細は後述する。
実行部１２１が、命令の種類がメモリアクセス命令であると判定した場合（ステップＳ２：メモリアクセス）、不正メモリアクセス検出装置１００は、メモリアクセス処理を実行する（ステップＳ５）。なお、メモリアクセス処理の詳細は後述する。
なお、不正メモリアクセス検出装置１００は、ステップＳ５のメモリアクセス処理のときのみ検査処理を行う。
【００２８】
不正メモリアクセス検出装置１００がステップＳ３〜ステップＳ５の何れかの処理を実行すると、実行部１２１は、被検査プログラムに次の命令があるか否かを判定する（ステップＳ６）。実行部１２１は、次の命令があると判定した場合（ステップＳ６：ＹＥＳ）、ステップＳ１に戻り、被検査プログラムの命令を実行する。実行部１２１が次の命令がないと判定した場合、不正メモリアクセス検出装置１００は、処理を終了する。
【００２９】
次に、ステップＳ３による記憶領域確保・解放処理の動作の説明をする。
図４は、記憶領域確保・解放処理の動作を示すフローチャートである。
ステップＳ２によって実行部１２１が、被検査プログラムから読み取った命令が記憶領域の確保または解放を行う命令であると判定すると、まず、主実行部１２０のアクセス部１２２は、被検査プログラムの命令に従って、メモリ１２４への指定された記憶領域の確保または解放を行う（ステップＳ１０１）。アクセス部１２２がメモリ１２４への記憶領域の確保または解放を行うと、記憶領域管理部１３０のメモリ情報処理部１３１は、主実行部１２０のアクセス部１２２が記憶領域の確保を行ったか解放を行ったかを判定する（ステップＳ１０２）。なお、確保であるか解放であるかは、実行部１２１により通知される。
【００３０】
メモリ情報処理部１３１が、アクセス部１２２が記憶領域の確保を行ったと判定した場合（ステップＳ１０２：ＹＥＳ）、識別番号付与部１３２は、アクセス部１２２が確保した記憶領域に識別番号を付与する（ステップＳ１０３）このとき、識別番号付与部１３２は、不正メモリアクセス検出装置１００の動作開始から一度も用いられていないユニークな識別番号を付与する。一度も用いられていないユニークな識別番号の付与は、例えば過去に付与した識別番号のリストを保持する識別番号記憶部（図示せず）を備え、識別番号記憶部が記憶していない識別番号を付与することで実現できる。または、識別番号として登録順に連番を割り当てることでも実現できる。
識別番号付与部１３２が識別番号を付与すると、メモリ情報処理部１３１は、メモリ情報記憶部１３３に、識別番号付与部１３２が付与した識別番号と、記憶領域の先頭アドレスと、記憶領域の範囲とを関連付けて登録する（ステップＳ１０４）。
【００３１】
メモリ情報処理部１３１は、アクセス部１２２が記憶領域の解放を行ったと判定した場合（ステップＳ１０２：ＮＯ）、メモリ情報記憶部１３３から、アクセス部１２２が解放した記憶領域の情報を削除する（ステップＳ１０５）。
【００３２】
ステップＳ１０４でメモリ情報処理部１３１が記憶領域の情報を登録し、またはステップＳ１０５でメモリ情報処理部１３１が記憶領域の情報を削除すると、主実行部１２０の実行部１２１は、実行部１２１が実行した命令の情報とアクセス部１２２によってアクセスされた記憶領域のアドレスとを示す実行情報を従実行部１４０のシミュレータ部１４１に通知する（ステップＳ１０６）。ここで、実行情報に含まれる実行部１２１が実行した命令の情報とは、例えば実行部１２１が実行した被検査プログラムのプログラムリストの行番号等を示す。
【００３３】
シミュレータ部１４１が実行情報を実行部１２１から取得すると、アクセス部１４２は、取得した実行情報に従って、メモリ１４５への記憶領域の確保または解放を行う（ステップＳ１０７）。このとき、アクセス部１４２は、主実行部１２０のアクセス部１２２がメモリ１２４に対して確保または解放を行った記憶領域と同じアドレスに対して記憶領域の確保または解放を行う。
【００３４】
これにより、不正メモリアクセス検出装置１００は、主実行部１２０及び従実行部１４０で同じアドレスの記憶領域に対する操作を行う。また、不正メモリアクセス検出装置１００は、記憶領域管理部１３０のメモリ情報記憶部１３３に主実行部１２０のメモリ１２４の記憶領域の情報を記憶させる。
【００３５】
次に、ステップＳ４による通常処理の動作の説明をする。
図５は、通常処理の動作を示すフローチャートである。
ステップＳ２によって実行部１２１が、被検査プログラムから読み取った命令が通常命令であると判定すると、まず、主実行部１２０の実行部１２１は、被検査プログラムの命令に従って命令を実行する（ステップＳ２０１）。但し、命令に従って読み書き操作を行う場合、メモリ１２４の記憶領域に格納された値を用いる。
命令を実行すると、実行部１２１は、実行部１２１が実行した命令の情報とアクセス部１２２によってアクセスされた記憶領域のアドレスとを示す実行情報を従実行部１４０のシミュレータ部１４１に通知する（ステップＳ２０２）。
【００３６】
シミュレータ部１４１が実行情報を実行部１２１から取得すると、アクセス部１４２は、取得した実行情報に従って、主実行部１２０が実行した命令と同一の命令を実行する（ステップＳ２０３）。但し、命令に従って読み書き操作を行う場合、メモリ１４５の記憶領域に格納された値を用いる。さらに、記憶領域に割り当てられた配置アドレスに依存した評価式が命令に含まれる場合は、その記憶領域の配置アドレスを、主実行部１２０のメモリ１２４における配置アドレスと当該記憶領域の識別番号とを加算して得られるアドレス値である仮想アドレスに置換して命令を実行する。
【００３７】
ここで、仮想アドレスの計算は、仮想アドレス算出部１４３が行い、シミュレータ部１４１に通知する。また、記憶領域の識別番号は、仮想アドレス算出部１４３がメモリ情報記憶部１３３に問い合わせて取得する。
またこのとき、アクセス部１４２は、主実行部１２０のアクセス部１２２がメモリ１２４に対して変数のアクセスを行った記憶領域と同じアドレスに対して変数のアクセスを行う。これにより、従実行部１４０のメモリ１４５における各変数の配置アドレスは、仮想アドレスではなく、主実行部１２０のメモリ１２４における配置アドレスに一致する。
【００３８】
次に、ステップＳ５によるメモリアクセス処理の動作を説明する。
図６は、メモリアクセス処理の動作を説明するフローチャートである。
ステップＳ２によって実行部１２１が、被検査プログラムから読み取った命令がアドレスを指定して記憶領域への読み書きを行うメモリアクセス命令であると判定すると、まず、主実行部１２０のアドレス取得部１２３は、被検査プログラムの命令に従ってアクセスされるメモリ１２４上の指定された記憶領域のアドレス値を取得する（ステップＳ３０１）。
【００３９】
アドレス取得部１２３が記憶領域のアドレス値を取得すると、実行部１２１は、実行部１２１が実行した命令を示す実行情報を従実行部１４０のシミュレータ部１４１に通知する（ステップＳ３０２）。
シミュレータ部１４１が実行情報を実行部１２１から取得すると、仮想アドレス取得部１４４は、実行部１２１で実行した命令を従実行部で実行するとアクセスされるメモリのアドレスを仮想アドレスとして取得する（ステップＳ３０３）。
【００４０】
ステップＳ３０３で仮想アドレス取得部１４４が仮想アドレス値を取得すると、メモリアクセス検査部１５０の減算部１５１は、仮想アドレス取得部１４４が取得した仮想アドレス値から、主実行部１２０のアドレス取得部１２３が取得したアドレス値を減算する（ステップＳ３０４）。これにより、減算した値は、被検査プログラムによってアクセスされる対象の記憶領域の識別番号となる。すなわち、被検査プログラムによってアクセスされる対象の記憶領域を特定することができる。
【００４１】
ステップＳ３０４で減算部１５１が減算した値を算出すると、判定部１５２は、記憶領域管理部１３０のメモリ情報記憶部１３３が記憶する何れかの記憶領域の識別番号と減算した値とが合致するか否かを判定する（ステップＳ３０５）。
判定部１５２は、メモリ情報記憶部１３３が記憶する何れかの記憶領域の識別番号と減算した値とが合致すると判定した場合（ステップＳ３０５：ＹＥＳ）、アドレス取得部１２３が取得したアドレスが、合致した識別番号が示す記憶領域の範囲内にあるか否かを判定する（ステップＳ３０６）。
【００４２】
判定部１５２が、合致した識別番号が示す記憶領域の範囲内にアドレス取得部１２３が取得したアドレスがあると判定した場合（ステップＳ３０６：ＹＥＳ）、主実行部１２０の実行部１２１は、被検査プログラムの命令に従ってメモリアクセス命令を実行する（ステップＳ３０７）。命令を実行すると、実行部１２１は、実行部１２１が実行した命令の情報を従実行部１４０のシミュレータ部１４１に通知する（ステップＳ３０８）。
シミュレータ部１４１が実行情報を実行部１２１から取得すると、アクセス部１４２は、取得した実行情報に従って、主実行部１２０が実行した命令と同一のメモリアクセス命令を実行する（ステップＳ３０９）。但し、このときアクセスされるアドレスは仮想アドレスではなく、主実行部１２０がアクセスしたアドレス値を用いる。
【００４３】
一方、ステップＳ３０５で、判定部１５２が、減算部１５１が減算した値が、メモリ情報記憶部１３３が記憶する何れの記憶領域の識別番号とも合致しないと判定した場合（ステップＳ３０５：ＮＯ）、または、ステップＳ３０６で、判定部１５２が、合致した識別番号が示す記憶領域の範囲内にアドレス取得部１２３が取得したアドレスがないと判定した場合（ステップＳ３０６：ＮＯ）、エラー出力部１５３は、被検査プログラムによるアドレスの取得命令が不正なメモリアクセスであることを示すエラー情報を出力する（ステップＳ３１０）。
【００４４】
これにより、不正メモリアクセス検出装置１００は、記憶領域を参照するアドレス値を用いた演算を行うプログラムに対しても適切な境界検査を行うことができる。
【００４５】
次に、本実施形態による不正メモリアクセス検出装置１００の動作を、具体的な被検査プログラムの例を用いて説明する。まず、説明に用いる被検査プログラムの説明を行う。
図７は、被検査プログラムのプログラムリストである。
被検査プログラムは、グローバル変数の宣言９１０、メイン関数９２０で構成されている。
宣言９１０では、ｃｈａｒ配列変数としてｓｅｇ１とｓｅｇ２とを宣言し、ｉｎｔ整数型変数ｄ、ポインタ変数ｐ、ｃｈａｒ変数ｃを宣言している。初期値として、ｓｅｇ２には文字列“ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏ”と終端コードとからなる１６バイトが設定されている。
メイン関数９２０は、命令９２１〜９２６で構成されている。
【００４６】
当該被検査プログラムの中で、命令９２４によるメモリアクセスは、ｓｅｇ１の先頭アドレスに「ｓｅｇ２の先頭アドレス−ｓｅｇ１の先頭アドレス」を加算して得られるアドレス、すなわちｓｅｇ２の先頭アドレスに該当する記憶領域からｃｈａｒ変数値を読み出すアクセスである。このアクセスはｓｅｇ２の正しい範囲内を参照しており、正常なメモリアクセスである。
一方、命令９２６によるメモリアクセスは、ｓｅｇ１の先頭アドレスに１６を加えたアドレスに値を書き込むアクセスである。これは、ｓｅｇ１の範囲外であるため、不正なアクセスである。
【００４７】
以下に、不正メモリアクセス検出装置１００による被検査プログラムの実行について説明する。
まず、不正メモリアクセス検出装置１００は、グローバル変数の宣言９１０の命令文を実行する。グローバル変数の宣言９１０は、記憶領域の確保または解放を行う命令であるため、ステップＳ３、すなわちステップＳ１０１〜Ｓ１０７の処理を行う。主実行部１２０のアクセス部１２２は、ステップＳ１０１によって配列変数ｓｅｇ１を格納する記憶領域をメモリ１２４に確保する。アクセス部１２２が記憶領域の確保を行うと、割り当てられたアドレス範囲は、記憶領域管理部１３０に通知される。
【００４８】
記憶領域管理部１３０のメモリ情報処理部１３１がアドレス範囲の通知を取得すると、ステップＳ１０３により、記憶領域管理部１３０の識別番号付与部１３２は、当該アドレス範囲に識別番号を付与する。なお、ここでは識別番号として０ｘ１０が割り当てられたものとする。識別番号付与部１３２が識別番号を付与すると、主実行部１２０の実行部１２１が実行情報を従実行部１４０に通知する。従実行部１４０のシミュレータ部１４１は、実行情報の通知を取得すると、ステップＳ１０７により、主実行部１２０と同様に、０ｘ１００番地から０ｘ１０Ｆ番地に記憶領域を確保する。
【００４９】
ｓｅｇ２の確保と初期化も、上述した処理と同様、ステップＳ１０１〜Ｓ１０７に従って処理を行う。ここでは、ｓｅｇ２は、０ｘ１１０番地から０ｘ１１Ｆ番地に確保され、識別番号は０ｘ２０であるとする。また、ｓｅｇ２には、初期値“ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏ”が代入される。さらに、変数ｄ、ｐ、ｃも同様に確保される。ここでは、それぞれ０ｘ１２０番地から０ｘ１２３番地、０ｘ１２４番地から０ｘ１２７番地、０ｘ１２８番地（１バイト）に確保され、識別番号はそれぞれ０ｘ３０、０ｘ４０、０ｘ５０であるものとする。
【００５０】
次に、関数９２０の命令９２１が実行される。命令９２１は、通常命令であるため、ステップＳ４、すなわちステップＳ２０１〜Ｓ２０３の処理を行う。主実行部１２０の実行部１２１は、ステップＳ２０１により、変数ｐにｓｅｇ１のアドレス０ｘ１００を設定する。次に、実行部１２１は、ステップＳ２０２により、実行した命令情報を従実行部１４０に通知する。従実行部１４０のシミュレータ部１４１は、ステップＳ２０３により、変数ｐにｓｅｇ１のアドレス０ｘ１００にｓｅｇ１の識別番号０ｘ１０を加算して得られる仮想アドレス０ｘ１１０を設定する。
【００５１】
続いて、関数９２０の命令９２２が実行される。命令９２２は、通常命令であるため、命令９２１と同様に、ステップＳ２０１〜Ｓ２０３の処理を行う。主実行部１２０の実行部１２１は、ステップＳ２０１により、変数ｄにｓｅｇ２のアドレス０ｘ１１０からｓｅｇ１のアドレス０ｘ１００を減じて得られた整数値０ｘ１０を設定する。次に、実行部１２１は、ステップＳ２０２により、実行した命令情報を従実行部１４０に通知する。従実行部１４０のシミュレータ部１４１は、ステップＳ２０３により、変数ｄにｓｅｇ２のアドレス０ｘ１１０にｓｅｇ２の識別番号０ｘ２０を加算して得られる仮想アドレス０ｘ１３０から、ｓｅｇ１の仮想アドレス０ｘ１１０を減じて得られる整数値０ｘ２０を設定する。
【００５２】
次に、関数９２０の命令９２３が実行される。命令９２３は、通常命令であるため、命令９２１、９２２と同様に、ステップＳ２０１〜Ｓ２０３の処理を行う。主実行部１２０の実行部１２１は、ステップＳ２０１により、変数ｐの値０ｘ１００に変数ｄの値０ｘ１０を加算して得られるアドレス０ｘ１１０を再び変数ｐに代入する。次に、実行部１２１は、ステップＳ２０２により、実行した命令情報を従実行部１４０に通知する。従実行部１４０のシミュレータ部１４１は、ステップＳ２０３により、変数ｐの値０ｘ１１０に変数ｄの値０ｘ２０を加算して得られるアドレス０ｘ１３０を再び変数ｐに代入する。
【００５３】
次に、関数９２０の命令９２４が実行される。命令９２４は、メモリアクセス命令であるため、ステップＳ５、すなわちステップＳ３０１〜Ｓ３１０の処理を行う。主実行部１２０のアドレス取得部１２３は、ステップＳ３０１により、ポインタ変数ｐの値から０ｘ１１０を取得する。一方、ステップＳ３０３により、仮想アドレス取得部１４４が取得する仮想アドレスは０ｘ１３０である。そして、ステップＳ３０４で減算部１５１が減算した値は０ｘ２０となり、ステップＳ３０５で、これに識別番号が等しい記憶領域がメモリ情報記憶部１３３に記憶されているか問い合わせが行われる。この場合は、ｓｅｇ２の識別番号に等しいため、ステップＳ３０６に進み、アドレス値０ｘ１１０が記憶領域ｓｅｇ２の範囲内か判定される。このアドレスは範囲内を示すため、ステップＳ３０７、ステップＳ３０９で、主実行部１２０及び従実行部１４０は、変数ｃにｓｅｇ２の先頭アドレスの文字“ａ”を代入する。すなわち、エラーを出力せずに動作が実行される。
【００５４】
次に、関数９２０の命令９２５が実行される。命令９２５は、通常命令であるため、命令９２１、９２２、９２３と同様に、ステップＳ２０１〜Ｓ２０３の処理を行う。主実行部１２０の実行部１２１は、ステップＳ２０１により、ｓｅｇ１の配置アドレス０ｘ１００に０ｘ１０を加算して得られるアドレス０ｘ１１０を変数ｐに代入する。次に、実行部１２１は、ステップＳ２０２により、実行した命令情報を従実行部１４０に通知する。従実行部１４０のシミュレータ部１４１は、ステップＳ２０３により、ｓｅｇ１の仮想アドレス０ｘ１１０に０ｘ１０を加算して得られる０ｘ１２０を変数ｐに代入する。
【００５５】
次に、関数９２０の命令９２６が実行される。命令９２６は、メモリアクセス命令であるため、命令９２４と同様にステップＳ３０１〜Ｓ３１０の処理を行う。主実行部１２０のアドレス取得部１２３は、ステップＳ３０１により、ポインタ変数ｐの値から０ｘ１１０を取得する。一方、ステップＳ３０３により、仮想アドレス取得部１４４が取得する仮想アドレスは０ｘ１２０である。そして、ステップＳ３０４で減算部１５１が減算した値は０ｘ１０となり、ステップＳ３０５で、これに識別番号が等しい記憶領域がメモリ情報記憶部１３３に記憶されているか問い合わせが行われる。この場合は、ｓｅｇ１の識別番号に等しいため、ステップＳ３０６に進み、アドレス値０ｘ１１０が記憶領域ｓｅｇ１の範囲内か判定される。このアドレスは範囲外を示すため、ステップＳ３１０で、エラー出力部１５３がエラー情報を出力する。
【００５６】
ここで、減算部１５１によって減算した値が被検査プログラムによってアクセスされる対象の記憶領域の識別番号となる理由を説明する。
図８は、変数の記憶領域と指定されたアドレスを示す図である。図８に示す実行環境Ａでは、主実行部１２０と従実行部１４０とが、変数を記憶する領域を確保するアドレスを示している。変数ｓｅｇ１は、０ｘ１００〜０ｘ１０Ｆに、変数ｓｅｇ２は、０ｘ１１０〜０ｘ１１Ｆに配置されている。なお、変数ｄ、ｐ、ｃは図から省略してある。
また、図８に示す実行環境Ｂは、各記憶領域の配置アドレスを、実行環境Ａの記憶領域の配置アドレスに識別番号を加算して得られる仮想アドレスに変更した配置を行っている。この例では、変数ｓｅｇ１をその識別番号０ｘ１０、変数ｓｅｇ２をその識別番号０ｘ２０だけずらした結果、変数ｓｅｇ１は０ｘ１１０〜０ｘ１１Ｆに、変数ｓｅｇ２は０ｘ１３０〜０ｘ１３Ｆに配置されている。この配置は、従実行部１４０で被検査プログラムを実行して、ポインタ変数ｐに設定される仮想アドレスを算出する際に、想定している記憶領域の配置である。
【００５７】
このとき、図７の命令９２４によってアクセスされるアドレスは、実行環境Ａでは０ｘ１１０、実行環境Ｂでは０ｘ１３０を示す。このアドレスは、実行環境Ａ、実行環境Ｂで共にｓｅｇ２の記憶領域内を示す。このアドレスは、実行環境Ａ、実行環境Ｂに限られず、記憶領域の配置が変わっても必ずｓｅｇ２の記憶領域内の等しい相対位置を示す。更に、実行環境Ｂにおける仮想アドレスから実行環境Ａにおけるアドレスを減算した結果は、図７の命令９２４によってアクセスされる記憶領域すなわちｓｅｇ２の先頭アドレスの差０ｘ２０に必ず等しくなる性質がある。前述した実行環境Ｂの定義により、このアドレスの差は記憶領域に割り当てられた識別番号に等しく、各記憶領域の識別番号はユニークになるよう設定してあるため、実行環境Ｂと実行環境Ａにおけるアクセス先のアドレスから、プログラムが参照する記憶領域を特定することが可能である。これにより、命令９２４によるアクセスは、ｓｅｇ２へのアクセスであると解釈され、エラーを出力せずに処理が実行される。一方、命令９２６によるアクセスは、ｓｅｇ１へのアクセスであると解釈される。当該アクセスは、ｓｅｇ１のアドレス範囲を超えるため、エラーを出力する。
このように、本実施形態では、従実行部１４０が記憶領域の配置アドレスをずらす量として記憶領域の識別番号を用いるため、配置アドレスの差分として識別番号を取得することができる。
【００５８】
このように、本実施形態によれば、仮想アドレス算出部１４３が、当該記憶領域の識別番号とアドレス値とを足し合わせた仮想アドレス値を算出し、シミュレータ部１４１が、仮想アドレスに従う記憶領域の配置で被検査プログラムを実行した状態を再現し、減算部１５１が、仮想アドレス取得部１４４が取得した仮想アドレス値からアドレス取得部１２３が取得したアドレス値を減算する。これにより、被検査プログラムによってアクセスされる対象の記憶領域の識別番号を取得することができる。そして、判定部１５２は、アドレス取得部１２３が被検査プログラムの命令に従って取得したアドレス値が、減算部１５１が取得した識別番号が示す記憶領域の範囲内で有効であるか否かを判定することで不正メモリアクセスの検出を行う。これにより、不正メモリアクセス検出装置１００は、複雑な手順でメモリアクセス先のアドレスを計算するプログラムに対しても境界検査を実施することができる。
【００５９】
なお、本実施形態において、従実行部１４０がステップＳ３０９で実際にメモリアクセスを行うアドレスは、図８の実行環境Ｂに示した仮想アドレスではなく、同一の命令に従い主実行部１２０がアクセスする記憶領域のアドレスである。このように、従実行部１４０が、仮想アドレスではなく主実行部１２０と同一のアドレスに対してアクセスを行う理由を説明する。
【００６０】
仮に、従実行部１４０が記憶領域のアドレスを変更せずに実行環境Ｂに示す仮想アドレス配置に従いプログラムを実行する検査装置（仮の検査装置）を構成した場合、当該仮の検査装置において、各記憶領域の仮想配置アドレスが、プログラムが使用可能なアドレスの範囲内で互いに重複しない領域を適切に含む必要がある。これにより、各記憶領域に付与される識別番号の組み合わせに制約が生じる。例えば、図２に示す記憶領域配置に対して、ｓｅｇ１の識別番号を０ｘ２０、ｓｅｇ２の識別番号を０ｘ１０に設定した場合、ｓｅｇ１の仮想アドレスが０ｘ１２０−０ｘ１２Ｆ、ｓｅｇ２の仮想アドレスが０ｘ１２０−０ｘ１２Ｆとなる。このことは、実行環境Ｂにおいてｓｅｇ１とｓｅｇ２とが同一の記憶領域に置かれることを示すため、このような識別番号の設定は不適切となる。
【００６１】
図７に示す単純な被検査プログラムの例ではこの制約は重大な問題にならないが、一般の大規模なプログラムや、実行時に記憶領域の確保と解放を繰り返すプログラムを検査する場合、識別番号付与部１３２の構成を複雑化させ、また、検査実行に要するメモリ使用量を増大させるなどの問題が生じさせる。
【００６２】
これに対して、本実施形態による不正メモリアクセス検出装置１００の従実行部１４０は、実際に変数の値を格納する記憶領域のアドレスとして主実行部１２０が格納するアドレスを用いるため、各記憶領域に付与された識別番号の値によって変化せず、相互の重複も発生しない。このため、本実施形態による不正メモリアクセス検出装置１００では、各記憶領域に付与する識別番号を、前述した仮の検査装置よりも自由に設定することができる。このことは、識別番号付与部１３２の構成を複雑化させず、また、検査実行に要するメモリ使用量を増大させることなく、一般の大規模なプログラムや、記憶領域の確保と解放を繰り返すプログラムに対して、境界検査を実施できる効果があることを意味する。
【００６３】
以上、図面を参照してこの発明の一実施形態について詳しく説明してきたが、具体的な構成は上述のものに限られることはなく、この発明の要旨を逸脱しない範囲内において様々な設計変更等をすることが可能である。
例えば、本実施形態では、Ｃ言語を例として不正メモリアクセス検出装置１００の動作を説明したが、これに限られず、例えばＣ言語と同様にポインタ変数を用いるＣ＋＋言語や、アドレスの演算ができる機械語のプログラム等も同様の効果を得ることができる。
【００６４】
なお、本実施形態では、全てのメモリアクセスに対して仮想アドレスを用いた境界検査を行う例を説明したが、これに限られず、例えば、ポインタ変数が参照する記憶領域を追跡する従来の手法と本発明とを併用し、従来の手法で適切な検査が行うことができないメモリアクセス命令に関してのみ、本発明の境界検査手法を適用する構成としても、同様の効果を得ることができる。
【００６５】
上述の不正メモリアクセス検出装置１００は内部に、コンピュータシステムを有している。そして、上述した各処理部の動作は、プログラムの形式でコンピュータ読み取り可能な記録媒体に記憶されており、このプログラムをコンピュータが読み出して実行することによって、上記処理が行われる。ここでコンピュータ読み取り可能な記録媒体とは、磁気ディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ、半導体メモリ等をいう。また、このコンピュータプログラムを通信回線によってコンピュータに配信し、この配信を受けたコンピュータが当該プログラムを実行するようにしても良い。
【００６６】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。さらに、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組み合わせで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【符号の説明】
【００６７】
１００…不正メモリアクセス検出装置  １１０…プログラム記憶部  １２０…主実行部  １２１…実行部  １２２…アクセス部  １２３…アドレス取得部  １２４…メモリ  １３０…記憶領域管理部  １３１…メモリ情報処理部  １３２…識別番号付与部  １３３…メモリ情報記憶部  １４０…従実行部  １４１…シミュレータ部  １４２…アクセス部  １４３…仮想アドレス算出部  １４４…仮想アドレス取得部  １４５…メモリ  １５０…メモリアクセス検査部  １５１…減算部  １５２…判定部  １５３…エラー出力部
【図１】
2010287061.tif 000003
【図２】
2010287061.tif 000004
【図３】
2010287061.tif 000005
【図４】
2010287061.tif 000006
【図５】
2010287061.tif 000007
【図６】
2010287061.tif 000008
【図７】
2010287061.tif 000009
【図８】
2010287061.tif 000010
【図９】
2010287061.tif 000011