(57)【要約】【課題】    動的メモリを解放した場合にポインタ領域を適切に処理する。【解決手段】    本発明のメモリ管理装置は、アプリケーションプログラムの処理におけるヒープメモリに関連するポインタ領域の操作を通知する通知処理をアプリケーションプログラムに追加する翻訳手段と、通知処理からの通知を受け取り、通知を基に、ヒープメモリの解放に伴うポインタ領域の操作を記録し、解放されたヒープメモリに対応するポインタ領域を無効とするメモリ管理手段とを含む。【選択図】      図２
2014052753.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションプログラムの処理におけるヒープメモリに関連するポインタ領域の操作を通知する通知処理を前記アプリケーションプログラムに追加する翻訳手段と、
前記通知処理からの通知を受け取り、前記通知を基に、ヒープメモリの解放に伴うポインタ領域の操作を記録し、解放されたヒープメモリに対応するポインタ領域を無効とするメモリ管理手段とを
含むメモリ管理装置。
【請求項２】
前記メモリ管理部は、
ポインタ領域を初期化するポインタ領域初期化手段と、
ポインタ領域の操作に関する情報を記録するポインタ操作記録手段と、
前記通知を基に、ポインタ領域の操作を前記ポインタ操作記録手段に記録し、
前記通知がヒープメモリの宣言に関する場合、前記ポインタ領域初期化手段を基に前記対応するポインタ領域を初期化し、
前記通知がヒープメモリの解放に関する場合、前記ポインタ操作記録手段に解放されたヒープメモリに対応するポインタ領域の無効を記録し、前記ポインタ領域初期化手段を基に前記対応するポインタ領域を初期化するポインタ領域管理手段とを
含む請求項１に記載のメモリ管理装置。
【請求項３】
前記翻訳部は、
ポインタ領域を宣言する処理に前記通知処理を追加するポインタ領域登録手段と、
ポインタ領域を変更する処理に前記通知処理を追加するポインタ領域変更記録手段と、
ヒープメモリを解放する処理とヒープメモリの範囲を変更する処理に前記通知処理を追加するヒープアドレス通知手段とを
含む請求項１又は請求項２に記載のメモリ管理装置。
【請求項４】
前記翻訳部は、
スタックメモリを解放する処理に前記通知処理を追加するスタック領域通知手段
をさらに含む請求項３に記載のメモリ管理装置。
【請求項５】
前記メモリ管理手段が記録した情報を基に、ポインタ領域の操作の不正アクセスを特定する不正アクセス特定手段
をさらに含む請求項１乃至請求項４のいずれか１項に記載のメモリ管理装置。
【請求項６】
アプリケーションプログラムの処理におけるヒープメモリに関連するポインタ領域の操作を通知する通知処理を前記アプリケーションプログラムに追加し、
前記通知処理からの通知を受け取り、前記通知を基に、ヒープメモリの解放に伴うポインタ領域の操作を記録し、解放されたヒープメモリに対応するポインタ領域を無効とする
メモリ管理方法。
【請求項７】
ポインタ領域を追加する処理に前記通知処理を追加し、
ポインタ領域を変更する処理に前記通知処理を追加し、
ヒープメモリを解放する処理とヒープメモリの範囲を変更する処理とに前記通知処理を追加する
請求項６に記載のメモリ管理装置。
【請求項８】
アプリケーションプログラムの処理におけるヒープメモリに関連するポインタ領域の操作を通知する通知処理を前記アプリケーションプログラムに追加する処理と、
前記通知処理からの通知を受け取り、前記通知を基に、ヒープメモリの解放に伴うポインタ領域の操作を記録する処理と、解放されたヒープメモリに対応するポインタ領域を無効とする処理と
をコンピュータに実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、メモリ管理装置に関し、特に、動的に確保する記憶領域の管理に関する。
【背景技術】
【０００２】
中央処理装置（ＣＰＵ：Central Processing Unit）を含む情報処理装置は、プログラムを実行するときに、メモリなどの記憶領域を動的に確保する。このように動的に確保する記憶領域は、ヒープメモリ又はヒープ領域と言う。
【０００３】
ヒープメモリは、静的なメモリと異なり、メモリの用途の自由度を高くし、高度なプログラムやオブジェクト指向プログラムなどで欠かすことのできない重要な機能である。
【０００４】
一般的な情報処理装置では、情報処理装置で動作するオペレーティングシステム（ＯＳ：Operation System）が、ヒープメモリをプログラムに提供する。しかし、ＯＳは、提供後のヒープメモリを管理しない。プログラム開発者が開発したプログラムが、プログラム内で使用するヒープメモリを管理する必要がある。
【０００５】
プログラムが実施するヒープメモリの管理は、使用中のヒープメモリの管理（一般的にポインタを用いる）に加え、不要となったヒープメモリの解放が必要である。
【０００６】
なお、ヒープメモリは、予約済みのメモリプールとして実現されていることが多い。また、一度確保されたヒープメモリは、プログラムでの解放後、ＯＳ側が未使用領域として管理する。そして、プログラムからヒープメモリの確保が要求された場合、ＯＳは、解放後に未使用とした領域を、新なヒープメモリとして提供する。
【０００７】
このように、ヒープメモリは、同じアドレスでも、プログラムの処理の流れに従い、異なる用途のメモリとなる場合が生じる。
【０００８】
そのため、解放したヒープメモリのアドレスを誤って参照すると、プログラムは、動作不正やメモリのデータ破壊を起こす。
【０００９】
また、ヒープメモリの容量は、上限がある。プログラムが、使用しなくなったヒープメモリを適切に解放しないと、ＯＳは、提供するヒープメモリがなくなってしまう。そのため、長時間動作するプログラムは、ヒープメモリ不足を発生させないために、適切にヒープメモリを解放する必要がある。
【００１０】
解放したヒープメモリを処理する機能として、ガベージコレクション（ＧＣ：Garbage Collection）がある。近年、ＧＣを備えたヒープメモリが用いられている。しかし、ＧＣを備えたヒープメモリは、高価であり、特定の用途に限定されている。また、プログラムにＣＧ機能を実装することは、難易度が高いため、一般的には実施されていない。
【００１１】
そのため、プログラム開発者は、ヒープメモリの管理について、プログラム開発の各段階で、確認作業を実施している。
【００１２】
例えば、開発者は、プログラムの仕様検討時やソースのコーディング段階での机上デバッグ、プログラムのテスト及びデバッグ作業を繰り返して、ヒープメモリの管理のエラーを除去している。
【００１３】
このように、ヒープメモリの管理は、プログラムの開発者にとって、大きな負担となっている。特に、不正なポインタのアクセスが原因となる動作不正やメモリ破壊が発生した場合、その原因の特定及びプログラムの正しい修正は、開発者の大きな負担となっている。
【００１４】
近年、プログラムの不正動作を検出する装置が、幾つか提案された。しかし、このような装置は、高価である。また、このような装置を使用するためには、専門的な知識が必要である。そのため、一般的な開発現場は、まだ、簡単には導入できない。
【００１５】
そこで、ヒープメモリの動作を検証するプログラムが、提案されている（例えば、特許文献１を参照）。
【先行技術文献】
【特許文献】
【００１６】
【特許文献１】特開２００８−２７６７６３
【発明の概要】
【発明が解決しようとする課題】
【００１７】
特許文献１に記載の検出方法は、ヒープメモリに関するポインタの不正を検出するものである。不正検出のため、特許文献１に記載の検出方法は、プログラムソースコードに、ポインタの内容を確認するＡＰＩ関数を組み込む。
【００１８】
つまり、特許文献１に記載の検出方法は、ポインタの参照を用いて不正を検出する発明である。
【００１９】
しかし、前述のとおり、ヒープメモリは、プログラムの動作に基づき、解放される。そして、ヒープメモリを解放した場合、プログラムは、プログラムが解放したヒープメモリに対するポイントを使用すると、エラーを発生する。したがって、ヒープメモリを解放した場合、プログラムは、解放したヒープメモリに対するポインタを処理する必要がある。
【００２０】
つまり、特許文献１に記載の検出方法は、ヒープメモリを解放した場合のポインタを処理できないという問題点があった。
【００２１】
本発明の目的は、上記問題点を解決し、ヒープメモリを解放した場合に、ポインタを適切に処理できるメモリ管理装置、及び、メモリ管理方法を提供することにある。
【課題を解決するための手段】
【００２２】
本発明のメモリ管理装置は、アプリケーションプログラムの処理におけるヒープメモリに関連するポインタ領域の操作を通知する通知処理を前記アプリケーションプログラムに追加する翻訳手段と、前記通知処理からの通知を受け取り、前記通知を基に、ヒープメモリの解放に伴うポインタ領域の操作を記録し、解放されたヒープメモリに対応するポインタ領域を無効とするメモリ管理手段とを含む。
【００２３】
本発明のメモリ管理方法は、アプリケーションプログラムの処理におけるヒープメモリに関連するポインタ領域の操作を通知する通知処理を前記アプリケーションプログラムに追加し、前記通知処理からの通知を受け取り、前記通知を基に、ヒープメモリの解放に伴うポインタ領域の操作を記録し、解放されたヒープメモリに対応するポインタ領域を無効とする。
【００２４】
本発明のプログラムは、アプリケーションプログラムの処理におけるヒープメモリに関連するポインタ領域の操作を通知する通知処理を前記アプリケーションプログラムに追加する処理と、前記通知処理からの通知を受け取り、前記通知を基に、ヒープメモリの解放に伴うポインタ領域の操作を記録する処理と、解放されたヒープメモリに対応するポインタ領域を無効とする処理とをコンピュータに実行させる。
【発明の効果】
【００２５】
本発明によれば、ヒープメモリを解放した場合に、ポインタを適切に処理できる。
【図面の簡単な説明】
【００２６】
【図１】図１は、本発明における第１の実施形態に係るメモリ管理装置を含む情報処理システムの一例を示すブロック図である。
【図２】図２は、第１の実施形態に係るメモリ管理装置の構成の一例を示すブロック図である。
【図３】図３は、第１の実施形態に係るポインタ領域の情報の一例を示す図である。
【図４】図４は、第１の実施形態に係るポインタ領域の変更に関する情報の一例を示す図である。
【図５】図５は、第１の実施形態の変形例に係るメモリ管理装置の構成の一例を示すブロック図である。
【図６】図６は、第１の実施形態の変形例に係るメモリ管理装置の構成の一例を示すブロック図である。
【図７】図７は、第１の実施形態の変形例に係るメモリ管理装置の構成の一例を示すブロック図である。
【発明を実施するための形態】
【００２７】
次に、本発明の実施形態について図面を参照して説明する。
【００２８】
なお、各図面は、本発明の実施形態を説明するものである。そのため、本発明は、各図面の記載に限られるわけではない。また、各図面の同様の構成には、同じ番号を付し、その繰り返しの説明は、省略する場合がある。
【００２９】
（第１の実施形態）
図１は、本発明における第１の実施形態に係るメモリ管理装置２０を含む情報処理システム６０の構成の一例を示すブロック図である。
【００３０】
情報処理システム６０は、ＣＰＵ１０と、メモリ管理装置２０と、メモリ部３０と、ＲＯＭ（Read Only Memory）４０と、内部記憶装置５０とを含む。
【００３１】
ＲＯＭ４０は、情報処理システム６０で用いる固定データや初期化プログラム（ＩＰＬ：Initial Program Loader）を含む。
【００３２】
メモリ部３０は、ＣＰＵ１０が使用するメモリである。
【００３３】
内部記憶装置５０は、情報処理システム６０の長期的に保存するデータやプログラムを保存する。
【００３４】
ＣＰＵ１０は、情報処理システム６０の処理を実施する。
【００３５】
例えば、ＣＰＵ１０は、ＲＯＭ４０のＩＰＬに基づき、内部記憶装置５０からＯＳ３１０を読み出し、メモリ部３０に保存し、ＯＳ３１０に基づく動作を開始する（起動する）。
【００３６】
ＯＳ３１０での動作を起動後、ＣＰＵ１０は、利用者の指示などを基に、アプリケーションプログラム３２０を内部記憶装置５０からメモリ部３０に読み出し、実行する。
【００３７】
ＣＰＵ１０は、アプリケーションプログラム３２０を実行の際に、必要に応じて、メモリ部３０上に、静的メモリ３３０と、スタックメモリ３４０と、ヒープメモリ３５０とを確保して使用する。
【００３８】
本実施形態のメモリ管理装置２０は、ヒープメモリ３５０を含むメモリ部３０を管理し、動的に確保されたメモリに関する動作を管理する。特に、メモリ管理装置２０は、ヒープメモリ３５０の解放に伴うポインタの管理を実施する。
【００３９】
なお、ポインタは、１つとは限らず、一般的に複数宣言される。複数宣言された場合、ポインタは、記憶領域の所定の範囲（ポインタ領域）を占有する。そのため、以下、１つ場合を含め「ポインタ領域」として説明する。
【００４０】
メモリ管理装置２０ついて、図面を参照して、更に説明する。
【００４１】
図２は、本実施形態のメモリ管理装置２０の構成の一例を示すブロック図である。
【００４２】
メモリ管理装置２０は、翻訳部２１０と、メモリ管理部２２０と、不正アクセス特定部２３０とを含む。
【００４３】
まず、翻訳部２１０について説明する。
【００４４】
翻訳部２１０は、図示しないコンパイラが、ソース原文（ソースコードやソースファイル）を基にアプリケーションプログラム３２０を作成（コンパイル）する際に、アプリケーションプログラム３２０に、メモリ管理部２２０へ通知する仕組みを組み込む。より具体的には、翻訳部２１０は、アプリケーションプログラム３２０に、ポインタ領域の操作に対する通知処理を追加する。
【００４５】
そのため、翻訳部２１０は、ポインタ領域登録部２１１と、ポインタ領域変更記録部２１２と、ヒープアドレス通知部２１３と、スタック領域通知部２１４とを含む。
【００４６】
ポインタ領域登録部２１１は、アプリケーションプログラム３２０のポインタ領域を宣言する部分に、使用開始するポインタ領域の情報をメモリ管理部２２０に登録（通知）する処理（以下、「ポインタ領域登録処理」と言う）を追加する。なお、ポインタ領域の宣言は、ポインタ領域の確保と言われる場合もある。
【００４７】
アプリケーションプログラム３２０で用いられるポインタ領域は、一般的に、次のような種類がある。
【００４８】
（１）静的メモリ３３０に宣言されたポインタ領域：アプリケーションプログラム３２０の開始時に宣言されることが多い。
【００４９】
（２）スタックメモリ３４０に宣言されたポインタ領域：一般的に、関数を呼び出すときに、ローカル変数や引数として宣言されることが多い。
【００５０】
（３）ヒープメモリ３５０に宣言されたポインタ領域：ヒープメモリ３５０確保時に宣言される。
【００５１】
ポインタ領域登録部２１１は、アプリケーションプログラム３２０のポインタ領域を登録する処理に、ポインタ領域登録処理を追加する。ただし、ポインタ領域登録部２１１は、上記の３種類の全てにポインタ領域登録処理を追加する必要はない。例えば、静的メモリ３３０は、アプリケーションプログラム３２０の動作中に解放されることがない。そのため、ポインタ領域登録部２１１は、静的メモリ３３０で用いられるポインタ領域にポインタ領域登録処理を追加しなくても良い。
【００５２】
図３は、メモリ管理部２２０に通知するポインタ領域の情報の一例を表形式で示した図である。
【００５３】
図３に一例として示すポインタ領域の情報は、ポインタ名と、ソース原文名と、行番号と、アドレス情報と、状態とを含む。
【００５４】
ポインタ名は、宣言されたポインタ領域の名称である。
【００５５】
ソース原文名は、コンパイラがコンパイルしているソース原文の名称である。
【００５６】
行番号は、ソース原文でポインタ領域が宣言された行番号である。
【００５７】
アドレス情報は、ポインタ領域が参照するメモリのアドレス情報である。
【００５８】
状態は、宣言されたポインタ領域の状態を示す情報である。例えば、ポインタが宣言された場合、状態は、「生成」となる。
【００５９】
図２を用いた説明に戻る。
【００６０】
ポインタ領域変更記録部２１２は、アプリケーションプログラム３２０のポインタ領域の内容を変更する処理に、ポインタ領域の変更に関する情報をメモリ管理部２２０に通知する処理（以下、「ポインタ領域変更通知処理」と言う）を追加する。
【００６１】
なお、ポインタ領域変更記録部２１２は、ポインタ領域登録部２１１が登録するポインタ領域に対応して動作する。そのため、例えば、ポインタ領域登録部２１１が、静的メモリ３３０に処理を追加しない場合、ポインタ領域変更記録部２１２は、静的メモリ３３０における変更に、処理を追加しない。
【００６２】
図４は、メモリ管理部２２０に通知するポインタ領域の変更に関する情報の一例を表形式で示した図である。
【００６３】
図４に一例として示すポインタ領域の変更に関する情報は、例えば、ソース原文名と、行番号と、スレッドの識別子（ＩＤ：Identifier）と、状態とを含む。
【００６４】
ソース原文名と行番号は、図３と同様である。
【００６５】
スレッドＩＤは、アプリケーションプログラム３２０において、ポインタ領域を変更（操作）したスレッドのＩＤである。
【００６６】
状態は、図３の状態を同様である。例えば、ポインタ領域に値を設定した場合、状態は、「設定」となる。
【００６７】
図２を用いた説明に戻る。
【００６８】
ヒープアドレス通知部２１３は、アプリケーションプログラム３２０のヒープメモリ３５０の解放する処理に、ヒープメモリ３５０の解放をメモリ管理部２２０に通知する処理（以下、「ヒープメモリ解放通知処理」と言う）を追加する。さらに、ヒープアドレス通知部２１３は、アプリケーションプログラム３２０のヒープメモリ３５０の領域の大きさを変更する処理に、ヒープメモリ３５０の領域の大きさの変更に関する情報をメモリ管理部２２０に通知する処理（以下、「ヒープメモリ範囲変更通知処理」と言う）を追加する。
【００６９】
以下、「ヒープメモリ解放通知処理」と「ヒープメモリ範囲変更通知処理」とを合わせて「ヒープメモリ変更通知処理」と言う。
【００７０】
なお、ヒープメモリ３５０の解放は、ヒープメモリ３５０の範囲を「０」に変更することと同様である。そのため、ヒープアドレス通知部２１３は、「ヒープメモリ解放通知処理」と「ヒープメモリ範囲変更通知処理」とを区別せず、「ヒープメモリ変更通知処理」として実施しても良い。
【００７１】
スタック領域通知部２１４は、アプリケーションプログラム３２０のスタックメモリ３４０を操作する処理に、スタックメモリ３４０の操作に関する情報をメモリ管理部２２０に通知する処理（以下、「スタック操作通知処理」と言う）を追加する。
【００７２】
なお、既に説明したとおり、本実施形態の翻訳部２１０は、スタックメモリ３４０を確保する場合、及び、ヒープメモリ３５０を確保する場合、ポインタ領域登録部２１１がポインタ領域に関する情報を通知する処理を追加する。
【００７３】
そのため、ヒープアドレス通知部２１３は、ヒープメモリ３５０の解放時及び変更時に、メモリ管理部２２０に通知する処理を追加すればよい。
【００７４】
同様に、スタック領域通知部２１４は、スタックメモリ３４０を解放する処理（例えば、呼び出された関数から読み出し元に戻る場合）に「スタック操作通知処理」を追加すれば良い。
【００７５】
ただし、翻訳部２１０の構成は、これに限る必要はない。翻訳部２１０は、各メモリに対する構成を備えても良い。例えば、翻訳部２１０は、ヒープメモリ３５０を処理する処理部を備えてもよい。そして、そのヒープメモリ３５０を処理する処理部が、ヒープメモリ３５０にポインタ領域を宣言する処理にポインタ領域の登録の通知処理を追加し、ヒープメモリ３５０の解放の処理にヒープメモリ解放通知処理を追加しても良い。
【００７６】
次にメモリ管理部２２０について説明する。
【００７７】
メモリ管理部２２０は、翻訳部２１０がアプリケーションプログラム３２０に組み込んだ仕組み（通知処理）からの通知を基に、ポインタ領域を管理する。
【００７８】
そのため、メモリ管理部２２０は、ポインタ領域管理部２２１と、ポインタ領域初期化部２２２と、ポインタ領域操作記録部２２３とを含む。
【００７９】
ポインタ領域管理部２２１は、翻訳部２１０が組み込んだ各処理からの通知を基に、ポインタ領域の情報を管理する。
【００８０】
ポインタ領域初期化部２２２は、ポインタ領域管理部２２１の指示を基に、ポインタ領域を初期化する。
【００８１】
ポインタ領域操作記録部２２３は、ポインタ領域管理部２２１の指示を基に、ポインタ領域の操作（状態の変更）を記憶する。
【００８２】
このように、本実施形態のメモリ管理部２２０は、ポインタ領域管理部２２１が、中心となって、ポインタ領域に関する処理を実行する。
【００８３】
そのため、ポインタ領域管理部２２１の動作を中心にメモリ管理部２２０について更に詳細に説明する。
【００８４】
ポインタ領域管理部２２１は、翻訳部２１０が組み込んだ各処理からの通知を受け取り、ポインタ領域を管理する。これらの処理を、翻訳部２１０が組み込んだ各処理に対応して説明する。
【００８５】
まず、「ポインタ領域登録処理」に対応する動作を説明する。
【００８６】
「ポインタ領域登録処理」からの通知を受け取ると、ポインタ領域管理部２２１は、受け取ったポインタ領域の情報をポインタ領域操作記録部２２３に記録（登録）する。さらに、ポインタ領域管理部２２１は、ポインタ領域初期化部２２２に指示を出し、登録したポインタ領域を初期化する。ポインタ領域管理部２２１は、初期化後、初期化済みであることを、ポインタ領域操作記録部２２３に記録しても良い。
【００８７】
次に、「ポインタ領域変更通知処理」に対応する動作を説明する。
【００８８】
「ポインタ領域変更通知処理」からポインタ領域の変更に関する通知を受けと、ポインタ領域管理部２２１は、この通知を基に、ポインタ領域操作記録部２２３に変更（操作）を記録する。
【００８９】
次に、「ヒープメモリ変更通知処理」に対応する動作を説明する。
【００９０】
なお、「ヒープメモリ変更通知処理」は、「ヒープメモリ解放通知処理」及び「ヒープメモリ範囲変更通知処理」である。
【００９１】
「ヒープメモリ解放通知処理」からの通知の場合、ポインタ領域管理部２２１は、解放されたヒープメモリ３５０の範囲に含まれるポインタ領域を管理対象外（無効）として、ポインタ領域操作記録部２２３に記録する。さらに、ポインタ領域管理部２２１は、ポインタ領域初期化部２２２を用いて、対象外としてポインタ領域を初期化する。
【００９２】
この処理に基づき、メモリ管理装置２０は、解放されたヒープメモリ３５０に対応するポインタ領域を無効とする。その結果、アプリケーションプログラム３２０は、解放されたヒープメモリ３５０に対応するポインタ領域を適切に処理できる。
【００９３】
「ヒープメモリ範囲変更通知処理」からの通知の場合、ポインタ領域管理部２２１は、解放されたヒープメモリ３５０の範囲と、追加されたヒープメモリ３５０の範囲とを算出する。
【００９４】
そして、ポインタ領域管理部２２１は、解放されたヒープメモリ３５０の範囲に対応するポインタ領域を、「ヒープメモリ解放通知処理」からの通知の場合と同様に、対象外（無効）とし、さらに、ポインタ領域を初期化する。
【００９５】
なお、ポインタ領域管理部２２１は、追加されたヒープメモリ３５０の範囲に対応するポインタ領域がある場合、ポインタ領域の情報をポインタ領域操作記録部２２３に記録し、ポインタ領域初期化部２２２を用いてポインタ領域を初期化する。
【００９６】
この処理に基づき、メモリ管理装置２０は、解放されたヒープメモリ３５０に対応するポインタ領域を無効とする。その結果、アプリケーションプログラム３２０は、解放されたヒープメモリ３５０に対応するポインタ領域を適切に処理できる。
【００９７】
次に、「スタック操作通知処理」に対応する動作を説明する。
【００９８】
「スタック操作通知処理」から通知の場合、ポインタ領域管理部２２１は、解放されたスタックメモリ３４０に対応するポインタ領域を対象外（無効）として、ポインタ領域操作記録部２２３に記録する。さらに、ポインタ領域管理部２２１は、ポインタ領域初期化部２２２を用いて、対象外としてポインタ領域を初期化する。
【００９９】
この処理に基づき、メモリ管理装置２０は、解放されたスタックメモリ３４０に対応するポインタ領域を無効とする。その結果、アプリケーションプログラム３２０は、解放されたヒープメモリ３５０に対応するポインタ領域を適切に処理できる。
【０１００】
次に、不正アクセス特定部２３０について説明する。
【０１０１】
不正アクセス特定部２３０は、不正アクセスなどポインタ領域の不正な処理が発生した場合、メモリ管理部２２０を参照して、ポインタ領域の不正な処理となった箇所を特定する。より具体的には、ポインタ領域の不正が発生した場合、不正アクセス特定部２３０は、不正となったポインタ領域に関する情報を、ポインタ領域操作記録部２２３から取り出し、不正な処理を特定する。
【０１０２】
例えば、ポインタ領域を参照してヒープメモリ３５０にアクセスする場合の不正な処理は、次のような処理が想定される。
【０１０３】
（１）初期化されていない内容が原因の不正なアクセス
（２）不正なポインタ値の設定に基づく不正なアクセス
不正なアクセスが発生した場合、不正アクセス特定部２３０は、ポインタ領域操作記録部２２３の記録を確認する。例えば、不正アクセス特定部２３０は、図３に示すポインタ領域の情報を参照し、ポインタ領域を宣言したソース原文と行数を特定する。また、不正アクセス特定部２３０は、図４に示すポインタ領域の変更に関する情報を基にポインタ領域の状態や、その状態に変更したスレッドやソース原文の位置を特定する。
【０１０４】
開発者は、不正アクセス特定部２３０が特定した情報を参照し、不正を分析できる。
【０１０５】
そのため、不正アクセス特定部２３０は、開発者などへ通知する機能を含んでも良い。
【０１０６】
このように、本実施形態のメモリ管理装置２０は、ヒープメモリ３５０を解放した場合にポインタ領域を適切に処理できる。
【０１０７】
その理由は、次のとおりである。
【０１０８】
本実施形態の翻訳部２１０は、アプリケーションプログラム３２０のヒープメモリ３５０の確保（宣言）、変更及び解放の処理に、メモリ管理部２２０への通知の処理を追加する。
【０１０９】
そして、メモリ管理部２２０は、通知を基に、解放されたヒープメモリ３５０に対応するポインタ領域を対象外（無効）とすることができるためである。
【０１１０】
さらに、メモリ管理装置２０は、スタックメモリ３４０に対応するポインタ領域も適切に管理できる。
【０１１１】
その理由は、次のとおりである。
【０１１２】
本実施形態の翻訳部２１０は、アプリケーションプログラム３２０のスタックメモリ３４０の確保、変更及び解放の処理に、メモリ管理部２２０への通知の処理を追加する。
【０１１３】
そして、メモリ管理部２２０は、通知を基に、解放されたスタックメモリ３４０に対応するポインタ領域を対象外（無効）とすることができるためである。
【０１１４】
また、本実施形態のメモリ管理装置２０は、不正アクセスの特定を容易とする効果を得ることができる。
【０１１５】
その理由は、次のとおりである。
【０１１６】
本実施形態のメモリ管理部２２０は、翻訳部２１０が追加した通知を基にポインタ領域の操作を記録する。そして、その記録を基に、不正アクセス特定部２３０が、ポインタ領域の不正アクセスを特定できるためである。
【０１１７】
＜変形例＞
なお、本実施形態のメモリ管理装置２０の構成は、これまで説明した構成に限る必要はない。
【０１１８】
例えば、スタックメモリ３４０は、ヒープメモリ３５０と同様に動的に確保されるため、スタックメモリ３４０を含めて説明した。
【０１１９】
しかし、本実施形態のメモリ管理装置２０は、ヒープメモリ３５０とスタックメモリ３４０とを別装置として管理しても良い。
【０１２０】
また、不正アクセス特定部２３０は、メモリ管理装置２０と別装置でも良い。
【０１２１】
図５は、変形例の一例であるメモリ管理装置２５の構成の一例のブロック図である。
【０１２２】
メモリ管理装置２５は、不正アクセス特定部２３０とスタック領域通知部２１４とを含まない点を除き、メモリ管理装置２０と同様の構成を含む。
【０１２３】
このように構成されたメモリ管理装置２５は、メモリ管理装置２０と同様に、ヒープメモリ３５０を解放した場合にポインタ領域を適切に処理できる。
【０１２４】
その理由は、次のとおりである。
【０１２５】
本実施形態の翻訳部２１５は、アプリケーションプログラム３２０のヒープメモリ３５０の確保、変更及び解放の処理に、メモリ管理部２２０への通知の処理を追加する。
【０１２６】
そして、メモリ管理部２２０は、通知を基に、解放されたヒープメモリ３５０に対応するポインタ領域を対象外とし、さらに操作を記録するためである。
【０１２７】
さらに、本実施形態のメモリ管理装置２５は、１台の装置に翻訳部２１５と、メモリ管理部２２０とを含んでいるが、これに限る必要はない。例えば、メモリ管理装置２５は、図６に示すように、翻訳部２１５とメモリ管理部２２０とを、バスを介して接続した別のボード、又は、ネットワーク介して接続する別の装置として構成しても良い。なお、図６に示す構成は、本実施形態の最小構成である。
【０１２８】
また、本実施形態の説明では、メモリ管理装置２０をＣＰＵ１０とは異なる装置として説明したが、メモリ管理装置２０の実現は、これに限る必要はない。
【０１２９】
例えば、メモリ管理装置２０の機能をプログラムで実現し、ＣＰＵ１０が実行するＯＳ３１０に組み込んでも良い。あるいは、メモリ管理装置２０は、独立した管理プログラムとして実現しても良い。
【０１３０】
また、メモリ管理装置２０は、図示しないコンピュータで読み込み可能が記録媒体にメモリ管理装置２０の機能を実現するプログラムとして保存されても良い。その場合、ＣＰＵ１０が、図示しない記録媒体読み取り装置を用いて、メモリ管理装置２０の相当するプログラムとして読み込んで、実行しても良い。
【０１３１】
あるいは、本実施形態のメモリ管理装置２０は、ＣＰＵ１０とは異なるＣＰＵと、ＲＯＭと、ＲＡＭ（Random Access Memory）と、ＩＯ（Input/Output）インターフェース（以下、ＩＯと言う）と、ＮＩＣ（Network Interface Card）とを含むコンピュータとして実現しても良い。
【０１３２】
図７は、ＣＰＵ７１０を用いた本実施形態のメモリ管理装置７０を構成の一例を示す図である。
【０１３３】
メモリ管理装置７０は、ＣＰＵ７１０と、ＲＯＭ７２０と、ＲＡＭ７３０と、内部記憶装置７４０と、ＩＯ７５０と、ＮＩＣ７８０とを含み、コンピュータを構成している。
【０１３４】
ＣＰＵ７１０は、ＲＯＭ７２０又は内部記憶装置７４０からプログラムを読み込む。そして、ＣＰＵ７１０は、読み込んだプログラムに基づいて、メモリ管理装置２０の翻訳部２１０と、メモリ管理部２２０と、不正アクセス特定部２３０としての各機能を実現する。ＣＰＵ７１０は、各機能を実現する際に、ＲＡＭ７３０及び内部記憶装置７４０を一時記憶として使用する。また、ＣＰＵ７１０は、ＮＩＣ７８０を介して、ＣＰＵ１０などの他の構成と接続する。
【０１３５】
なお、ＣＰＵ７１０は、コンピュータで読み取り可能にプログラムを記憶した記憶媒体７９０が含むプログラムを、図示しない記憶媒体読み取り装置を用いて読み込んでも良い。あるいは、ＣＰＵ７１０は、図示しないネットワークを介して、外部の装置からプログラムを受け取っても良い。
【０１３６】
ＲＯＭ７２０は、ＣＰＵ７１０が実行するプログラム、及び、固定的なデータを記憶する。ＲＯＭ７２０は、例えば、Ｐ−ＲＯＭ(Programmable-ROM）やフラッシュＲＯＭである。
【０１３７】
ＲＡＭ７３０は、ＣＰＵ７１０が実行するプログラムやデータを一時的に記憶する。ＲＡＭ７３０は、例えば、Ｄ−ＲＡＭ（Dynamic-RAM）である。
【０１３８】
内部記憶装置７４０は、メモリ管理装置７０の長期的に保存するデータやプログラムを保存する。また、内部記憶装置７４０は、ポインタ領域操作記録部２２３として動作しても良い。さらに、内部記憶装置７４０は、ＣＰＵ７１０の一時記憶装置として動作しても良い。内部記憶装置７４０は、例えば、ハードディスク装置、光磁気ディスク装置、ＳＳＤ（Solid State Drive）又はディスクアレイ装置である。
【０１３９】
ＩＯ７５０は、ＣＰＵ７１０と、入力機器７６０及び表示機器７７０とを接続する。ＩＯ７５０は、例えば、ＩＯインターフェースカードである。
【０１４０】
入力機器７６０は、メモリ管理装置７０の操作者からの入力指示を受信する入力部である。入力機器７６０は、例えば、キーボード、マウス又はタッチパネルである。
【０１４１】
表示機器７７０は、メモリ管理装置７０の表示部である。表示機器７７０は、例えば、液晶ディスプレイである。
【０１４２】
ＮＩＣ７８０は、メモリ管理装置７０とＣＰＵ１０など他の構成とのデータをやり取りする仲介する。ＮＩＣ７８０は、例えば、ＰＣＩ（Peripheral Component Interface）カードである。
【０１４３】
このように構成されたメモリ管理装置７０は、メモリ管理装置２０と同様の効果を得ることができる。
【０１４４】
その理由は、メモリ管理装置７０のＣＰＵ７１０が、プログラムに基づいてメモリ管理装置２０と同様の動作を実現できるためである。
【０１４５】
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【符号の説明】
【０１４６】
１０    ＣＰＵ
２０    メモリ管理装置
２５    メモリ管理装置
３０    メモリ部
４０    ＲＯＭ
５０    内部記憶装置
６０    情報処理システム
７０    メモリ管理装置
２１０    翻訳部
２１１    ポインタ領域登録部
２１２    ポインタ領域変更記録部
２１３    ヒープアドレス通知部
２１４    スタック領域通知部
２１５    翻訳部
２２０    メモリ管理部
２２１    ポインタ領域管理部
２２２    ポインタ領域初期化部
２２３    ポインタ領域操作記録部
２３０    不正アクセス特定部
３１０    ＯＳ
３２０    アプリケーションプログラム
３３０    静的メモリ
３４０    スタックメモリ
３５０    ヒープメモリ
７１０    ＣＰＵ
７２０    ＲＯＭ
７３０    ＲＡＭ
７４０    内部記憶装置
７５０    ＩＯ
７６０    入力機器
７７０    表示機器
７８０    ＮＩＣ
７９０    記憶媒体
【図１】
2014052753.tif 000003
【図２】
2014052753.tif 000004
【図３】
2014052753.tif 000005
【図４】
2014052753.tif 000006
【図５】
2014052753.tif 000007
【図６】
2014052753.tif 000008
【図７】
2014052753.tif 000009