(57)【特許請求の範囲】
【請求項１】
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記ソースプログラムを解析して前記ソースプログラムに記述された関数と前記関数に含まれる大域変数とを検出し、前記メモリ保護ポリシーに記述された前記情報に従って、前記大域変数と、前記大域変数を利用するドメインとを対応づけた情報を生成する生成部と、
前記メモリ保護ポリシーに記述された前記ドメイン間の上位下位関係に従って、前記大域変数を利用するドメインを上位ドメインと下位ドメインとに分割する分割部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）前記上位ドメインに対応するアクセス制御表において前記大域変数に対してのアクセス制限を読み書き許可に設定する命令を前記ソースプログラムに追加し、
（B）前記下位ドメインに対応するアクセス制御表において前記大域変数に対してのアクセス制限を読み出し許可に設定する命令を前記ソースプログラムに追加する
追加部と、
を備え、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）および前記（B）で追加された前記命令の実行によって操作されるプログラム生成装置。
【請求項２】
前記上位ドメインは最上位ドメインであり、前記下位ドメインは、前記最上位ドメイン以外のドメインであることを特徴とする請求項１に記載のプログラム生成装置。
【請求項３】
前記分割部は、前記大域変数を利用するドメインが１つの場合は当該ドメインを前記上位ドメインとして扱うことを特徴とする請求項１に記載のプログラム生成装置。
【請求項４】
前記追加部は、前記読み書き許可に設定する命令および前記読み出し許可に設定する命令を、前記ソースプログラムで最初に実行される関数に追加することを特徴とする請求項１ないし３のいずれかに記載のプログラム生成装置。
【請求項５】
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）前記関数が他の関数によって呼び出された場合に前記関数がスタック領域にアクセスできるようにするため、前記関数が属するドメインに対応するアクセス制御表においてスタックポインタからベースポインタによって指定される範囲までのメモリ領域に対するアクセス制限を読み書き可能に設定する命令を前記関数に追加し、
（B）前記関数が属するドメインに対応する前記アクセス制御表において前記メモリ領域に対するアクセス制限をアクセス禁止に設定する命令を、前記関数におけるリターン命令の前に追加する、
追加部と、
を備え、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）および前記（B）で追加された命令の実行によって操作されることを特徴とするプログラム生成装置。
【請求項６】
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）前記関数が、前記関数と異なるドメインに属する他の関数によって呼び出された場合に、前記関数が前記関数の引数にアクセスできるようにするため、前記関数が属するドメインに対応するアクセス制御表において前記引数へのアクセス制限を読み書き許可または読み出し許可に設定する第１命令を前記ソースプログラムに追加し、
（B）前記関数の実行後に前記関数の属するドメインから前記引数へアクセスできないようにするため、前記関数が属するドメインに対応する前記アクセス制御表において前記引数へのアクセス制限をアクセス禁止に設定する第２命令を前記ソースプログラムに追加する、
追加部と、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）および前記（B）で追加された前記第1命令および前記第２命令の実行よって操作されることを特徴とするプログラム生成装置。
【請求項７】
前記引数は参照アドレスを示し、
前記メモリ保護ポリシーは、アクセス制限を設定すべき前記参照アドレスからのメモリ範囲と、前記アクセス制限の内容とに関する情報を含み、
前記追加部は、
前記関数が属するドメインに対応する前記アクセス制御表において前記メモリ範囲に対するアクセス制限を前記アクセス制限の内容に設定する命令を前記第１命令として前記ソースプログラムに追加し、
前記関数が属するドメインに対応する前記アクセス制御表において前記メモリ範囲に対するアクセス制限をアクセス禁止に設定する命令を前記第２命令として前記ソースプログラムに追加する、
ことを特徴とする請求項６に記載のプログラム生成装置。
【請求項８】
前記追加部は、
前記第１命令を、前記関数、または前記他の関数における前記関数の呼び出し命令の前に追加し、
前記第２命令を、前記関数において前記第１命令よりも後かつ前記関数におけるリターン命令の前、または、前記他の関数における前記呼び出し命令の後に追加する、
ことを特徴とする請求項７に記載のプログラム生成装置。
【請求項９】
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記ソースプログラムから動的メモリ確保命令およびメモリ解放命令を検出する検出部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）検出された前記動的メモリ確保命令が属するドメインとこのドメインの上位ドメインとのそれぞれに対応するアクセス制御表において、前記動的メモリ確保命令によって確保されたメモリ領域に対するアクセス制限を読み書き許可に設定する命令を前記ソースプログラムに追加し、
（B）前記検出された前記動的メモリ確保命令が属するドメインの下位ドメインに対応するアクセス制御表において、前記動的メモリ確保命令によって確保されたメモリ領域に対するアクセス制限を読み出し許可に設定する命令を前記ソースプログラムに追加し、
（C）前記検出された前記動的メモリ確保命令が属するドメインと前記上位ドメインと前記下位ドメインとのそれぞれに対応するアクセス制御表において、前記メモリ解放命令によって開放されたメモリ領域に対するアクセス制限をアクセス禁止に設定する命令を前記ソースプログラムに追加する、
追加部と、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）、前記（B）および前記(C)で追加された前記命令の実行によって操作されることを特徴とするプログラム生成装置。
【請求項１０】
前記追加部は、前記読み書き許可に設定する命令および前記読み出し許可に設定する命令を前記動的確保命令の直前または直後に追加し、前記アクセス禁止に設定する命令を前記メモリ解放命令の直前または直後に追加することを特徴とする請求項９に記載のプログラム生成装置。
【請求項１１】
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
前記プログラムの実行時に前記関数が配置されるメモリ領域にアクセスできるようにするため、前記関数が属するドメインに対応するアクセス制御表において、前記メモリ領域に対するアクセス制限を実行可能に設定する命令を前記ソースプログラムに追加する、追加部と、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記追加された命令の実行によって操作されることを特徴とするプログラム生成装置。
【請求項１２】
前記ソースプログラムをコンパイルおよびリンク処理することにより前記メモリ領域の終端アドレスを計算するコンパイラ＆リンカと、
前記ソースプログラムに追加された前記実行可能に設定する命令に、前記終端アドレスを挿入する装置と
をさらに備えたことを特徴とする請求項１１に記載のプログラム生成装置。
【請求項１３】
前記追加部は、前記実行可能に設定する命令を前記ソースプログラムで最初に実行される関数に追加することを特徴とする請求項１１または１２に記載のプログラム生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム生成方法およびプログラムに関する。
【背景技術】
【０００２】
単一メモリアドレス空間上で複数のプログラムコンポーネントが実行される環境においては、１つのプログラムコンポーネントにバグや悪意が含まれているだけで、他のコンポーネントの利用しているメモリ領域を破壊してしまい、システム全体がダウンしてしまう可能性がある。そこで、単一メモリアドレス空間上にコンポーネント境界を設け、１つのプログラムコンポーネントにバグや悪意が含まれていても、他のコンポーネントに影響を与えないようにする技術がある。
【０００３】
例えば、アクセス制限を付与したいメモリの領域とその領域に対するアクセス制限の種類( Execute(EX)・Read-Write(RW)・Read-Only(RO)・Access-Inhibit(NO) )を表したアクセス制御表を用意し、CPUとメモリ装置間のメモリ保護装置が、このアクセス制御表を元にCPUからメモリ装置へのアクセスを管理することでメモリ保護を実現する。このためには、ソフトウェア開発者は、プログラムの利用するメモリ領域（テキスト領域・データ領域・ヒープ領域・スタック領域）の使用方法を考慮し、メモリ保護装置を利用することを前提としたコードをプログラムに書かならず、ソフトウェア開発者にとって大きな負担となっている。さらに、人手でメモリ保護機能という主機能でない付加的な機能を加えることにより、プログラムの信頼性が低下する危険性がある。また、他者の開発したプログラムを利用する場合、メモリ保護機能を利用できない場合もある。
【特許文献１】特開平５−２８９９４４公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
本発明は、メモリ空間を保護するプログラムをソフトウェア開発者に大きな負担をかけることなく生成できるようにしたプログラム生成方法およびプログラムを提供する。
【課題を解決するための手段】
【０００５】
本発明の一態様としてのプログラム生成装置は、
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記ソースプログラムを解析して前記ソースプログラムに記述された関数と前記関数に含まれる大域変数とを検出し、前記メモリ保護ポリシーに記述された前記情報に従って、前記大域変数と、前記大域変数を利用するドメインとを対応づけた情報を生成する生成部と、
前記メモリ保護ポリシーに記述された前記ドメイン間の上位下位関係に従って、前記大域変数を利用するドメインを上位ドメインと下位ドメインとに分割する分割部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）前記上位ドメインに対応するアクセス制御表において前記大域変数に対してのアクセス制限を読み書き許可に設定する命令を前記ソースプログラムに追加し、
（B）前記下位ドメインに対応するアクセス制御表において前記大域変数に対してのアクセス制限を読み出し許可に設定する命令を前記ソースプログラムに追加する
追加部と、
を備え、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）および前記（B）で追加された前記命令の実行によって操作されることを特徴とする。
【０００６】
本発明の一態様としてのプログラム生成装置は、
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）前記関数が他の関数によって呼び出された場合に前記関数がスタック領域にアクセスできるようにするため、前記関数が属するドメインに対応するアクセス制御表においてスタックポインタからベースポインタによって指定される範囲までのメモリ領域に対するアクセス制限を読み書き可能に設定する命令を前記関数に追加し、
（B）前記関数が属するドメインに対応する前記アクセス制御表において前記メモリ領域に対するアクセス制限をアクセス禁止に設定する命令を、前記関数におけるリターン命令の前に追加する、
追加部と、
を備え、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）および前記（B）で追加された命令の実行によって操作される
ことを特徴とする。
【０００７】
本発明の一態様としてのプログラム生成装置は、
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）前記関数が、前記関数と異なるドメインに属する他の関数によって呼び出された場合に、前記関数が前記関数の引数にアクセスできるようにするため、前記関数が属するドメインに対応するアクセス制御表において前記引数へのアクセス制限を読み書き許可または読み出し許可に設定する第１命令を前記ソースプログラムに追加し、
（B）前記関数の実行後に前記関数の属するドメインから前記引数へアクセスできないようにするため、前記関数が属するドメインに対応する前記アクセス制御表において前記引数へのアクセス制限をアクセス禁止に設定する第２命令を前記ソースプログラムに追加する、
追加部と、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）および前記（B）で追加された前記第1命令および前記第２命令の実行よって操作されることを特徴とする。
【０００８】
本発明の一態様としてのプログラム生成装置は、
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記ソースプログラムから動的メモリ確保命令およびメモリ解放命令を検出する検出部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
（A）検出された前記動的メモリ確保命令が属するドメインとこのドメインの上位ドメインとのそれぞれに対応するアクセス制御表において、前記動的メモリ確保命令によって確保されたメモリ領域に対するアクセス制限を読み書き許可に設定する命令を前記ソースプログラムに追加し、
（B）前記検出された前記動的メモリ確保命令が属するドメインの下位ドメインに対応するアクセス制御表において、前記動的メモリ確保命令によって確保されたメモリ領域に対するアクセス制限を読み出し許可に設定する命令を前記ソースプログラムに追加し、
（C）前記検出された前記動的メモリ確保命令が属するドメインと前記上位ドメインと前記下位ドメインとのそれぞれに対応するアクセス制御表において、前記メモリ解放命令によって開放されたメモリ領域に対するアクセス制限をアクセス禁止に設定する命令を前記ソースプログラムに追加する、
追加部と、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記（A）、前記（B）および前記(C)で追加された前記命令の実行によって操作されることを特徴とする。
【０００９】
本発明の一態様としてのプログラム生成装置は、
メモリアドレス毎のアクセス制限を定めたアクセス制御表を利用してＣＰＵからメモリ装置へのアクセスを制御するシステム環境において実行するプログラムを生成するプログラム生成装置であって、
ソースプログラムを入力し、また、前記ソースプログラム内の関数をドメイン毎に分類した情報とドメイン間の上位下位関係とを記述したメモリ保護ポリシーを入力する入力部と、
前記メモリ保護ポリシーの前記ドメイン毎にそれぞれ前記アクセス制御表が予め割り当てられており、
前記プログラムの実行時に前記関数が配置されるメモリ領域にアクセスできるようにするため、前記関数が属するドメインに対応するアクセス制御表において、前記メモリ領域に対するアクセス制限を実行可能に設定する命令を前記ソースプログラムに追加する、追加部と、
前記ドメイン毎の前記アクセス制御表は、前記CPUによる前記プログラムの実行時に、前記追加された命令の実行によって操作されることを特徴とする。
【発明の効果】
【００１１】
本発明により、メモリ空間を保護するプログラムをソフトウェア開発者に大きな負担をかけることなく生成できる。
【発明を実施するための最良の形態】
【００１２】
本実施の形態は、プログラム内の各関数を、プログラムで利用される機能毎にドメインとして分類したメモリ保護ポリシーと、プログラムとを入力とし、ドメイン境界を越えてバグ等の不具合が伝播しないような形でメモリ保護装置を利用できるプログラムを自動作成しようとするものである。以下、本実施の形態について、図面を参照しながら、説明する。
【００１３】
図１は、本実施の形態によって作成したメモリ保護機能付きプログラムの実行環境を示すシステム構成図である。
【００１４】
このシステムは、CPU１２と、メモリ装置１３と、アクセス制御装置１１とを備える。メモリ装置１３は、本実施の形態によって作成したメモリ保護機能付きプログラムを格納し、CPU１２は、このメモリ保護機能付きプログラムを実行する。メモリ保護装置（アクセス制御装置）１１はCPU１２とメモリ装置１３との間に位置し、メモリ装置１３内のアクセス制御表を参照して、CPU１２からメモリ装置１３へのアクセスを監視する。アクセス制御表はドメインごとに存在する。アクセス制御表は、本実施の形態により作成されたメモリ保護機能付きプログラムからアクセス制御表を操作する関数によって操作される。また、アクセス制御装置１１にどのドメインのアクセス制御表を参照させるかも、作成されたメモリ保護機能付きプログラムによって指定する。アクセス制御装置１１は、CPU１２からのアクセスが、対応するアクセス制御表によって許容されている場合はメモリ装置１３へのアクセスを通過させるが許容されていない場合はアクセスを遮断するように機能する。
【００１５】
図２は、本発明の実施の形態に従ったプログラム生成方法を実行する環境としてのプログラム生成装置の構成を示すブロック図である。このプログラム生成装置は、入力されたメモリ保護ポリシーと、入力されたソースプログラムとから、メモリ保護機能付きソースプログラムを作成する機能を有する。図１で説明したメモリ保護機能付きプログラムは、このメモリ保護機能付きソースプログラムをコンパイルおよびリンク処理して実行可能形式にしたものに相当する。
【００１６】
図２のプログラム生成装置は、入力されたソースプログラムにメモリ保護に関するコードを織り込むために、大きくWeaver1とWeaver2の２つの装置を利用する。Weaver1およびWeaver2は、これらの機能がハードウェアによって実現される場合はハードウェアモジュールを表し、プログラムによって実現される場合はプログラムモジュールを表す。
【００１７】
Weaver1は、データ領域・スタック領域・ヒープ領域に関するアクセス制御表操作命令をソースプログラムに織り込む。Weaver1は、テキスト領域に関するアクセス制御表操作命令に関しては、メモリアドレス範囲を未設定の状態でプログラムに織り込んでおく。
【００１８】
コンパイラ＆リンカ３は、Weaver1を経たソースプログラムを元に、テキスト領域における関数の終端アドレスを記した終端アドレス表を作成する。
【００１９】
Weaver2は、コンパイラ＆リンカ３の出力する終端アドレス表を利用して、Weaver1において未設定であった関数のメモリアドレス範囲を確定し、確定したメモリアドレス範囲を、Weaver1を経たソースプログラムに書き込む。
【００２０】
Weaver2を経たソースプログラム（メモリ保護付きソースプログラム）に、通常のコンパイル処理およびリンク処理を施すことにより、CPU１２により実行可能なメモリ保護機能付きプログラムを得る。
【００２１】
図３は、Weaver1の機能ブロック図である。図４は、Weaver1により行われる処理を詳細に説明するフローチャートである。
【００２２】
Weaver1は、図４のステップ［１］〜［１０］において元のソースプログラムの適切な箇所にメモリ保護用命令を書き加える。図４のフローチャートにおけるステップ［１］〜［１０］の順は一例であり、これらの順は任意でもよい。各ドメインの各々に対応するアクセス制御表の初期状態は、全領域（スタック領域、ヒープ領域、データ領域、テキスト領域）でNO（アクセス禁止）とする。
【００２３】
図５は、アクセス制御表の例を示す。
【００２４】
ここでは、２つのドメイン（domain1, domain2）のアクセス制御表が示される。アクセス制御表は、メモリ領域における各メモリアドレスのアクセス制限を管理する。アクセス制限には、Execute(EX)・Read-Write(RW)・Read-Only(RO)・Access-Inhibit(NO)があり、各メモリアドレスはこれらのうちのいずれかのアクセス制限が設定される。初期状態では、domain1およびdomain2のいずれのアクセス制御表においても全メモリアドレスにおいてNOが設定されている。
【００２５】
以下、図３および図４を用いて、Weaver1について詳細に説明する。
【００２６】
ステップ［０］：Weaver1は、ポリシー解析機能２１を用いて、メモリ保護ポリシーから、「関数−ドメイン対応情報」「ドメイン階層情報」「引数情報」を作成する。また、Weaver1は、大域変数利用ドメイン解析機能２２を用いて、ソースプログラムおよびメモリ保護ポリシーから、「大域変数−利用ドメイン情報」を作成する。
【００２７】
図６は、メモリ保護ポリシーの一例を示す。また、図７（Ａ）は関数―ドメイン対応情報の例を示し、図７（Ｂ）はドメイン階層情報の例を示し、図７（Ｃ）は引数情報の例を示し、図７（Ｄ）は、大域変数―利用ドメイン情報の例を示す。
【００２８】
図６において、メモリ保護ポリシーは、ソースプログラム内の各関数を機能毎にドメインとして分類したものである。メモリ保護ポリシーはプログラマなどによってあらかじめ作成される。図６の例では、２つのドメイン、すなわちdomain1およびdomain2が定義される。関数mainはdomain1に属し、関数show_stringはdomain2に属する。関数show_stringはchar型をさすポインタ引数cを含み、関数show_stringが属するドメインに対応するアドレス制御表において、ポインタcによって示されるアドレスからサイズ１００（例えば１００バイト）の領域（データ領域）を、RO（Read Only）に設定することが示される。hierarchyは各ドメイン間の階層を定めたものであり、本例では、domain1の階層がdomain2よりも上位である。
【００２９】
図７（Ａ）において、関数−ドメイン対応情報は、関数と、当該関数の属するドメインとを対応づけたものである。
【００３０】
図７（Ｂ）において、ドメイン階層情報は、ドメイン間の階層関係を表したものである。
【００３１】
図７（Ｃ）において、引数情報は、プログラムで用いられる各関数に含まれる引数の情報を表したものである。「引数指定」は、関数で用いられる引数を識別するものであり、関数に複数の引数が用いられる場合、最初の引数（例えばカッコ内の一番左側に記述された引数）は第一引数、２番目の引数は第二引数として識別する。show_stringは１つの引数しかもたないため第一引数のみが記述される。「引数のタイプ」は引数が参照型か値かを示すものであり、引数がポインタ等の場合は「参照」になり、数値等である場合は「値」になる。「サイズ」は引数のサイズ（本例では４バイト）である。「参照先のサイズ」は、ポインタ等によって指定されるアドレスから何バイト先までを扱うかを示すものである。「参照先のアクセス制限」は、「参照先のサイズ」によって示される領域のアクセス制限を表すものである。
【００３２】
図７（Ｄ）において、大域変数−利用ドメイン情報は、プログラムで用いられる各大域変数の情報を表したものである。各大域変数はソースプログラムを走査することで検出される。「利用するドメイン」は大域変数が用いられる関数が属するドメインである。大域変数が属する関数をソースプログラムから全て検出し、検出された関数がどのドメインに属するかをメモリ保護ポリシーもしくは関数−ドメイン対応情報から検出することで、大域変数の「利用するドメイン」を決定する。
【００３３】
ステップ［１］：Weaver1は、アクセス制御表操作関数、スタックポインタ取得関数、ベースポインタ取得関数およびアクセス制御表切り替え関数を、新たな関数として、ソースプログラムに定義する（後述する図１２の［１］参照）。
【００３４】
アクセス制御表操作関数は、ドメイン、メモリアドレス範囲およびアクセス制限を指定することにより、指定されたドメインに対応するアクセス制御表における指定されたメモリアドレス範囲に、指定されたアクセス制限を登録する関数である。
【００３５】
以後の説明では、ドメイン集合Dに含まれるドメインd(d∈D)のアクセス制御表において、アドレスstからedまでの範囲を、アクセス制限a∈{RO, RW, EX, NO}で登録する関数を
add_address(st , ed , a , {d})
と表記する。
【００３６】
また、ドメイン集合Dに含まれるドメインdのアクセス制御表において、アドレスstからサイズsバイトの範囲をアクセス制限aで登録する関数を
add_address2(st , s , a , {d})
と表記する。
【００３７】
スタックポインタ取得関数は、実行中の関数において、スタックポインタのアドレスを取得する関数である。
【００３８】
以後の説明では、スタックポインタ取得関数を
get_esp()
と表記する。
【００３９】
ベースポインタ取得関数は、実行中の関数において、ベースポインタのアドレスを取得する関数である。
【００４０】
以後の説明では、ベースポインタ取得関数を
get_ebp()
と表記する。
【００４１】
アクセス制御表切り替え関数は、アクセス制御装置１１が参照するアクセス制御表を指定のドメインdのものに切り替えるための関数である。
【００４２】
以後の説明では、この関数を
dom_change(d)
と表記する。
【００４３】
ステップ［２］：大域変数が利用する領域についてのアクセス制限をアクセス制御表に登録する命令を、図８に示すフローチャートの手順にしたがって、プログラムの開始直後(main関数開始直後)に１回だけ実行される形で追加する。大域変数−利用ドメイン情報に現れる全ての大域変数について、図８の手順に従い、命令を追加する。より詳細には以下の通りである。
【００４４】
Weaver1における、大域変数を介した不具合伝播防止情報作成機能２３は、対象とする大域変数（ここでは仮にgとする）を利用するドメインが１つであるか否かを、大域変数―利用ドメイン情報を元に判定する（Ｓ１１）。
【００４５】
大域変数gを利用するドメインが１つである場合は（Ｓ１１のＹＥＳ）、そのドメイン（ここでは仮にdとする）を対象に、add_address2(&g, sizeof(g), RW, {d});を生成する。そして、この命令と、この命令を挿入すべきソースプログラム上の位置（main関数開始直後）とを、大域変数を介した不具合伝播防止情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この不具合伝播防止情報を元に、ソースプログラムに、上記命令を挿入する（Ｓ１２）（図１２の［２］参照）。
【００４６】
Ｓ１１において大域変数gを利用するドメインが複数の場合は（Ｓ１１のＮＯ）、ドメイン階層情報を元に、各ドメイン間で最上位ドメインが決定可能か否かを判定する（Ｓ１３）。最上位ドメインを決定可能な場合は（Ｓ１３のＹＥＳ）、最上位ドメインをd1、それ以外のドメインをd2,…dnとすると、最上位ドメインd1を対象にadd_address2(&g, sizeof(g), RW, {d1});を、それ以外のドメインd2,…dnを対象にadd_address2(&g, sizeof(g), RO, { d2,…dn });を生成する。そして、これらの命令と、これらの命令を挿入すべきソースプログラム上の位置（main関数開始直後）とを、大域変数を介した不具合伝播防止情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この不具合伝播防止情報を元に、ソースプログラムに、これらの命令を挿入する（Ｓ１４）。
【００４７】
Ｓ１３において最上位ドメインを決定可能でない場合は（Ｓ１３のＮＯ）、大域変数gを利用するドメインをd1,…dnとすると、add_address2(&g, sizeof(g), RO, { d1,…dn });を生成する。そして、この命令と、この命令を挿入すべきソースプログラム上の位置（main関数開始直後）とを、大域変数を介した不具合伝播防止情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この不具合伝播防止情報を元に、ソースプログラムに、上記命令を挿入する。
【００４８】
以上の手順において、各ドメインに対するアクセス制御を、大域変数−利用ドメイン情報の作成の際に、これに「利用方法」として含めておき、この利用方法を含んだ大域変数−利用ドメイン情報を用いて、大域変数を介した不具合伝播防止情報を作成してもよい。この場合、図８の手順において、ドメイン間の階層関係を判断する手順（Ｓ１１、Ｓ１３）を省略できる。
【００４９】
なお、最上位ドメインが複数、もしくは、１つに決まる場合でも、プログラム解析により、その最上位ドメインに属する全ての関数が大域変数gから値を読み込まないことが分かるならば（例えば書き込みのみの場合）、最上位ドメインに対してはa = RWとした上で、第２順位のドメインを最上位のドメインとして扱うことができる（第２順位のドメインに対してもa=RWとできる）。
【００５０】
ステップ［３］：Weaver1は、ソースプログラム内の全関数について、各々の関数のプログラム命令が格納される領域に対するアクセス制限をアクセス制御表に登録する命令をソースプログラムに追加する。
【００５１】
プログラムの開始直後(main関数開始直後)に１回だけ実行される形で以下の命令を追加する（図１２の［３］参照）。ただし、dは関数fが所属するドメインで、関数−ドメイン対応情報から知ることができる。
add_address(f , 0 , EX , {d});
【００５２】
領域の終端アドレスは仮に0（仮アドレス）としてあるが、これは、ソースプログラムをコンパイラ＆リンカ３を通す以前では、終端アドレスが未決定のためである。後にWeave2において、コンパイラ＆リンク３から得られた終端アドレス表を元に、上記仮アドレスを正しい終端アドレスに書き換える（後述する図１３参照）。なお、fは関数fの開始アドレスであり、図２のプログラム生成装置によって生成されたプログラムをコンパイルおよびリンク処理した際にfの位置にこの開始アドレスが挿入される。
【００５３】
ステップ［４］：関数fが呼び出された際、関数fが利用するスタック領域に対するアクセス制限をアクセス制御表に登録する命令をソースプログラムに追加する。より詳細には以下の通りである。
【００５４】
Weaver1における、スタック領域を介した不具合伝播防止情報作成機能２５は、プログラム内の全関数について、各々の関数の開始直後に挿入すべき、以下の命令を生成する。ただし、dは関数fが所属するドメインで、関数−ドメイン対応情報から知ることができる。
add_address(get_esp(), get_ebp(), RW , {d} );
【００５５】
スタック領域を介した不具合伝播防止情報作成機能２５は、各関数ごとに生成した命令と、各命令を挿入すべき位置（各関数の開始直後）とを、スタック領域を介した不具合伝播防止情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この不具合伝播防止情報を元に、ソースコードにおける各関数の開始直後に、各関数に対応する命令を挿入する（図１２の［４］参照）。
【００５６】
ステップ［５］：呼び出された関数fの処理が終了し、呼び出し元にリターン（return）される際、関数fが利用していたスタック領域に対するアクセス制限をアクセス制御表から削除する命令をソースプログラムに追加する。より詳細には以下の通りである。
【００５７】
Weaver1における、スタック領域を介した不具合伝播防止情報作成機能２５は、プログラム内の全関数について、各々の関数の終了直前(return文の直前)に挿入すべき、以下の命令を生成する。ただし、dは関数fが所属するドメインであり、関数−ドメイン対応情報から知ることができる。この命令は、ステップ［４］における命令のアクセス制限をNOに変えたものに等しい。
add_address(get_esp() , get_ebp() , NO , {d} );
【００５８】
スタック領域を介した不具合伝播防止情報作成機能２５は、各関数ごとに生成した命令と、各命令を挿入すべき位置（return文の直前）とを、スタック領域を介した不具合伝播防止情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この不具合伝播防止情報を元に、ソースコードにおける各関数の開始直後に、各関数に対応する命令を挿入する（図１２の［５］参照）。
【００５９】
ステップ［６］：動的に確保されるメモリ領域に対するアクセス制限をアクセス制御表に登録する命令をソースプログラムに追加する。より詳細には以下の通りである。
【００６０】
Weaver1における、動的に確保されたメモリ領域を介した不具合伝播防止情報作成機能２４は、ソースプログラム中の動的メモリ確保命令(例えばmalloc)の直前または直後に挿入すべき以下の命令を生成する。ただし、di,...,djは、メモリ確保命令が記述された関数の属するドメインdよりも上位のドメインであり、dn....,dm はドメインdよりも下位のドメインである。これらは、関数−ドメイン対応情報、およびドメイン階層情報から知ることができる。
add_address2(malloc文の返り値 , malloc文の引数(=サイズ) ,  RW , {d, di,...,dj} ) ;
add_address2(malloc文の返り値 , malloc文の引数(=サイズ) ,  RO , {dn,...,dm} );
【００６１】
動的に確保されたメモリ領域を介した不具合伝播防止情報作成機能２４は、これらの命令と、これらの命令を挿入すべき位置（mallocの直前または直後）とを、動的に確保されたメモリ領域を介した不具合伝播防止情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この不具合伝播防止情報を元に、ソースコードにおけるmallocの直前または直後に、上記命令を挿入する（図１２の［６］参照）。
【００６２】
ステップ［７］：動的に確保されていたメモリ領域が開放される際に、当該メモリ領域に対するアクセス制限をアクセス制御表から削除する命令をソースプログラムに追加する。より詳細には以下の通りである。
【００６３】
Weaver1における、動的に確保されたメモリ領域を介した不具合伝播防止情報作成機能２４は、ソースプログラムにおける動的に確保したメモリ領域を開放する命令(free)の直前または直後に挿入すべき以下の命令を生成する。ただし、d,di,...dj,dn,...,dmは、ステップ［６］におけるd,di,...dj,dn,...,dmと同一ドメインを表す。
add_address2(free文の引数, 確保してあるサイズ, NO, {d,di,...,dj,dn,...,dm}) ;
【００６４】
動的に確保されたメモリ領域を介した不具合伝播防止情報作成機能２４は、この命令と、この命令を挿入すべき位置（freeの直前または直後）とを、動的に確保されたメモリ領域を介した不具合伝播防止情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この不具合伝播防止情報を元に、ソースコードにおけるfreeの直前または直後に、上記命令を挿入する（図１２の［７］参照）。
【００６５】
ステップ［８］：関数呼び出しの際、呼び出された関数が、実引数の領域、または実引数が参照先アドレスの場合は参照先の領域を参照できるように、引数領域に対するアクセス制限をアクセス制御表に登録する命令を、ソースプログラムに追加する。より詳細には以下の通りである。
【００６６】
Weaver1における引数公開情報作成機能２６は、ソースプログラム内の全関数について、各々の関数の全引数を対象に、以下の命令を生成する（実際は、呼び出した関数と呼び出された関数のドメインが異なる場合にのみ、以下の命令が実行されればよい）。ただし、dは関数fのドメインであり、iは引数である。関数fの引数iにconst装飾子がつけられている場合、アクセス制限は、RWでなく、ROでもよい。
add_address2(&i, sizeof(i) , RW , {d} ) ;
【００６７】
引数iのタイプが「参照」の場合は、上記命令に加え、以下の命令も生成する。
add_address2(i ,「引数情報」におけるiの参照先サイズ , 
「引数情報」におけるiの参照先のアクセス制限 , {d});
【００６８】
引数公開情報作成機能２６は、上記命令と、上記命令を挿入すべき位置（読み出し元の関数において呼び出す文の直前または読み出された関数の開始直後）とを、引数公開情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この引数公開情報を元に、ソースプログラムに対し上記命令を挿入する（図１２の［８］参照）。
【００６９】
ステップ［９］：関数の処理が終了する際に、当該関数に公開していた引数領域を、アクセス制御表において非公開にする命令をソースプログラムに追加する。より詳細には以下の通りである。
【００７０】
Weaver1における引数公開情報作成機能２６は、ソースプログラム内の全ての関数について、各々の関数の全引数を対象に、関数の終了直前(return文の直前)に、以下の命令を生成する。ただし、dは関数fの属するドメインであり、iは引数である。
add_address2( &i , sizeof(i) , NO , {d} );
【００７１】
引数のタイプが「参照」の場合は、上記命令に加え、以下の命令も生成する。
add_address2( i ,「引数情報」におけるiの参照先サイズ , NO , {d} );
【００７２】
引数公開情報作成機能２６は、上記命令と、上記命令を挿入すべき位置（return文の直前）とを、引数公開情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この引数公開情報を元に、ソースプログラムに対し上記命令を挿入する（図１２の［９］参照）。
【００７３】
ステップ［１０］：関数呼び出しにより、実行ドメインが変更される場合(＝呼び出し元の関数のドメインと呼び出し先の関数のドメインが異なる場合)、アクセス制御装置１１が参照するアクセス制御表を変更する命令をソースプログラムに追加する。より詳細には以下の通りである。
【００７４】
Weaver1における使用アクセス制御表切り替え情報作成機能２７は、プログラム内の全関数の開始直後に追加すべき以下の命令を生成する。ただし、dは関数fのドメインである。
dom_change(d);
【００７５】
使用アクセス制御表切り替え情報作成機能２７は、この命令と、この命令を挿入すべき位置（関数の開始直後）とを、使用アクセス制御表切り替え情報として、メモリ保護命令織り込み機能２８に渡す。メモリ保護命令織り込み機能２８は、この使用アクセス制御表切り替え情報を元に、ソースプログラムに対し上記命令を挿入する（図１２の［１０］参照）。
【００７６】
図９は、図２におけるコンパイラ＆リンカ３およびWeaver2による処理を説明する図である。
【００７７】
コンパイラ＆リンカ３は、Weaver1によって作成されたプログラムを入力とし、テキスト領域における各関数の終端アドレスを抽出する。コンパイラ＆リンカ３は、関数と終端アドレスとを対応づけた表を終端アドレス表として出力する（Ｓ２１）。終端アドレス表の一例を図１０に示す。
【００７８】
Weaver2は、上記ステップ［３］において作成したアクセス制御表の操作命令に含まれる仮アドレスを、ステップＳ２１で作成した終端アドレス表を元に、正しい終端アドレスに置き換える（Ｓ２２）。このようにしてメモリ保護機能付きソースプログラムが作成される。
【００７９】
以下、本実施の形態に対する理解をさらに深めるため、図１１に示すソースプログラムからメモリ保護機能付きソースプログラムを作成する例を示す。
【００８０】
図１１のソースプログラムは、mainとshow_stringという2つの簡単な関数から構成されている。show_string関数は引数として渡された文字列を表示する機能をもつ関数である。一方、main関数は文字列をセットする機能をもつ関数となっている。
【００８１】
ここで、文字列表示機能(show_string関数のみからなる機能)と文字列をセットする機能(main関数のみからなる機能)とをドメイン切り分けし、show_string関数に不具合があってもmain関数には影響を及ぼさないようにする。このため、図６に示したのと同一のメモリ保護ポリシーを用意する。
【００８２】
図１１のソースプログラムと図６のメモリ保護ポリシーとを図２におけるWeaver1に入力すると、図１２に示すプログラムがWeaver1から出力される。図１２のプログラムにおいて、コメント行に書かれている［１］〜［１０］は、図４のフローチャートにおける［１］〜［１０］に対応している。
【００８３】
図１２のプログラムをコンパイラ＆リンカ３に入力すると、図１０に示したのと同一の終端アドレス表がコンパイラ＆リンカ３から出力される。
【００８４】
図１２のプログラムと図１０の終端アドレス表とをWeaver2に入力すると図１３に示すメモリ保護機能付きソースプログラムがWeaver2から出力される。このメモリ保護機能付きソースプログラムをコンパイルおよびリンク処理することでCPU１２に実行可能な形式のメモリ保護機能付きプログラムが生成される。
【００８５】
以上のように、本実施の形態により、ソフトウェア開発者はソースプログラムを自ら書き換えることなくとも、簡易なメモリ保護ポリシーを記述するだけで、メモリ保護付きプログラムを取得できる。よって、ソフトウェア開発者の負担は軽減される。またデバッグの効率化にも役立つ。また、プログラム解析による情報を利用してメモリ保護付きプログラムを作成するため、アクセス制限の厳しすぎないメモリ保護が実現できる。また、自動でメモリ保護機能付きプログラムを作成するため、プログラムの機能品質が下がることを防止できる。
【図面の簡単な説明】
【００８６】
【図１】本実施の形態によって作成したメモリ保護機能付きプログラムの実行環境を示すシステム構成図。
【図２】本発明の実施の形態に従ったプログラム生成装置の構成を示すブロック図。
【図３】Weaver1の機能ブロック図。
【図４】Weaver1により行われる処理を詳細に説明するフローチャート。
【図５】アクセス制御表の例を示す図。
【図６】メモリ保護ポリシーの一例を示す図。
【図７】関数―ドメイン対応情報の例、ドメイン階層情報の例、引数情報の例、大域変数―利用ドメイン情報の例を示す図。
【図８】大域変数が利用する領域についてのアクセス制限をアクセス制御表に登録する命令をソースプログラムに追加する手順を示すフローチャート。
【図９】図２におけるコンパイラ＆リンカ３およびWeaver2による処理を説明する図。
【図１０】終端アドレス表の一例を示す図。
【図１１】ソースプログラムの例を示す図。
【図１２】図１１のソースプログラムと図６のメモリ保護ポリシーとからWeaver1によって生成されたプログラムを示す図。
【図１３】図１２のプログラムと図１０の終端アドレス表とからWeaver2によって生成されたメモリ保護機能付きソースプログラムを示す図。
【符号の説明】
【００８７】
１、２：Weaver
３：コンパイラ＆リンカ
１１：アクセス制御装置（メモリ保護装置）
１２：ＣＰＵ
１３：メモリ装置
２１：ポリシー解析機能
２２：大域変数利用ドメイン解析機能
２３：大域変数を介した不具合伝播防止情報作成機能
２４：動的に確保されたメモリ領域を介した不具合伝播防止情報作成機能
２５：スタック領域を介した不具合伝播防止情報作成機能
２６：引数公開情報作成機能
２７：使用アクセス制御表切り替え情報作成機能
２８：メモリ保護命令織り込み機能
【図１】
0004559937.tif 000002
【図２】
0004559937.tif 000003
【図３】
0004559937.tif 000004
【図４】
0004559937.tif 000005
【図５】
0004559937.tif 000006
【図６】
0004559937.tif 000007
【図７】
0004559937.tif 000008
【図８】
0004559937.tif 000009
【図９】
0004559937.tif 000010
【図１０】
0004559937.tif 000011
【図１１】
0004559937.tif 000012
【図１２】
0004559937.tif 000013
【図１３】
0004559937.tif 000014