(57)【要約】【課題】メモリを確保せずに書き込みや読み込みが行われた場合のエラーを検出する。【解決手段】初期化時にヒープ領域２１を固有の値（例えば、オールＦ）で埋め、メモリ確保時に確保するメモリ領域が固有の値（オールＦ）であることを確認し、メモリ解放時に解放するメモリ領域に固有の値（オールＦ）を書き込む。これにより、メモリ領域を確保する前にヒープ領域２１に対してライトアクセスを行った場合のエラー、あるいは、メモリ領域を解放した後にヒープ領域２１に対してライトアクセスを行った場合のエラーを自動的に検出することが可能となる。【選択図】図１
2007323167.tif 000002
【特許請求の範囲】
【請求項１】
メモリの初期化時にヒープ領域を任意の値にし、前記メモリの確保時、及び前記メモリの解放後にそれぞれ前記ヒープ領域が前記任意の値になっているか否かを判別することにより、メモリリークを検出することを特徴とするメモリテスト方法。
【請求項２】
プログラム開始時にメモリのヒープ領域に対して固有の値を書き込み、
前記メモリの確保時に確保すべきアドレスの値を取得して前記固有の値と比較し、
前記メモリの解放時に解放すべき前記アドレスに対して前記固有の値を書き込み、
前記メモリの値を確認してエラーか否かを判別することを特徴とするメモリテスト方法。
【請求項３】
デバック手段により、メモリのヒープ領域へメモリブレークを設定し、
前記メモリの確保によって前記ヒープ領域のメモリブレークを削除し、
前記メモリの解放により前記ヒープ領域にブレークを設定することにより、メモリリークを検出することを特徴とするメモリテスト方法。
【請求項４】
メモリの解放時にヒープ領域の誤り訂正符号を算出し、
前記メモリのチェック時に前記ヒープ領域の誤り訂正符号を算出し、
前記メモリの解放時の前記誤り訂正符号と前記メモリチェック時の前記誤り訂正符号とを比較することにより、メモリリークを検出することを特徴とするメモリテスト方法。
【請求項５】
アドレス値を元に疑似乱数を生成し、
プログラム開始時に前記疑似乱数をメモリに書き込み、
前記メモリの確保時に確保すべきアドレスの値を取得して前記疑似乱数と比較し、
前記メモリの解放時に解放すべきアドレスに対して前記疑似乱数の値を書き込み、
前記メモリの値を確認してエラーか否かを判別することを特徴とするメモリテスト方法。
【請求項６】
プログラム開始時にメモリのスタック領域に対して固有の値を書き込み、
前記スタック領域内にどこまで前記固有の値が格納されているか否かを確認し、使用されたスタックサイズを通知することにより、メモリリークを事前に防止することを特徴とするメモリテスト方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアのメモリアクセスを自動的に監視するためのソフトウェアテストであるメモリテスト方法に関し、特に、メモリアクセス動作をプログラムに監視させ、メモリリーク（即ち、使用可能なメモリ領域が徐々に減少していく現象）を自動的に検出するメモリテスト方法に関するものである。
【背景技術】
【０００２】
一般にメモリリーク等のメモリアロケーションに関する不具合は、コンピュータシステムのハングアップ（コンピュータ利用中に動作が異常になって入力操作を受け付けなくなる状態）等の深刻な事態の原因になることがある。このためにこうした不具合を検出するための手法が必要になり、例えば、次のような文献等で提案されている。
【０００３】
【特許文献１】特開２０００−２９３４００号公報
【０００４】
この特許文献１に記載されているように、コンピュータシステムのオペレーティング・システム（以下「ＯＳ」という。）上で実行されるアプリケーションプログラム（以下「ＡＰ」という。）は、ＯＳの機能の１つであるシステムコールやＡＰインタフェース等を介して、所定のメモリ領域を動的に確保し、確保したメモリ領域を使用して情報処理等を行う。情報処理等を終了すると、ＡＰは確保したメモリ領域を解放してＯＳに返却するが、この際、ＡＰに何らかのバグがあってメモリ領域の解放が行われないと、メモリリークが発生する。
【０００５】
メモリリークの発生する主な原因となるのは、ヒープ領域（プログラムが使用可能なメモリ領域であって用途に関係なく自由に確保することが可能な多量のメモリ領域）からメモリを正しく確保することができなかった場合や、確保したメモリを解放することを忘れた場合（例えば、ＡＰ等が不要となったメモリ領域を適切に解放しない、つまりシステムに返還しない場合）である。
【０００６】
このようなメモリリークが発生すると、使用されないメモリ領域がメモリ空間に残ってしまい、ＯＳがメモリ空間に残ったメモリ領域を他のＡＰに割り当てることができなくなり、システム全体として使用可能なメモリの総量が減少する。使用可能なメモリの総量が限界まで減少すると、ＡＰ等が異常終了してしまう。そのため、ＡＰの開発において、メモリリークを発生させるようなバグを適切に取り除くように、テスト工程にてデバッグされる。
【０００７】
ところが、メモリ領域の解放漏れを検出し、この要因を特定することが困難であったので、これを解決するために、特許文献１のメモリリーク検出方法では、メモリリークを検出すべく、メモリ領域を確保する際にダンプ情報を管理テーブルに格納し、メモリ領域の解放の際にダンプ情報を削除し、メモリ解放後、ダンプ情報が記録されているか否かを判別することで、メモリリークが発生しているか否かを判別している。つまり、メモリ解放を正常に行っているか否かを監視（ウォッチング）することで、メモリリークを検出している。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
しかしながら、従来のメモリテスト方法では、メモリの確保、解放をウォッチングすることでメモリリークを検出しているので、プログラムの記述誤り等により、確保されていないヒープ領域や、解放されたヒープ領域に対してアドレスを直接参照して書き込みや読み込みを行うような処理が行われた場合、つまりメモリを確保せずに書き込みや読み込みが行われた場合、エラーを検出することができない。
【課題を解決するための手段】
【０００９】
本発明のメモリテスト方法では、メモリの初期化時にヒープ領域を任意の値にし、前記メモリの確保時、及び前記メモリの解放後にそれぞれ前記ヒープ領域が前記任意の値になっているか否かを判別することにより、メモリリークを検出するようにしている。
【発明の効果】
【００１０】
本発明によれば、メモリ領域を確保する前にヒープ領域等に対してライトアクセスを行った場合のエラー、あるいは、メモリ領域を解放した後にヒープ領域等に対してライトアクセスを行った場合のエラーを自動的に検出したり、あるいはそのエラーを事前に防止することが可能となる。
【発明を実施するための最良の形態】
【００１１】
メモリテストシステムにおいて、プログラム開始時にメモリのヒープ領域に対して固有の値を書き込み、前記メモリの確保時に確保すべきアドレスの値を取得して前記固有の値と比較し、前記メモリの解放時に解放すべき前記アドレスに対して前記固有の値を書き込み、前記メモリの値を確認してエラーか否かを判別する。
【実施例１】
【００１２】
（実施例１の構成）
図１は、本発明の実施例１を示すメモリテストシステムの概略の構成図である。
このメモリテストシステムでは、システム全体をプログラム制御するプロセッサ（例えば、中央処理装置、以下これを「ＣＰＵ」という。）を有し、このＣＰＵ１に、バス２を介してメモリの読み出し専用メモリ（以下「ＲＯＭ」という。）領域１０と随時読み書き可能なメモリ（以下「ＲＡＭ」という。）領域２０とが接続されている。
【００１３】
ＲＯＭ領域１０には、メモリテストの対象となるメモリテスト対象プログラム１１が展開されている。メモリテスト対象プログラム１１は、メモリテストモジュール１１ａを含んでおり、このメモリテストモジュール１１ａがヒープ領域へのメモリ確保・解放を監視する機能を有している。ＲＡＭ領域２０には、ヒープ領域２１を確保する。
【００１４】
（実施例１のメモリテスト方法）
図２（１）〜（５）は、図１のメモリテスト方法の処理手順を示す図であり、同図（１）は初期状態を示す図、同図（２）はメモリ確保した時の状態を示す図、同図（３）はメモリに対して書き込んだ時の状態を示す図、同図（４）はメモリ解放した時の状態を示す図、及び同図（５）はメモリリーク判定時状態を示す図である。
【００１５】
このメモリテスト方法では、図２（１）の初期化処理において、ＣＰＵ１の制御により、メモリテスト対象プログラム１１が動作すると、先ず、メモリテストモジュール１１ａは、ヒープ領域全体を、任意の値（例えば、オールＦの固有の値）をセットして初期化する。
【００１６】
次に、図２（２）、（３）のメモリ確保を判定する処理において、ヒープ領域２１から使用するメモリ領域３０を確保する時には、初期化状態を示す固有の値（オールＦ）であるかを確認する。確保したメモリ領域３１が固有の値（オールＦ）でなかった場合、ユーザにエラーを返す（通知する）。固有の値（オールＦ）であれば、メモリ領域３１を確保する。
【００１７】
図２（４）、（５）のメモリ解放を判定する処理において、確保したメモリ領域３１を解放する時には、解放したメモリ領域３２に対して初期化時に設定した値（オールＦ）と同じ固有の値（オールＦ）をセットする。その後、メモリチェック時に、メモリテストモジュール１１ａは、ヒープ領域２１の値を調べる。初期化状態にセットした固有の値以外の値を発見したら、これはリークしたメモリ領域３３であるから、ユーザにエラーを通知する。
【００１８】
（実施例１の効果）
本実施例１によれば、初期化時にヒープ領域２１を固有の値（例えば、オールＦ）で埋め（図２（１））、メモリ確保時に確保するメモリ領域３１が固有の値（オールＦ）であることを確認し（図２（２））、メモリ解放時に解放するメモリ領域３２に固有の値（オールＦ）を書き込むようにしている（図２（４））。
【００１９】
これにより、メモリ領域３０を確保する前にヒープ領域２１に対してライトアクセスを行った場合のエラー、あるいは、メモリ領域３２を解放した後にヒープ領域２１に対してライトアクセスを行った場合のエラーを自動的に検出することが可能となる。
【実施例２】
【００２０】
（実施例２の構成）
図３は、本発明の実施例２を示すメモリテストシステムの概略の構成図であり、実施例１を示す図１中の要素と共通の要素には共通の符号が付されている。
【００２１】
このメモリテストシステムは、実施例１と同様に、ＲＯＭ領域１０とＲＡＭ領域２０を持っている。ＲＯＭ領域１０には、実施例１と異なるメモリテスト対象プログラム１１Ａが展開されている。ＲＡＭ領域２０には、実施例１と同様に、ヒープ領域２１を確保する。本実施例２では、実施例１のメモリテストモジュール１１ａに代えて、デバック手段（例えば、インサーキット・エミュレータ、これを以下「ＩＣＥ」という。）４０が設けられ、バス２に接続されている。ＩＣＥ４０は、ヒープ領域２１へのメモリ確保・解放を監視し、メモリアクセス要因のブレークの設定・解除を行う機能を有している。
【００２２】
（実施例２のメモリテスト方法）
図４（１）〜（３）は、図３のメモリテスト方法の処理手順を示す図であり、同図（１）はプログラム動作前の処理状態を示す図、同図（２）はメモリ確保時の処理状態を示す図、及び同図（３）はメモリ解放時の処理状態を示す図である。
【００２３】
このメモリテスト方法では、図４（１）の処理において、ＣＰＵ１の制御により、ＩＣＥ４０はヒープ領域２１の全体にメモリブレークを設定する。
【００２４】
次に、図４（２）の処理において、メモリテスト対象プログラム１１Ａが動作し、ヒープ領域２１から命令（例えば、Ｃ言語のメモリ確保命令malloc（）等）によりメモリ領域を確保する時には、ＩＣＥ４０へのシステムコールにより確保されたメモリ領域のメモリブレークを解除する。
【００２５】
その後、図４（３）の処理において、確保したメモリ領域を命令（例えば、Ｃ言語のメモリ解放命令free（）等）により解放する時には、ＩＣＥ４０へのシステムコールにより解放されたメモリ領域にメモリブレークを設定する。
【００２６】
（実施例２の効果）
本実施例２によれば、プログラム開始時にヒープ領域２１に対してメモリブレークを設定し（図４（１））、メモリ確保（malloc等）の時に確保するメモリ領域のメモリブレークを解除し（図４（２））、メモリ解放（free等）の時に解放するヒープ領域２１にメモリブレークを設定するようにしている（図４（３））。
【００２７】
これにより、メモリ領域を確保する前にヒープ領域２１に対してライト・リードアクセスを行った場合や、メモリ領域を解放した後にヒープ領域２１に対してライト・リードアクセスを行った場合にブレークが発生し、ライトアクセスによるメモリ破壊を検出することができ、あるいは、メモリ破壊が起きた個所の特定や、不正なデータリードを検出することができる。
【実施例３】
【００２８】
（実施例３の構成）
図５は、本発明の実施例３を示すメモリテストシステムの概略の構成図であり、実施例１を示す図１中の要素と共通の要素には共通の符号が付されている。
【００２９】
このメモリテストシステムは、実施例１と同様に、ＲＯＭ領域１０とＲＡＭ領域２０を持っている。ＲＯＭ領域１０には、メモリテスト対象プログラム１１が展開されており、このメモリテスト対象プログラム１１は、実施例１とは異なるメモリテストモジュール１１ｂを含んでいる。メモリテストモジュール１１ｂは、実施例１と同様のヒープ領域２１へのメモリ確保・解放を監視する機能の他に、ヒープ領域２１から誤り訂正符号（以下「ＣＲＣ」という。）値を算出する機能を持つ。ＲＡＭ領域２０には、ヒープ領域２１を確保すると共に、このヒープ領域２１とは別のＣＲＣ値を格納するＣＲＣ格納領域２２を持つ。
【００３０】
（実施例３のメモリテスト方法）
図６（１）、（２）は、図５のメモリテスト方法の処理手順を示す図であり、同図（１）はメモリ解放時の処理状態を示す図、及び同図（２）はメモリチェック時の処理状態を示す図である。
【００３１】
このメモリテスト方法では、図６（１）の処理において、ＣＰＵ１の制御により、メモリテスト対象プログラム１１が動作して、ヒープ領域２１からメモリ領域が確保され、使用される。メモリ領域が解放される時、ヒープ領域全体に対してＣＲＣ値を計算して、ＣＲＣ格納領域２２に格納する。
【００３２】
図６（２）の処理において、ヒープ領域全体に対してＣＲＣ値を計算し（処理(i)）、ＣＲＣ格納領域２２に格納されていたＣＲＣ値と比較する（処理(ii)）。比較結果が異なった場合、エラーをユーザに通知する。
【００３３】
（実施例３の効果）
本実施例３によれば、ヒープ領域２１に対してＣＲＣ値を算出し、プログラム終了時に再度算出したヒープ領域２１のＣＲＣ値と比較することによってヒープ領域２１に対してライトアクセスを行った場合のエラーを検出することが可能となる。しかも、ＣＲＣ値を用いているので、エラー検出の精度を向上できる。
【実施例４】
【００３４】
（実施例４の構成）
図７は、本発明の実施例４を示すメモリテストシステムの概略の構成図であり、実施例１を示す図１中の要素と共通の要素には共通の符号が付されている。
【００３５】
このメモリテストシステムは、実施例１と同様に、ＲＯＭ領域１０とＲＡＭ領域２０を持っている。ＲＯＭ領域１０には、実施例１と同様のメモリテスト対象プログラム１１が展開されているが、このメモリテスト対象プログラム１０は、実施例１と異なるメモリテストモジュール１１ｃを含んでいる。メモリテストモジュール１１ｃは、アドレスを元に任意の値（例えば、疑似乱数）を発生させるモジュールを有する共に、ＲＡＭ領域２０内のヒープ領域２１へのメモリ確保・解放を監視する機能を有している。
【００３６】
（実施例４のメモリテスト方法）
図８（１）〜（４）は、図７のメモリテスト方法の処理手順を示す図であり、同図（１）は初期状態の処理を示す図、同図（２）はメモリ確保時の処理状態を示す図、同図（３）はメモリ解放時の処理状態を示す図、及び同図（４）はメモリチェック時の処理状態を示す図である。
【００３７】
このメモリテスト方法では、図８（１）の処理において、ＣＰＵ１の制御により、メモリテスト対象プログラム１１が動作すると、先ず、メモリテストモジュール１１ｃは、ヒープ領域２１のアドレスを元にして疑似乱数を発生させ、この疑似乱数を用いてアドレス毎に固有の値を設定してヒープ領域２１を初期化する。
【００３８】
次に、図８（２）の処理において、ヒープ領域２１からメモリ領域を確保する時には、初期化状態であるアドレスより算出した疑似乱数からなる固有の値と同じであるかを確認する。同じ値でなかった場合、ユーザにエラーを通知する。同じ値であればメモリ領域の確保を行う。
【００３９】
図８（３）の処理において、メモリ確保した領域を解放する時には、解放したメモリ領域に対して初期化時に設定した固有の値と同じアドレスを元に算出した疑似乱数を用いて、アドレス毎に固有の値を設定（セット）する。
【００４０】
その後、図８（４）の処理において、メモリチェック時に、メモリテストモジュール１１ｃは、アドレスを元に疑似乱数を用いてアドレス毎に固有の値を算出し、ヒープ領域２１の値と比較する。初期化状態にセットした疑似乱数からなる固有の値以外の値を発見したら、ユーザにエラーを通知する。
【００４１】
（実施例４の効果）
本実施例４によれば、初期化時に、ヒープ領域２１をアドレスを元にした疑似乱数からなる固有の値で埋め、メモリ確保の時に、確保するメモリ領域がアドレスを元にした疑似乱数からなる固有の値であることを確認し、メモリ解放時に、解放するメモリ領域に対してアドレスを元にした疑似乱数からなる固有の値で書き込むようにしている。
【００４２】
これにより、メモリ確保する前にヒープ領域２１に対してライトアクセスを行った場合のエラーや、メモリ解放した後にヒープ領域２１に対してライトアクセスを行った場合のエラーを検出することが可能となる。しかも、ライトアクセスしたかを判断するための値が固定値でないために、実施例１より検出の精度を上げることができる。
【実施例５】
【００４３】
（実施例５の構成）
図９は、本発明の実施例５を示すメモリテストシステムの概略の構成図であり、実施例１を示す図１中の要素と共通の要素には共通の符号が付されている。
【００４４】
このメモリテストシステムは、実施例１と同様に、ＲＯＭ領域１０とＲＡＭ領域２０を持っている。ＲＯＭ領域１０には、実施例１と同様に、メモリテスト対象プログラム１１が展開されており、このメモリテスト対象プログラム１１は、メモリテストモジュール１１ｄを含んでいる。ＲＡＭ領域２０には、実施例１の多量のメモリ容量を有するヒープ領域２１に代えて、少量のメモリ容量を有するスタック（ＳＴＡＣＫ）領域２３が確保されている。
【００４５】
（実施例５のメモリテスト方法）
図１０（１）、（２）は、図９のメモリテスト方法の処理手順を示す図であり、同図（１）はメモリの初期状態を示す図、及び同図（２）はメモリチェック時の処理状態を示す図である。
【００４６】
このメモリテスト方法では、図１０（１）の処理において、ＣＰＵ１の制御により、テスト対象プログラム１１が動作すると、先ず、メモリテストモジュール１１ｄはスタック領域全体を、任意の値（例えば、オールＦの固有の値）を設定（セット）して初期化する。
【００４７】
その後、図１０（２）の処理において、メモリチェック時に、メモリテストモジュール１１ｄは、スタック領域２３をチェックし、固有の値（オールＦ）でない値がどこまであるかを確認することによって、スタックサイズがどのくらい使用されたかを測定（チェック）する。
【００４８】
（実施例５の効果）
本実施例５によれば、初期化時にスタック領域２３を固有の値（オールＦ）で埋め、メモリチェック時にどこまで固有の値であるかを確認しているので、プログラムスタックのサイズを得ることが可能となり、スタック領域２３に対するライトアクセスによって生じるエラーを事前に防止できる。
【００４９】
（変形例）
本発明は、図示の実施例１〜５に限定されず、種々の利用形態や変形が可能である。この利用形態や変形例としては、例えば、次の（ａ）〜（ｃ）のようなものがある。
【００５０】
（ａ）  実施例２では、ＩＣＥ４０を例に挙げたが、シミュレータ等のデバッグ環境で適用可能である。
【００５１】
（ｂ）  各実施例１〜５を組み合わせて複合的に利用することにより、２重チェック等を行わせることも可能である。
【００５２】
（ｃ）  実施例１〜５のメモリテストシステムは、図示以外の他の回路構成に変更しても良い。
【図面の簡単な説明】
【００５３】
【図１】本発明の実施例１を示すメモリテストシステムの概略の構成図である。
【図２】図１のメモリテスト方法の処理手順を示す図である。
【図３】本発明の実施例２を示すメモリテストシステムの概略の構成図である。
【図４】図３のメモリテスト方法の処理手順を示す図である。
【図５】本発明の実施例３を示すメモリテストシステムの概略の構成図である。
【図６】図５のメモリテスト方法の処理手順を示す図である。
【図７】本発明の実施例４を示すメモリテストシステムの概略の構成図である。
【図８】図７のメモリテスト方法の処理手順を示す図である。
【図９】本発明の実施例５を示すメモリテストシステムの概略の構成図である。
【図１０】図９のメモリテスト方法の処理手順を示す図である。
【符号の説明】
【００５４】
１      ＣＰＵ
１０      ＲＯＭ領域
１１，１１Ａ      メモリテスト対象モジュール
１１ａ，１１ｂ，１１ｃ，１１ｄ      メモリテストモジュール
２０      ＲＡＭ領域
２１      ヒープ領域
２２      ＣＲＣ格納領域
２３      スタック領域
４０      ＩＣＥ
【図１】
2007323167.tif 000003
【図２】
2007323167.tif 000004
【図３】
2007323167.tif 000005
【図４】
2007323167.tif 000006
【図５】
2007323167.tif 000007
【図６】
2007323167.tif 000008
【図７】
2007323167.tif 000009
【図８】
2007323167.tif 000010
【図９】
2007323167.tif 000011
【図１０】
2007323167.tif 000012