JP3360635B2 - プログラム検査システムとプログラム検査方法並びにその記憶媒体 - Google Patents

プログラム検査システムとプログラム検査方法並びにその記憶媒体

Info

Publication number
JP3360635B2
JP3360635B2 JP00791999A JP791999A JP3360635B2 JP 3360635 B2 JP3360635 B2 JP 3360635B2 JP 00791999 A JP00791999 A JP 00791999A JP 791999 A JP791999 A JP 791999A JP 3360635 B2 JP3360635 B2 JP 3360635B2
Authority
JP
Japan
Prior art keywords
data
program code
execution
program
type
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP00791999A
Other languages
English (en)
Other versions
JP2000207242A (ja
Inventor
千尋 小松
悟 藤田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC Corp
Original Assignee
NEC Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NEC Corp filed Critical NEC Corp
Priority to JP00791999A priority Critical patent/JP3360635B2/ja
Priority to US09/482,096 priority patent/US6772410B1/en
Publication of JP2000207242A publication Critical patent/JP2000207242A/ja
Application granted granted Critical
Publication of JP3360635B2 publication Critical patent/JP3360635B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44589Program code verification, e.g. Java bytecode verification, proof-carrying code

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、情報処理装置に関
し、特にコンピュータで構成されるコンピュータシステ
ムにおいて、個別の基本マシン命令セットを用いるコン
ピュータソフトウェア利用時におけるプログラムコード
の検査を行なうプログラム検査システムとその方法、さ
らに当該プログラム検査方法を実現させるためのプログ
ラムを記録するコンピュータ読みとり可能な記憶媒体に
関する。
【0002】
【従来の技術】コンピュータのソフトウェアに関し、実
行時あるいは実行前にそのプログラムコードの検査を行
なう方法には、特開平8−234994号公報があり、
特開平8−234994号公報(以下、従来方式1と記
す)では、特にインタープリタ形式のプログラムに関し
て、プログラムコードの検査手法を記述している。
【0003】従来方式1は、オペレーティングシステム
AのサーバコンピュータAのコンピュータプログラムを
ダウンロードしたオペレーティングシステムBのユーザ
コンピュータBにおいて、コンピュータBがそのコンピ
ュータプログラムを前処理としてチェックする際に、プ
ログラムコード中の個々の命令が持つ個々の命令が操作
することのできるデータの型に関する制約を利用し、本
実行の前処理によって、個々の命令が制約された型以外
のデータを操作する命令がプログラムコード中で発見さ
れた場合、そのプログラムコードの本実行を禁止する為
の手法である。
【0004】また、従来方式1は、プログラムコード中
の分岐命令を全て調べ、それら全ての分岐先にスタック
のスナップショット(一時的処理)を格納する為の記憶
部を用意する。従来方式1は、プログラムコードの本実
行と同様のデータ型操作を行なう前実行処理を行ない、
その実行状態をデータ型操作のみをシミュレートした仮
想スタックに反映する。この前実行処理はプログラムの
先頭から順に行なわれ、前記のスナップショット記憶部
が用意されたプログラム位置では、仮想スタックの内容
をスナップショット記憶部に格納する。命令が分岐命令
の場合は、仮想スタックの内容を分岐先命令のあるスナ
ップショット記憶部に格納する。もし以前別の命令実行
時に同じスナップショット記憶部に再び仮想スタックの
内容を格納する場合は、その仮想スタックの内容と、既
に格納されている内容と比較し、スナップショットと仮
想スタックの間に違いが生じた場合は本実行を禁止する
ことによって、前方向、後方向の分岐を含むプログラム
コードも型検査を行なうことができる。
【0005】しかしながら、従来方式1では、データス
タックの型に対してプログラムコード中の命令が唯一つ
の制約を持つことを前提として記載されいる。例えば、
あるXという命令がA型のデータまたはB型のデータの
みを扱うことができるという制約を有していた場合、従
来方式1の手法によってあるスナップショットにA型が
記録され、その後同一スナップショットにB型が現れた
場合、本来有害ではないプログラムコードの本実行を禁
止してしまう。
【0006】前記の制約範囲が唯一つに定まらない問題
に関して、「1995年11月、ザ・ジャバ・バーチャ
ル・マシン・スペシフィケーション(The Java Virtual
Machine Specification) Sun Microsystems社著、1
25〜137頁」(以下、従来方式2と記す)は、問題
の1つの解決方法を提案している。
【0007】この従来方式2では、複数の異なるデータ
型が同一スナップショットに存在する必要のある場合、
それらのデータ型全てを包含するデータ型を決定して新
たにスナップショットに記録し、決定されたデータ型を
使用して、そのスナップショット位置から始まるプログ
ラムコードの実行を再度実行することで、型検査をやり
直す手法が紹介されている。
【0008】
【発明が解決しようとする課題】しかしながら、前記に
記述の通りの従来方式1及び従来方式2によるプログラ
ムコード型検査には問題点がある。従来方式1の第1の
問題点は、プログラムコード中の命令が持つデータ型の
制約が、複数のデータ型を範囲として許容する命令を有
した基本マシン命令セットに於いて、正しい型検査を行
なうことができないことである。すなわち、従来方式1
の方法では、プログラムコードの同じ地点に於いて、仮
想実行のデータ型が異なる場合を、全て検査エラーとし
て認識する為である。また、従来方式1を複数のデータ
型を範囲として許容する命令に対応させようとしても、
再実行を含まない従来方式1のアルゴリズムでは、変化
したデータ型を再検査することは不可能である。
【0009】また、従来方式1の第2の問題点は、ロー
カル変数のデータ型検査を正しく行なえないことであ
る。その理由は、従来方式1がプログラムコード検査の
為に記憶するスタックスナップショットにローカル変数
の状態を含めていない為に、分岐命令が現れた際、ロー
カル変数領域のマッチングができないことにある。この
ローカル変数にデータ型を著しく侵害するデータが含ま
れていたとしても、従来方式1では検査を通過してしま
う。
【0010】次に、従来方式2の第1の問題点は、プロ
グラムコードによっては非常に長い実行時間を必要とす
ることである。すなわち、スタックのスナップショット
が、個々のスタック内容に関して、そのデータ型制約の
範囲の変更を必要とする度に、プログラムコードの検査
の為の仮想実行を繰り返し実行しなければならない為で
ある。これは、従来方式1が元来目的としていた効率的
実行の達成を著しく妨げている。
【0011】また、従来方式2の第2の問題点は、保持
する必要のないローカル変数の型情報を保持し続けるこ
とによって、記憶装置を浪費することである。その理由
は、従来方式2がプログラムコード中で、将来的に使用
する可能性のなくなったローカル変数を見究める手段を
持たない為に、それらの情報を消去できないことにあ
る。
【0012】このように、複数のデータ型を制約の範囲
として許容する命令を有した基本マシン命令セットに於
いて、その本実行の前に、プログラムコードの各命令の
データ型に関する制約が正しく守られているかどうかの
検査を、効率的に行なう方式は存在していない。
【0013】[発明の目的]本発明の目的は、上記の問
題を解決し、複数のデータ型を制約の範囲として許容す
る命令を有した基本マシン命令セットを用いて記述され
たプログラムコードの検査を、再実行を伴わない手法を
用いて高速に、確実に行なうことにある。
【0014】また、本発明の他の目的は、個々のデータ
の有効範囲を的確に見究めることによって、有効な記憶
装置利用を推し進めることにある。
【0015】
【課題を解決するための手段】本発明の第1のシステム
は、検査対象プログラムを仮想実行することによってプ
ログラムの個々の命令が扱うデータ型を侵さないことを
保証することにより、プログラム本実行時の型検査を省
略し、高速化を図るプログラム検査システムであり、上
記システムはプログラム中の各命令の仮想実行を行なっ
て仮想実行状態に反映させる為の仮想実行手順と、仮想
実行時にデータが取り得る型の範囲制限を設定するデー
タ制約設定手順を有し、また、プログラム中の分岐によ
って合流する仮想実行状態をマージさせ、矛盾がないか
どうかを検査するマージ検査手順及び、取り得る型の範
囲が変更されたデータについて、以降のプログラムへの
影響を、プログラムを再実行することなく反映させる為
の後方反映手順を有することを特徴とする。
【0016】また、前記仮想実行手順はプログラムの仮
想実行を行ない、仮想実行状態記憶部に実行状態のデー
タの型を設定する。同時にデータ制約設定手順は、実行
状態のデータが取り得る範囲を制限するデータ型制約を
設定する。上記仮想実行手順及びデータ制約設定手順に
よって、仮想実行が一度終了しているプログラム中、部
分の仮想実行状態には、必ずそのプログラム部分のデー
タ型制約が設定される。また、仮想実行状態中のデータ
が、各々が設定された制約を満たしていることを確認す
ることにより、プログラム中の各々の命令が、各々の命
令の持つ型制約に違反しないことを検査することができ
る。
【0017】また、分岐によりプログラムの複数の部分
が合流する場合、上記マージ検査手順が、各々の仮想実
行状態のデータをマージする、すなわち、各々の仮想実
行状態の共通部分のみを使用可能状態として仮想実行を
継続させることにより、また、それによってデータが変
化した場合、そのデータからコピーあるいはマージの形
で生成された全てのデータに対し、上記後方反映手段が
データ変更を反映させることにより、一度仮想実行が終
了したプログラム部分について、プログラムの合流に起
因する、プログラム仮想実行の再実行を必要としない高
速なプログラム検査を実現することが可能になる。
【0018】本発明の第2のシステムは、検査対象プロ
グラムを仮想実行することによってプログラム中で扱わ
れる個々のデータの有効範囲を特定することにより効率
的な記憶領域使用を実現する記憶領域管理システムであ
り、上記システムは、プログラムコードを本実行する前
に仮想実行を行なう為の仮想実行手順と、その仮想実行
手順の処理中に、そこで扱う全てのデータについて、各
々の最終使用位置を判定する有効範囲決定手順と、その
有効範囲決定手順によって、設定された情報に従って、
必要なくなった記憶領域の解放を行なう記憶領域解放手
順を有することを特徴とする。
【0019】本発明の第2のシステムは、本発明の第1
のシステムの適用か、その他の理由によるプログラムコ
ード本実行前の仮想実行を行なうシステムを適用する仮
想実行手順を実行し、その仮想実行手順の処理中に、有
効範囲決定手順はそのプログラム中で扱われる各々のデ
ータが使用される最終位置を的確に見究め、その情報を
仮想実行後も保持しておく。
【0020】また、記憶領域解放手順は、プログラムの
本実行時に適用され、各々のデータが、先ほど有効範囲
決定手順が設定した最終使用位置に達した場合、即座に
当該記憶領域の解放を行なうことによって、無駄のない
効率的な記憶領域管理を実現することができる。
【0021】また、本発明は、個々の命令が処理するデ
ータ型に制約を有するプログラム命令セットを用いて記
述されたプログラムコードにおいて、その制約が正しく
満たされているかどうかを本実行前の仮想実行によって
前記プログラムコードを検査するプログラムを記録する
記録媒体において、前記仮想実行時に現れる各々のデー
タに対して、型情報として許容できる下限の型と、その
データの使用方法に基づく上限の型を設定し、前記各デ
ータが取り得る型の範囲を推論する為のデータ型推論ス
テップと、前記プログラムコード中に存在する分岐命令
に起因する、複数のパスの合流地点に於けるデータをマ
ージし、各々のデータの共通項をその地点の新たなデー
タとして設定するためのマージステップと、前記マージ
手段によってデータが変化した際、前記データの変化に
影響を受けるデータ全てに対して、変化の内容を反映さ
せる後方反映ステップと、前記後方反映手段が反映作業
の対象となるデータの選択に利用するために、前記マー
ジ手段のマージ時にデータが変化した場合、変化前のデ
ータと変化後のデータとを関連付けるための後方関連付
けステップと、を備え、前記データ型推論ステップが、
検査中の前記プログラムコードが前記データ型に制約を
侵している箇所を発見した場合、前記プログラムコード
の前記本実行を禁止するための判定ステップを含み、前
記プログラムコードを検査するためのプログラムを記録
することを特徴とする。
【0022】
【発明の実施の形態】本発明による実施形態について、
図面を参照しつつ詳細に説明する。尚、ここで記述する
実施形態については、本発明の好適実施形態を、例とし
て述べているものであり、本発明特許の請求範囲を制限
するものではない。本発明により求める範囲は、前記請
求項目に記された内容をもって規定される。
【0023】[第1の実施形態]次に、本発明の第1の
実施形態について、図面を参照して詳細に説明する。
【0024】図1は本発明の第1の実施形態の外的構成
である。第1の実施形態の構成は、コンピュータまたは
それに類する機器構成10と11、及びそれらを接続す
るインターネット、LANその他のネットワーク12で
構成される。機器構成10はキーボード等の入力装置1
06と、ディスプレイ、プリンタその他の出力装置10
5と、CPUその他の演算装置102と、ネットワーク
12に接続する為の通信装置104と、プログラム、デ
ータなどを保存する為の記憶装置101を含む。必要で
あれば記憶装置より性能の高い一時記憶装置103を加
え、記憶装置101の役割の一部を担わせることもでき
る。
【0025】この実施形態の例では、機器構成10と同
様の構成を備えた機器構成11を含んでいる。機器構成
11は、機器構成10と同様に、入力装置116、出力
装置115、演算装置112、通信装置114、記憶装
置111を含む。機器構成10と機器構成11は互いの
通信装置104、114をネットワーク12によって接
続している。また、機器構成10は本発明の根幹である
ベリファイヤ108を含み、機器構成11はプログラム
コード117を含んでいる。以上が、第1の実施形態の
外的構成の例である。
【0026】ここで、機器構成10を使用しているユー
ザが、機器構成11に含まれるプログラムコード117
をネットワーク12を通じて機器構成10の内部に読み
込んで実行したい場合を考える。
【0027】プログラムコード117は、それが持つ命
令1つ1つが操作することのできるデータ型の制約を有
する命令セットで構成されているプログラムコードであ
る。
【0028】このとき、プログラムコード117が機器
構成10にとって信頼のおけるコードであるとは限らな
い。そこで機器構成10は、機器構成11から読み込ん
だプログラムコード117を読み込んでから実行するま
での間にベリファイヤ108にプログラムコード117
の検査をすることによって、プログラムコード117の
実行前にスタック溢れ、スタック枯渇、型操作の違反な
どの危険なコードを事前に排除することができる。
【0029】また、プログラムコード117の実行時
に、これらの危険操作の判定を行なわなくて済み、実行
を高速化することができる。
【0030】また、ネットワーク12を介する必要はな
く、ベリファイヤ108と同じ機器構成10の中にある
プログラムコード107に対しても、実行前にベリファ
イヤ108を利用して検査することによって、危険な実
行をあらかじめ回避する、あるいは実行を高速化するこ
とが可能となる。
【0031】以下では、そのベリファイヤ108のプロ
グラムコード検査手段について説明を行なう。
【0032】図2は本発明の第1の実施形態のベリファ
イヤ108内部の機能構成である。図2は本発明のベリ
ファイヤで実行中に必要となる情報を記憶させるべき、
記憶装置区域を図表化したもので、ベリファイヤ108
本体と、前述のデータ型制約を持った命令セットで書か
れているプログラムコード21と、ベリファイヤ108
が現在プログラムコード21のどの部分を検査すべきか
を示す仮想実行可能ポイントリスト22と、検査の実行
中に必要な仮想スタック内容などを保持する仮想実行状
態23と、後に説明する分岐元スナップショットテーブ
ル24と、合流点スナップショットテーブル25から成
る。
【0033】プログラムコード21は、個々の命令21
1が扱うことのできるデータ型に制約を有している命令
セットの列によって構成されている。
【0034】実行可能ポイントリスト22は、プログラ
ムコード21の中で、検査を開始することのできるポイ
ントを格納するもので、検査に必要な仮想実行状態が算
出されている即時実行リスト221と、検査に必要な仮
想実行状態が完全には算出されていない待機リスト22
2と、検査に必要な仮想実行状態が完全に算出されない
まま検査を強行し、残りの仮想実行状態の算出を待って
いる最終検査リスト223の三部分から成る。
【0035】また、ベリファイヤ108はプログラムコ
ード21の先頭から検査を始め、検査の途中の実行状態
を分岐元スナップショットテーブル24や合流点スナッ
プショットテーブル25に格納して、各々の検査再開ポ
イントをこの仮想実行可能ポイント22で管理する。
【0036】仮想実行状態23は、ベリファイヤ108
がプログラムコード21の仮想実行を行なう際の実行状
態を保持する。仮想実行状態23はプログラムコード2
1のどの部分を実行しているかを示すプログラムカウン
タ231と、スタックに幾つのデータが積まれているか
を示すスタックカウンタ232と、現在のスタックのデ
ータ型の状態を示す仮想スタック233及び現在のロー
カル変数のデータ型の状態を示す仮想ローカル変数23
4で構成され、これらはベリファイヤ108が分岐元ス
ナップショットテーブル24や合流点スナップショット
テーブル25に情報を格納する為の元情報となる。
【0037】分岐元スナップショットテーブル24は、
プログラムコード21の中に分岐命令がある場合、その
分岐の数の分だけ情報が格納される。格納される情報
は、プログラムコード21のどの位置の命令かを示すオ
フセット241と、仮想実行状態23と同様のスタック
カウンタ242、仮想スタック243、仮想ローカル変
数244があり、さらに分岐先のオフセット241を全
て保持する分岐先リスト245を含む。
【0038】合流点スナップショットテーブル25は、
分岐元スナップショットテーブル24とは反対に、プロ
グラムコード21の中に分岐命令がある場合、それらの
分岐命令の分岐先オフセット251の分だけ情報が格納
される。格納される情報は、分岐元スナップショットテ
ーブル24と同様に、オフセット251、スタックカウ
ンタ252、仮想スタック253、仮想ローカル変数2
54、分岐元のオフセットを全て保持する分岐元リスト
256、さらにそのオフセット251を分岐先とする分
岐命令数を保持する合流数カウンタ255を含んでい
る。
【0039】仮想スタック233、243、253、及
び仮想ローカル変数234、244、254はいずれも
同じデータ構造を有しており、データ構造27への仮想
スタック及び仮想ローカル変数内の各データポインタ2
6で構成されている。
【0040】データ構造27はデータ型の下限を決定す
る型を格納するデータ271、データ型の制約条件(上
限)を格納するデータ制約272、及び同一の起源を有
するデータへのポインタである後方影響リスト273を
含む。
【0041】図3(A)は本発明におけるプログラム検
査機構のシステム概念図である。ベリファイヤ108
は、プログラムコード21から命令を読み出し、その仮
想実行を行なう。仮想実行によって変化するスタック値
やローカル変数値は、仮想実行状態23に書き込まれ、
実際の本実行と同様の変数操作がシミュレートされる。
プログラムコード21中に分岐命令が存在する場合、そ
の分岐元命令にはそれに対応する分岐元スナップショッ
トと、分岐先命令にはそれに対応する合流点スナップシ
ョットが、それぞれ分岐元スナップショットテーブル2
4、合流点スナップショット25内に生成され、仮想実
行がそれらの命令に来た時点の仮想実行状態23の内容
を保持する。
【0042】各々の仮想スタック、仮想ローカル変数
は、変数の内容を示すデータ構造27を指し示す各デー
タポインタ26を記憶している。ベリファイヤ108
は、プログラムコード21の命令を次々に仮想実行し、
その結果変化したデータ構造を各々のデータ構造27に
反映していく。
【0043】図3(B)はデータ構造のデータの変更、
及び本発明の基本理念について説明した図である。図3
(B)では、プログラムコード304の場合を例として
説明している。この例はクラス階層を持つオブジェクト
指向プログラムに於ける例であり、クラス階層305は
この例の前提となるクラスの上下関係を示している。こ
の場合、データ構造はステップ301、302、303
のような手順で変化していく。
【0044】まず、ステップ301で「load B」の命令
3041を仮想実行し、Bというデータをロードする。
この際、仮想スタックの内容を表すデータ構造306が
生成され、そのデータにBが書き込まれる。
【0045】同様に、ステップ302で「load A11」の
命令3042を仮想実行し、A11というデータをロー
ドする。この際、仮想スタックの内容を表すデータ構造
307が生成され、そのデータにA11が書き込まれ
る。
【0046】続いて、ステップ303で「B.Invoke
(A)」の命令3043(Bの関数をAを引数にして呼び
出す)を仮想実行すると、データ構造306、307は
「関数B」、「引数A」という限定されたデータとして
使用された為、データ内容に制約が掛けられる。この場
合はデータ構造306はBとして使用された為、データ
制約にBが書き込まれる。一方のデータ構造307はA
として使用された為、データ制約にAが書き込まれる。
【0047】このようにして、各々のデータ構造は、各
々のデータが取り得るデータの最大値(下限)と最小値
(下限)による範囲が決定される。図3(B)の例で
は、データ構造306は上限、下限ともにBである為、
クラス階層305内の範囲309のようにデータがBに
限定される。一方のデータ構造307は、上限がA、下
限はA11であり、取り得るデータの範囲は308のよ
うに幅を持って推測される。
【0048】このように本発明では、各々のデータを、
そのデータが取り得る範囲によって表現する。これらの
上限、下限が逆転した場合、つまり下限を下回る上限を
設定しようとした時、あるいは上限を上回る下限を設定
しようとした時、本発明によるプログラム検査は、その
プログラムコードを有害と判定し、本実行を禁止する。
以上が、本発明の基本となる動作の概要である。
【0049】以下では、これらの情報を利用して、プロ
グラムコード21を実際に検査する手法の好適実施形態
についてについて、順を追って説明していく。
【0050】図4はプログラムコード21の検査完了ま
でのステップをフローチャートに表したものである。図
4(a)のステップ41はプログラムコードを記憶装置
上に読み出すプロセスであり、本発明の前処理に当たる
ものである。図4(a)のステップ44は本発明によっ
て導き出されたプログラムコードの検査結果を受けて、
その実行可否を判定するステップであり、本発明の後処
理に当たるものである。そして図4のステップ42及び
ステップ43が本発明の根幹を成す処理となる。
【0051】以後、図4(a)のステップ42をパス
1、図4(a)のステップ43をパス2と記述する。パ
ス1では、プログラムコード21の中の分岐命令を検索
し、その分岐元、分岐先の情報を前記の分岐元スナップ
ショットテーブル24及び合流点スナップショットテー
ブル25に格納する。
【0052】パス1は図4(b)におけるステップ42
1及び422の手順に分かれ、各々をパス1−1、パス
1−2と記述する。
【0053】図5、図25はパス1−1のフローチャー
ト及び概念図を、図6、図26はパス1−2の フロー
チャート及び概念図を、それぞれ示している。
【0054】パス1−1では、まず手順501で、実行
開始位置をプログラムコード21の先頭に設定し、プロ
グラムコード21の各々の命令に対し、分岐命令かどう
かを判定していく。図5における502の判定手順で分
岐命令でないと判断されたものは、他の手順を全てパス
し、次の命令の検査に移る。分岐命令であった場合、現
在のオフセットを分岐元スナップショットテーブルに追
加記録し(手順503)、その分岐先リストに、その命
令から分岐する可能性のある全ての分岐先のオフセット
を記録する。
【0055】次に、各々の分岐先について、手順504
〜506を行なう。分岐先のオフセットがまだ合流点ス
ナップショットテーブル25に登録されていなければ
(手順504)、合流点スナップショットテーブル25
に分岐先のオフセット251にオフセットを記録する。
そして次に、その分岐先に対応する合流点スナップショ
ットの合流数カウンタに1を加え(手順505)、その
合流点スナップショットの分岐元リストに、分岐命令の
あったオフセットを追加する(手順506)。全ての分
岐先についてこの処理が終了したら(手順507,手順
508)、次の命令の検査に移る。
【0056】この手順をプログラムコードの全ての命令
について行ない、このプログラムコードの全ての分岐関
係を分岐元スナップショットテーブル及び合流点スナッ
プショットテーブルに格納する。
【0057】図25はあるプログラムコード2400の
パターンに於けるパス1−1の例を示している。プログ
ラムコード中の矢印2408〜2411はプログラムコ
ード2400中の分岐を示す。ここでパス1−1はま
ず、プログラムの先頭からプログラムコード2400を
先頭から調べる。命令2401が分岐命令なので、命令
2401に対応する分岐元スナップショット2420を
分岐元スナップショットテーブルに追加し、分岐先リス
トに分岐先命令である2405のオフセットを追加する
(a)。さらに分岐先命令である2405が合流点スナ
ップショットテーブルに登録されていないことを確認
し、2405に対応する合流点スナップショット243
0を合流点スナップショットテーブルに追加する
(c)。合流点スナップショット2430の分岐元リス
トには分岐元である2401のオフセットを追加する。
【0058】同様の手順を繰り返すことにより、分岐元
スナップショット、合流点スナップショットには図25
の分岐元スナップショットテーブル(24)2420〜
2423及び合流点スナップショットテーブル(25)
2430〜2432のようなが情報が格納される。
【0059】続いて、図6に示すように、パス1−2で
は、再びプログラムコードの先頭から検査を始め(手順
601)、合流数の調整を行なう。図6の手順602に
於いて、現在検査している命令の次の命令が合流点スナ
ップショットテーブル25に格納されているかどうかを
調べ、格納されていなければ次の命令の検査に移る。も
し、格納されていた場合、手順603により現在検査中
の命令が、次の命令を次の実行命令としているかどうか
を調べる。ここで「次の命令」とはプログラムコード中
の並びで次順に当たる命令を示し、「次の実行命令」と
はプログラムコード実行時に現在の命令の次に実行され
る可能性のある命令を示している。
【0060】図25の例では、命令2404は絶対分岐
命令である為、次の命令2405が次の実行命令ではな
い。
【0061】図6の手順603では、前記の定義におい
て現在の実行命令の次の命令が次の実行命令であるかど
うかを判定する。もしyesである場合、手順604で
次命令の合流点スナップショットの合流数カウンタを1
加算する。
【0062】先の図25のプログラムコード2400の
例では、図26に示すように、命令2403のみがこの
パターンに該当する為、命令2403の合流数カウンタ
が2から3に変更される。
【0063】以上のパス1−1、パス1−2を全て終了
すると、パス1は完了し、図4に於けるステップ43
(パス2)による「プログラムコード検査ステップ(ベ
リファイ)」の実行に移る。
【0064】図7〜図24は、図4に於けるステップ4
3(パス2)の内容を示したフローチャートである。パ
ス2では、またプログラムコードの先頭から検査を開始
する。パス2は前処理であるパス1を受け、プログラム
コードの正当性を実際に検査するアルゴリズムである。
【0065】図7はパス2全体の流れを示したフローチ
ャートである。まず最初に手順701で、プログラムコ
ードの先頭命令に対応した合流点スナップショットが作
成されているかどうかを調べる。作成されていれば、先
頭命令は待機リストに、作成されていなければ、先頭命
令は即時実行リストに追加される。
【0066】以降は、仮想実行可能ポイントリスト22
により、即時実行リスト221、待機リスト222、最
終検査リスト223の3つのリストを監視し、即時実行
リスト221が空でない場合は、まず即時実行リスト2
21に入っているオフセットが指す命令から仮想実行を
開始する。もし即時実行リスト221が空の場合は、同
様に待機リスト222が空かどうかを調べ、空でない場
合は待機リスト222に入っているオフセットが指す命
令から仮想実行を開始する。即時実行リスト221、待
機リスト222共に空である場合は、最終検査リスト2
23が空かどうかを調べ、空でない場合は最終検査リス
ト223に入っているオフセットが指す命令の最終検査
を行なう。
【0067】上記の検査中にいずれか一箇所でも検査に
失敗することがあれば、パス2はベリファイを偽(fa
il)と判定し、手順711でプログラムコード検査結
果を偽と確定する。いずれの箇所でも偽り(fail)
と判定されなかった場合は、手順710でプログラムコ
ード検査結果を真と確定する。
【0068】図8、図9、図10は図7の手順705、
つまり即時実行リストの処理内容をフローチャートにし
たものである。ベリファイヤ108はまず即時実行リス
トからオフセットを1つ取り出す。オフセットが複数積
まれている場合は、最後に積まれたものから取り出すの
が実行効率が良いが、オフセットを取り出す順序は結果
に影響を与えない(手順801)。
【0069】次に、今取り出したオフセットに対応する
合流点スナップショットに、そのオフセットを分岐先と
する分岐元スナップショット全ての仮想スタック、仮想
ローカル変数をマージし(手順802)、その結果をこ
の合流点スナップショットの仮想スタック、仮想ローカ
ル変数に設定する。このオフセットに合流する命令は、
分岐命令によるものと、このオフセットを次の実行命令
と判定した前命令があり、前者については各々が保持す
る分岐元スナップショットテーブル24から分岐元スナ
ップショット242〜246を参照する。
【0070】後者については、このオフセットを次の実
行命令と判定した前命令であり、前命令を仮想実行した
際にその仮想実行状態を、このオフセットの合流点スナ
ップショットに格納し、マージの際はそれを参照する。
なお、即時実行リストに格納されていたオフセットは、
このオフセットに合流する全ての命令の仮想実行状態を
スナップショットとして格納済みであることが保証され
ているオフセットである。
【0071】合流点スナップショットの仮想スタック2
53、仮想ローカル変数254、スタックカウンタ25
2の生成が完了したら、同内容を仮想実行状態23にコ
ピーし、プログラムコードの仮想実行を開始する。この
仮想実行は次の合流点に達するまで、あるいは次命令が
「次の実行命令」ではない命令にたどり着くまで続けら
れる(手順806,807)。
【0072】図9に示すように、仮想実行中は、各々の
命令に対し、スタック操作の検査901、ローカル変数
操作の検査902、分岐命令の検査903を、各命令の
持つ実行順序と同様の順序で実行し、各命令の正当性を
検査する。例えば、ローカル変数からデータを読み出
し、そのデータをスタックにプッシュする処理を一命令
で行なう命令の場合、処理804で一度目は処理902
を行ない、仮想ローカル変数からデータポインタを読み
出して、続いて二度目の処理804では処理901を行
ない、その際に処理902で読み出したデータポインタ
を仮想スタックにプッシュする。
【0073】もしこれらの手順のいずれかでfailと
判定された場合は、即時実行リスト処理705自体がf
ailとなり、処理711でベリファイ全体も検査結果
が偽と判定される。
【0074】図10に示すように、仮想実行が、図8の
810に到達して終了した場合は、即時実行リストの処
理705は正常判定(ok)を返し、図8の812に到
達して終了した場合は、即時実行リストの処理705は
異常判定(fail)を返す。図8の811に到達して
終了した場合は、次の命令が合流点であると判定した為
の終了であるため、次の命令の合流点スナップショット
に対して、現在の仮想実行状態を反映させる。
【0075】図10は即時実行リストの処理705のう
ち、次の命令の合流点スナップショットに反映させる部
分の処理をフローチャートにしたものである。図10の
810〜812は図8の810〜812に対応してお
り、811が次命令が合流点のケースになる。
【0076】まず、次の命令の合流点スナップショット
の仮想スタック、仮想ローカル変数、スタックカウンタ
が既に書き込み済かどうか調べ(手順1001)、書き
込み済でなければ、現在の仮想実行状態23の内容をそ
のまま次の命令の合流点スナップショットに書き込む
(手順1002)。書き込み済である場合、つまり他の
分岐等が先にこの合流点スナップショットに書き込んで
しまっている場合は、それと現在の仮想実行状態をマー
ジしてこの合流点スナップショットの仮想スタック、仮
想ローカル変数、スタックカウンタを決定する(手順1
003)。その際、マージに失敗したら即時実行リスト
処理705自体がfailとなり、図7に示す処理71
1で、ベリファイ全体も偽と判定される。マージ処理の
内容及びどのような場合に失敗するかについては、後述
する。
【0077】手順1002あるいは手順1003を終え
て、手順1004にたどり着いたら、次命令の合流点ス
ナップショットの合流数カウンタから1減算する(手順
1004)。この値は、その合流先命令に合流する命令
のうちまだ仮想実行状態が定まっていないものの数を示
していおり、手順1005でこの値が0になったかどう
かを判定する。もしこの合流数カウンタが0の場合は、
その合流先命令が最終検査リストにあるかどうかを判定
し(手順1006)、もしあればその合流先命令の最終
検査を行なう(手順1007)。もしなければその合流
先命令のオフセットを即時実行リストに加える(手順1
008)。
【0078】もしこの合流数カウンタが0でない場合
は、その合流先命令が最終検査リストにあるかどうかを
判定し(手順1009)、もしなければ、次手順101
0で待機リストにあるかどうかを判定する。その合流先
命令が待機リストにない場合は、その合流先命令のオフ
セットを待機リストに加える。
【0079】この処理は、合流点の命令に於いて、全て
の合流元の合流が済んでいるかどうかを確認している。
全ての合流元が合流済み(マージする為の仮想実行状態
を格納済み)の場合、その合流点から始まる仮想実行は
即時実行リスト処理として行なわれ、実行後に余分な作
業を必要としない。合流元のうちいくつかが合流してい
ない(マージする為の仮想実行状態を未格納な)場合、
その合流点から始まる仮想実行は待機リスト処理として
行なわれ、実行後に残りの合流していない合流元の仮想
実行状態格納を待つ形になる。全ての合流元が合流を済
ませたら、改めて今度は最終検査リスト処理を行なう。
【0080】図11、図12は図7の手順707、つま
り待機リストの処理内容をフローチャートにしたもので
ある。動作はほとんど即時実行リスト処理705と同じ
内容のものである。本手順は即時実行リストが空の場合
(手順704)に続いて、処理される。
【0081】まず、手順1101でプログラムカウンタ
を待機リストの最後の命令にセットし、待機リストから
オフセットを1つ取り出し、そのオフセットを手順11
02で最終検査リストに追加する。次に手順1103
で、今取り出したオフセットに対応する合流点スナップ
ショットに、そのオフセットを分岐先とする分岐元スナ
ップショットのうち、仮想実行状態を格納済みのものの
みを探しだし、その仮想スタック、仮想ローカル変数を
マージし、その結果をこの合流点スナップショットの仮
想スタック、仮想ローカル変数に設定する(手順110
3)。
【0082】この時点では全ての合流元について仮想実
行状態のマージが終了しておらず、後に最終検査にて修
正することを前提として、即時実行リスト処理の時と同
様の仮想実行を開始する点に留意する。その後の処理は
手順803−807,1001−1011,1111−
1113に示すように、即時実行リスト処理705と全
く同様に行なう。
【0083】図13は図9の手順901、つまりスタッ
ク操作の検査を行なう処理の内容をフローチャートにし
たものである。ここでは命令がスタック操作時にデータ
型違反及びスタックオーバーフロー、スタックアンダー
フローが無いかどうかを判定する。
【0084】まず手順1301で、即時実行リストの仮
想実行(705)中、および待機リストの仮想実行(7
07)中に於いて、現在仮想実行している命令がスタッ
クからデータをポップするかどうかを調べる。
【0085】スタックからデータをポップする命令の場
合、手順1302で現在のスタックカウンタを調べ、も
しスタックカウンタが0ならば、スタックアンダーフロ
ーと判定してfailを返す。ポップできるデータがス
タックにある場合は、命令が持つデータ制約と現在のス
タックのトップのデータ型がマッチするかどうかを調べ
る(手順1303)。実際に仮想スタックに格納されて
いるのはデータポインタ26であり、マッチングはその
データポインタ26が指し示すデータ構造27をもって
行なう。
【0086】ここで、マッチしない場合は型制約違反と
判定してfailを返す。マッチする場合は、手順13
04で命令が持つデータ型制約がそのデータの持つ型制
約より厳しいか否かを判断し、厳しければ、手順130
5で命令が持つデータ型制約をそのデータの制約にす
る。正常にデータポインタをスタックからポップし、命
令が持つ型制約をポップしたデータポインタが指し示す
データ構造27のデータ型制約272として設定する。
この制約はこのデータが生成されてからここでポップさ
れるまでの間の制約として設定される。ポップ操作の対
象はデータポインタ26であり、データ構造27はポッ
プの対象ではないことに注意されたい。
【0087】次に手順1306で、現在仮想実行してい
る命令がスタックにデータをプッシュするかどうかを調
べる。
【0088】スタックにデータをプッシュする命令の場
合、手順1307で現在のスタックカウンタを調べ、も
しスタックカウンタが最大スタックサイズに等しいなら
ば、スタックオーバーフローと判定して、failを返
す。プッシュできる場合は、正常にスタックプッシュを
行ない、命令が持つ型制約をプッシュしたデータの型制
約272として設定する。ポップ処理と同様に、プッシ
ュ操作の対象もデータポインタ26であり、データ構造
27はポップの対象ではないことに注意されたい。
【0089】図14は図9の手順902、つまりローカ
ル変数操作の検査を行なう処理の内容をフローチャート
にしたものである。ここでは命令がローカル変数操作時
にデータ型違反及びにローカル変数領域外アクセスが無
いかどうかを判定する。
【0090】まず手順1401で、即時実行リストの仮
想実行(705)中、および待機リストの仮想実行(7
07)中に於いて、現在仮想実行している命令がローカ
ル変数からデータを読み出すかどうかを調べる。
【0091】ローカル変数からデータを読み出す命令の
場合、手順1402で読み出すローカル変数番号が0か
らローカル変数最大番号の間に入っているかどうかを調
べ、領域外ならばfailを返し、手順711に移行し
て検査結果を偽にセットする。領域内の場合は、命令が
持つデータ制約と指定ローカル変数のデータ型がマッチ
するかどうかを調べる(手順1403)。マッチしない
場合は型制約違反と判定してfailを返し、手順71
1に移行して検査結果を偽にセットする。マッチする場
合は正常にローカル変数のデータポインタ26の読み出
しを行ない、命令が持つ型制約を読み出したデータポイ
ンタが指し示すデータの持つ型制約より厳しいか否かを
判断し(手順1404)、データ構造27の型制約とし
て設定する(手順1405)。
【0092】次に手順1406で、現在仮想実行してい
る命令がローカル変数にデータを書き込むかどうかを調
べる。
【0093】ローカル変数にデータを書き込む命令の場
合、手順1407で書き込むローカル変数番号が0から
ローカル変数最大番号の間に入っているかどうかを調
べ、領域外ならばfailを返し、手順711に移行し
て検査結果を偽にセットする。領域内の場合は、正常に
ローカル変数にデータポインタ26の書き込みを行ない
(手順1410)、命令が持つ型制約を読み出したデー
タポインタが指し示すデータ構造27の型制約として設
定する(手順1411)。
【0094】図15は図8の手順805、つまり分岐命
令の検査を行なう処理の内容をフローチャートにしたも
のである。ここでは分岐命令に到達した場合、その命令
に対応する分岐元スナップショットに現在の仮想実行状
態を格納及び、その命令の分岐先の合流点スナップショ
ットの処理を行なう。
【0095】まず手順1501で、現在仮想実行してい
る命令が分岐命令かどうかを調べる。分岐命令の場合、
手順1502で現在の仮想実行状態をその命令の分岐元
スナップショットに格納する。続いて、分岐先各々につ
いて以下の処理を行なう。
【0096】手順1503で分岐先命令の合流点スナッ
プショットの合流数カウンタを1減算する。手順150
4でその値が0でない場合は、そこで処理は終了し、次
の分岐先を調べにいく(手順1510)。もし、分岐先
命令の合流点スナップショットの合流数カウンタが0の
場合は、その分岐先命令が最終検査リストにある場合は
(手順1505)、そのオフセットを取り出して最終検
査を行なう(手順1507)。分岐先命令が最終検査リ
ストにない場合、もし分岐先命令が待機リストにあれば
(手順1506)、それは削除する(手順1507)。
そして手順1508で分岐先命令のオフセットを即時実
行リストに追加する。
【0097】分岐命令が現れる度に、各々の命令の分岐
先命令の合流点スナップショットが更新されていき(手
順1511)、全ての合流点スナップショットは、その
合流数カウンタを見るだけで全ての合流元の仮想実行状
態が格納されたかどうかを知ることができる(手順15
10)。
【0098】図16、図17は図7の手順709、つま
り最終検査リストの処理内容をフローチャートにしたも
のである。最終検査リスト処理709は、即時実行リス
ト処理705、待機リスト処理707とは違い、プログ
ラムコードの仮想実行を行なう処理ではない。最終検査
リスト処理709は、ある合流点に於いて、即時実行リ
ストが空で(手順704)、待機リストが空で(手順7
06)、最終検査リストが空でないとき(手順70
8)、全ての合流元の仮想実行状態が格納される前に待
機リスト処理として仮想実行を行なってしまった場合、
その後全ての合流元の仮想実行状態が格納された時に、
再び仮想実行をすることなく矛盾性の判定を行なう処理
である。
【0099】図16において、ベリファイヤ108はま
ず、手順1601によって最終検査リストからオフセッ
トを1つ取り出す。そして次に、そのオフセットが示す
合流点の合流点スナップショットに対する最終検査を行
なう(手順1007)。
【0100】図16において、最終検査は3つの手順に
よって構成され、まず手順1602では、手順802の
時と同じく、その合流点の合流元全ての分岐元スナップ
ショットの仮想スタック、仮想ローカル変数、及びスタ
ックカウンタをマージし、その結果をその合流点の仮想
スタック、仮想ローカル変数、スタックカウンタとす
る。次に手順1603で、その仮想実行状態がマージす
る前の仮想実行状態と比較して変化したかどうかを判定
し、変化がない場合は最終検査リスト処理はここで正常
終了する。もしマージ前と比較して変化がある場合は、
手順1604によって、変化したデータ各々について、
その後方影響リストに従って変更結果を関連するデータ
に反映させる。
【0101】図17は図16に於ける手順1604の処
理内容を示している。まず手順1701によって変化の
あった最初のデータを選択し、そのデータの後方影響リ
ストにエントリがあるかどうかを調べる(手順170
2)。エントリがない場合は変化のあった次のデータに
検査を移す(手順1705)。エントリがあった場合
は、手順1703によってそのデータと影響先のデータ
をマージして影響先のデータを更新する。マージに失敗
した場合、すなわちマージしたデータが矛盾を含んでい
た場合は、最終検査リスト処理はfailを返し、手順
711に移行して検査結果を偽にセットする。
【0102】影響先のデータがマージによって変化した
場合は、その影響先データについて最終検査を行なう。
すなわちそのデータのみに対し、手順1604を再帰的
に実行する。この再帰実行はマージされた影響先データ
に変化がなくなるまで続けられる。
【0103】上記処理を、変化のあった全てのデータに
対して完了した場合、最終検査リスト処理は正常終了す
る。その後、図4におけるステップ44に移行する。そ
の間にどこか一箇所でもfailを返した場合は、最終
検査リスト処理はfailを返す。
【0104】図18、図19、図20は仮想スタック及
び仮想ローカル変数のマージ処理をフローチャートにし
たものである。図8の802、図10の1003、図1
1の1103、図12の1003、図16の1602の
処理はいずれも、この図20のフローによって処理され
る。
【0105】図20は、仮想スタック及び仮想ローカル
変数のデータマージ処理の全体を示したフローチャート
である。
【0106】まず、手順2001によって、マージの対
象となる双方の仮想スタックのスタックポインタが同位
置にあることを確認する。もしスタックポインタが同一
でなければ、マージ処理2000はfailを返し、手
順711に移行して検査結果を偽にセットする。
【0107】次に、図18に示すように、仮想スタック
の各々のデータポインタに対し、データマージ処理18
00を行なう。スタックの先頭から、スタックポインタ
位置までの全てのデータをマージし、そのうち1つでも
failを返したものがあればマージ処理2000はf
ailを返し、手順711に移行して検査結果を偽にセ
ットする。
【0108】同様に、図19に示すように、仮想ローカ
ル変数についても、全てのデータポインタに対して、デ
ータマージ処理1900を行なう。
【0109】図18は仮想スタックのデータポインタを
マージする処理のフローチャートを示している。手順1
801で各々のデータポインタが等しいデータ構造を指
し示しているかどうかを調べ、等しい場合はマージ後の
データポインタもそれらと等しいデータポインタを設定
する(手順1802)。等しくない場合、手順1803
によって、2つのデータポインタが指す各々のデータ構
造を調べ、両者がマージ可能でない場合は、手順180
0はfailを返し、手順711に移行して検査結果を
偽にセットする。マージ可能の場合、手順1804で両
者をマージした新しいデータ構造を生成し、マージ後の
データポインタをそのデータ構造に対応づける(手順1
805)。更に、マージ前の各々のデータポインタが指
すデータ構造の後方影響リストに、新しく生成したデー
タ構造を追加する(手順1806)。
【0110】図21は2つのデータポインタが違うデー
タ構造の値を指している場合のマージ処理を摸式的に示
している。なお、この例はクラス階層を持つオブジェク
ト指向プログラムに於ける例であり、クラス階層211
2はこの例の前提となるクラスの上下関係を示してい
る。OからAに階層し、A1−A11,A2のようにク
ラス分けされている。
【0111】図21において、データポインタ2102
はデータ構造2101を、データポインタ2103はデ
ータ構造2104を、それぞれ指している。この両者の
データポインタ2102,2103をマージすると、新
しいデータ構造2108が生成され、マージ後のデータ
ポインタ2107が新しいデータ構造2108を指す形
になる。また、この際、データ構造2101、2104
共に後方影響リストにデータ構造2108へのデータポ
インタ2110、2111が追加される。この後方影響
リストは、これらのデータ構造のデータが後に書き換わ
った場合、この後方影響リストに記載されているデータ
構造についても、その変更を反映しなければならないこ
とを意味している。
【0112】図22は2つのデータポインタが同一デー
タ構造を値を指している場合のマージ処理を摸式的に示
している。仮想スタック2124、2125に対応する
データポインタ2122、2123は、どちらも同じデ
ータ構造2121を指している。この両者のデータポイ
ンタをマージすると、新しいデータ構造は生成されず、
マージ後の仮想スタック2127のデータポインタ21
26は、やはり同一データ構造2121を指す。これに
より後方影響リストの作成(図18の手順1804、1
805、1806)及び最終検査1007の際の変更反
映作業(図16の手順1604)を削減すると共に、デ
ータの有効範囲を明確にすることが可能になる。
【0113】図23は、マージする手順1803を示す
仮想スタックに於いてデータ1とデータ2をマージし、
その結果をデータ1に反映する手順を示したフローチャ
ートである。手順2201によってマージする双方のデ
ータに共通する上位データ型が存在するかどうかを調
べ、存在しない場合は手順1803はfailを返す。
【0114】存在する場合、両者のデータに共通する上
位データ型のうち、最下位のものを選択し、データ1の
データに設定する(手順2202)。最後に手順220
3によって、書き換えられたデータ1のデータが、デー
タ1のデータ制約を満たすかどうかを調べ(手順220
3)、もしデータ制約を破るデータであった場合は、手
順1803はfailを返す。このマージ作業は、ある
データがその後の使用方法に於いて決定される制約条件
を持つ場合、そのデータにマージされるデータは、全て
その制約を満たすデータであることを保証する作業であ
る。
【0115】例をあげると、あるデータがA型として使
用された場合、そのデータには「A型より下位」という
制約条件が付く。以後、そのデータにマージされるデー
タは、少なくともA型以上の能力を持った(A型として
使用できる)データでなければならない。マージされる
データと、元のデータの共通上位データ型がA型より上
位である場合、つまり双方のデータ型の共通能力がA型
に満たない場合には、それ以降のプログラム実行時に、
A型として使用する部分が実行できなくなる為、このプ
ログラムの実行を停止する。
【0116】図24は、図19に示した手順1903に
よる仮想ローカル変数に於いて、データ1とデータ2を
マージし、その結果をデータ1に反映する手順を示した
フローチャートである。図23の手順2201と同様の
判定を行ない、そこでnoと判定された場合、手順23
03でそのデータを「使用不可型」とする。使用不可型
は、どのデータとマージしても使用不可型となる最上位
型であり、そのデータ位置はプログラム中での読み出し
を禁止される。すなわち、ローカル変数からデータを読
み出す作業は、読み出すデータの型をそのデータの制約
に設定するため、制約を設定した時点で、使用不可型が
それを満たさない為にfailを起こす。その他の作業
は図23と同様に行ない、仮想ローカル変数のマージが
完了する。
【0117】図27は、データマージ作業をJava等
のクラス階層をもったオブジェクト指向言語の例で示し
たものである。図27中の「O→A→A1,A2→A1
1の関連図」2611は、Javaのクラス階層を示し
ており、図中の矢印は親クラスから子クラスの継承を表
している。2611では、最上位クラスにO型があり、
O型の子クラスとしてA型、A型の子クラスとしてA1
型、A2型があり、さらにA1の子クラスとしてA11
型がある。プログラム2600には分岐が存在し、命令
2605の次の命令は命令2602に戻るようなプログ
ラムとする。
【0118】ここで、プログラムの先頭から仮想実行を
開始し、命令2601でスタックにA11型のデータを
生成したとする。仮想スタックに積まれたA11型のデ
ータへのポインタは、そのまま命令2602の合流先ス
ナップショットにデータポインタにも書き込まれる。こ
こで、命令2603でこのデータがA1型で使用された
とすると、そのデータ2607のデータ制約にはA1型
が設定される。これにより、命令2602にはA1型の
制約を満たせないデータはマージ不可となる。
【0119】そのプログラムの先で、命令2604で上
記の2601の時と同じスタック位置に、今度はA2型
のデータが上書きされたとすると、次の分岐命令260
5で仮想スタック2608の内容が仮想スタック260
2にマージされる。この時、データ1は2606のA1
1型と2608のA2型の上位クラスであり、2611
のクラス階層ではA型となる。よって図27の下図の2
610のように、データ構造2607のデータはA型に
変更される。この時、データ制約はA1型であったた
め、A型はA1型としての制約を満たしておらず、この
マージはfailする。
【0120】このマージ作業及びそれを利用したプログ
ラム検査機構は、当然ここで紹介したJavaのような
言語に限られるものではない。データ型に階層関係があ
り、データを扱う命令に、その命令が扱うことのできる
データの型が決められているようなプログラム言語であ
れば、どのようなプログラム言語にも応用することがで
きる。また、本発明の権利範囲は請求項に記載された内
容によってのみ規定される。
【0121】このように、各々のデータが、そのデータ
の型制約を有して、その制約を満たさないデータの合流
を防ぐ機構を作ることにより、データ型が変化した場合
に、従来技術2のような、その部分のプログラムの検査
を改めてやり直す作業が必要なく、高速に検査を終了す
ることが可能になる。
【0122】なお、上記プログラム検査方法の各ステッ
プをプログラムとしてコンピュータが読み取り可能な記
憶媒体に格納することが可能である。すなわち、図1に
ついて説明すれば、機器構成10,11とに一時記憶装
置103,113とが備えられ、プログラムコード10
7,117の検査を行うプログラムを一時記憶装置10
3,113に格納することができる。この一時記憶装置
103,113はフロッピーディスクやCD−ROM,
CD−R等のパッケージ媒体であってもよく、機器構成
10,11の主記憶装置としてもよい。
【0123】[第2の実施形態]次に、本発明の第2の
実施形態について説明する。
【0124】本発明の第2の実施形態は、プログラム実
行にスタックを利用した言語形式に依らないプログラム
言語に、第1の実施形態を応用することである。
【0125】スタックを利用した実行状態の保存は、プ
ログラム実行の利便性を高めるためのものであり、本発
明の基本的な部分には全く関係しない。スタック、ロー
カル変数等を分類せずに一元的に管理し、読み込み順序
などにも制限をも受けない通常の記憶領域読み書きのみ
を利用してプログラム実行を行なうプログラム言語に関
しても、第1の実施形態の「スタックスナップショッ
ト」を必要な記憶領域のスナップショットに変更するこ
とで、どのような記憶形態にも対応する。
【0126】例として、一般的な記憶部としてメモリを
用い、高速にアクセスするあるいは演算に使用する部分
のみレジスタに保存する一般的コンパイラ言語において
も、必要な記憶領域をスナップすることにより、第1の
実施形態と同様のプログラム検査が可能であり、高速性
等の効果も同様に受けることができる。
【0127】[第3の実施形態]次に、本発明の第3の
実施形態について説明する。本発明の第3の実施の形態
は、第1の実施形態を行なうことにより、各データがプ
ログラム中で使用される可能性のある区域を限定するこ
とによって、記憶領域のより効果的な解放を可能にする
記憶領域管理システムである。
【0128】第1の実施形態では、プログラム全体を検
査している為、各データがプログラムのどの部分で生成
され、使用され、また別のデータに上書きされることに
よって消去されるのかを、明確に把握することが可能で
ある。
【0129】図28はデータの生存期間を示した図であ
る。プログラム2700の中の命令2701で生成され
たデータ構造2708は、2702〜2705などの命
令によって使用されている。しかし従来手法2では、こ
のデータが2705以降使用されていないにも関わら
ず、データが別のデータに上書きされ、明示的に不必要
と判明する2706の時点になるまでは、データ構造2
708の記憶領域を解放する手段を有しなかった。
【0130】本発明の第1の実施形態では、全てのデー
タにおいて、各々のデータが必要とされている区間を割
り出すことが容易にできる為、プログラムの本実行時に
このデータの記憶領域を2705が終了した時点で解放
することを可能にするための情報を残すことができる。
これによりプログラム本実行時のデータ記憶効率を向上
させることができる。
【0131】[第4の実施形態]本発明の第4の実施形
態は、第1の実施形態を前提とした実行系に於いて、各
データの型情報を省略することによって実行効率、記憶
領域効率の向上を図った際、そのデータへのアクセスが
本実行時の実行系のみに限定されてしまわないように型
情報の復元を行なうことである。
【0132】第1の実施形態では、あらかじめプログラ
ムコードを検査することによって本実行時の検査を省略
し、実行速度を向上させることを可能にすると共に、本
実行で使用されるデータから型情報を省略することによ
って、データ記憶効率を向上させることを可能にする
が、その反面、プログラムコードの実行順序通りの手順
を踏んだ実行系以外のプロセスからアクセスしようとし
ても、型情報を失ったあとのデータの本来の型を知るこ
とができず、アクセスすることができない。
【0133】例として、プログラムコードの実行系とは
独立に動作するガーベージコレクションのプロセスがこ
れらの本実行中のデータの状態を検査したい場合など、
型情報を失ってしまったデータから、プログラムコード
本来の実行順序ではない方法でアクセスしたい場面は多
数存在する。
【0134】本発明の第4の実施形態では、第1の実施
形態を応用することで、これらの失われた型情報を、動
的に復元することを可能にする。すなわち、プログラム
コード中のある地点でのデータの型が必要になった場
合、第1の実施形態をプログラムの先頭から実行し、そ
の地点まで実際に仮想実行することで、その地点の型情
報を動的に割り出すことができる。
【0135】さらに、前記手順の高速化を進める為、プ
ログラム検査目的で第1の実施の形態を処理している際
中に、プログラムコード中のいくつかのポイントに於け
る型情報をキャッシュとして保持しておくことで、第4
の実施形態を実現する際には、それらのキャッシュ地点
のうち、型情報を必要としている現地点に最も近いキャ
ッシュ地点から復元処理を開始することによって、非常
に少ないステップで型情報の復元を可能にすることがで
きる。
【0136】第4の実施形態は、第1の実施形態が、ど
の地点からでも実行を開始できるという特徴を活かした
発明である。
【0137】
【発明の効果】本発明によれば、第1の効果は、複数の
データ型を制約の範囲として許容する命令を有した基本
マシン命令セットを用いて記述されたプログラムコード
を仮想実行を用いた方法によって検査する際、全てのプ
ログラムコードに対して1度のみの仮想実行しか必要と
しないことにある。これにより、プログラムコードの検
査速度が向上する。すなわち、1度目の仮想実行時に、
プログラム中で使用される各々のデータに対し、それが
生成されてから消滅するまでの間の全ての使用形態のう
ち最も厳しい制約について、記憶しておくことによっ
て、2度目からはその制約条件との適合性検査作業のみ
行なえば良いからである。また、データの内容が変更に
なった場合、関連するデータについて後ろ方向に変更内
容を反映させることによって、そのデータが到達しうる
全ての制約条件をチェックするすることが可能になるか
らである。
【0138】また、第2の効果は、個々のデータの有効
範囲を決定し、プログラム本実行時のデータ記憶時間を
必要最小限にすることによって効率的な記憶装置利用を
可能にすることにある。これにより、使用する可能性の
なくなったデータを、即座に別のデータを記憶する為に
解放することができる。すなわち、プログラム検査時の
仮想実行時に、同一データを同じデータポインタとして
処理する機構を有することで、データの最終使用位置を
特定し、その内容を記憶しておくことによって、本実行
時に最終使用位置を考慮した記憶領域解放作業を行なう
機構を有する為である。
【図面の簡単な説明】
【図1】本発明の第1の実施の形態に適用されるコンピ
ュータシステムのブロック図である。
【図2】本発明の第1の実施の形態の機能ブロック図で
ある。
【図3】本発明の第1の実施の形態における動作の具体
例を説明するブロック図である。
【図4】本発明の第1の実施の形態における動作を示す
フローチャートである。
【図5】本発明の第1の実施の形態における動作を示す
フローチャートである。
【図6】本発明の第1の実施の形態における動作を示す
フローチャートである。
【図7】本発明の第1の実施の形態における動作を示す
フローチャートである。
【図8】本発明の第1の実施の形態における動作を示す
フローチャートである。
【図9】本発明の第1の実施の形態における動作を示す
フローチャートである。
【図10】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図11】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図12】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図13】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図14】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図15】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図16】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図17】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図18】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図19】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図20】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図21】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図22】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図23】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図24】本発明の第1の実施の形態における動作を示
すフローチャートである。
【図25】本発明の第1の実施の形態における動作の具
体例を説明する図である。
【図26】本発明の第1の実施の形態における動作の具
体例を説明する図である。
【図27】本発明の第1の実施の形態における動作の具
体例を説明する図である。
【図28】本発明の第3の実施の形態における動作の具
体例を説明する図である。
【符号の説明】
10,11 コンピュータ(中央処理装置;プロセッ
サ;データ処理装置 101,111 記憶装置 102,112 演算装置 103,113 一時記憶装置 104,114 通信装置 105,115出力装置 106,116 入力装置 107,117 プログラムコード 108 ベリファイヤ 21プログラムコード 22仮想実行可能ポイントリスト 23仮想実験状態 24分岐元スナップショットテーブル 25合流点スナップショットテーブル 26ポインタデータ 27データスタック 211 命令スタック 221即時実行リスト 222待機リスト 223最終検査リスト 231プログラムカウンタ 232,242,252スタックカウンタ 233,243,253仮想スタック 234,244,254仮想ローカル変数 241,251 オフセット 245分岐先リスト 255合流数カウンタ 256分岐元リスト 271データ 272データ制約 273後方影響リスト 305 クラス階層
───────────────────────────────────────────────────── フロントページの続き (58)調査した分野(Int.Cl.7,DB名) G06F 11/28

Claims (18)

    (57)【特許請求の範囲】
  1. 【請求項1】 個々の命令が処理するデータ型に制約を
    有するプログラム命令セットを用いて記述されたプログ
    ラムコードについて、その制約が正しく満たされている
    かどうかを本実行前の仮想実行によって前記プログラム
    コードを検査するプログラム検査システムにおいて、 前記仮想実行時に現れる各々のデータに対して、型情報
    として許容できる下限の型と、そのデータの使用方法に
    基づく上限の型を設定し、前記各データが取り得る型の
    範囲を推論する為のデータ型推論手段と、 前記プログラムコード中に存在する分岐命令に起因す
    る、複数のパスの合流地点に於けるデータをマージし、
    各々の前記データの共通項をその地点の新たなデータと
    して設定するためのマージ手段と、 前記マージ手段によって前記データが変化した際、前記
    データの変化に影響を受けるデータ全てに対して、変化
    の内容を反映させる後方反映手段と、 前記後方反映手段が反映作業の対象となるデータの選択
    に利用するために、前記マージ手段によるマージ時に前
    記データが変化した場合、変化前のデータと変化後のデ
    ータとを関連付けるための後方関連付け手段と、を備
    え、 前記データ型推論手段が、前記検査中のプログラムコー
    ド内に前記型制約を侵している箇所を発見した場合、前
    プログラムコードの前記本実行を禁止するための判定
    手段を備えることを特徴とするプログラム検査システ
    ム。
  2. 【請求項2】 請求項1に記載のプログラム検査システ
    ムにおいて、 前記マージ手段を実現する為の機構として、前記プログ
    ラムコード中に存在する分岐命令を前記仮想実行前に調
    査し、分岐元、分岐先の関係とその分岐数の情報を保存
    するための分岐前処理手段を備え、 前記マージ手段は、前記分岐前処理手段によって得られ
    た前記分岐数情報を参照し、前記プログラム検査時に、
    マージ処理が終了した分岐元の数を前記分岐数情報から
    減じていくことで、全ての分岐元のマージ処理について
    データの制約が侵されないことを証明するための分岐処
    理カウント手段を備えることを特徴とするプログラム検
    査システム。
  3. 【請求項3】 前記マージ手段は、前記マージ対象とな
    る2つのデータが、同一データ構造を指し示した場合、
    新たなデータを作成せず、前記同一データ構造を持つデ
    ータに統一する同一データ合流判定手段を備えることを
    特徴とする請求項1または2に記載のプログラム検査シ
    ステム。
  4. 【請求項4】 プログラムコードを本実行する前に、前
    記プログラムコードの仮想実行を行なうシステムを利用
    した記憶領域管理システムであって、 前記プログラムコードを前記本実行する前に、前記プロ
    グラムコード内のデータ型制約の検査のみを前記本実行
    と同様に行なうことのできる仮想実行手段と、 前記仮想実行手段の処理中に、各々の前記データの最終
    使用位置を判定、記憶する為のデータ有効範囲決定手段
    と、 前記データ有効範囲決定手段によって設定されたデータ
    有効範囲情報を元に、前記プログラムコードの前記本実
    行時に、前記データ有効範囲を越えたデータについて記
    憶領域の解放を行なうための記憶領域解放手段と、を備
    えることを特徴とする記憶領域管理システム。
  5. 【請求項5】 プログラムコードに対して事前に型情報
    の制約を侵さないことを検証することによって前記プロ
    グラムコードの本実行時の型情報処理を省略したシステ
    ムについて、前記プログラムコードの本実行以外の別プ
    ロセスからデータを参照する為の記憶領域外部参照管理
    システムであって、 前記プログラムコードの前記本実行時の現在実行地点
    と、前記別プロセスが参照するデータ位置情報を元に、
    前記プログラムコードの先頭から現在実行地点までの仮
    想実行を行う仮想実行手段によって参照されるデータの
    型情報を復元する型情報復元手段を備えることを特徴と
    する記憶領域外部参照管理システム。
  6. 【請求項6】 請求項5に記載の記憶領域外部参照管理
    システムにおいて、 前記仮想実行手段は、前記本実行時前に開始し、前記プ
    ログラムコードの少なくとも1つ以上の箇所で前記デー
    タの型情報を前記仮想実行が終了した後も保持する型情
    報キャッシュ手段を備え、 前記型情報復元手段は、前記データの型情報の復元を、
    前記型情報キャッシュ手段によって保持されている前記
    型情報のうち、参照したいデータの位置に最も近いプロ
    グラム地点の前記型情報を元に、参照したいデータの前
    記型情報を算出する第2の型情報復元手段を含むことを
    特徴とする記憶領域外部参照管理システム。
  7. 【請求項7】 個々の命令が処理するデータ型に制約を
    有するプログラム命令セットを用いて記述されたプログ
    ラムコードについて、その制約が正しく満たされている
    かどうかを本実行前の仮想実行によって前記プログラム
    コードを検査するプログラム検査方法であって、 前記仮想実行時に現れる各々のデータに対して、型情報
    として許容できる下限の型と、そのデータの使用方法に
    基づく上限の型を設定し、前記各データが取り得る型の
    範囲を推論する為のデータ型推論ステップと、 前記プログラムコード中に存在する分岐命令に起因す
    る、複数のパスの合流地点に於けるデータをマージし、
    各々の前記データの共通項をその地点の新たなデータと
    して設定するためのマージステップと、 前記マージステップによって前記データが変化した際、
    前記データの変化に影響を受けるデータ全てに対して、
    変化の内容を反映させる後方反映ステップと、 前記後方反映ステップが反映作業の対象となるデータの
    選択に利用するために、前記マージステップによる前記
    マージ時に前記データが変化した場合、変化前のデータ
    と変化後のデータとを関連付けるための後方関連付けス
    テップと、を備え、 前記データ型推論ステップが、前記検査中のプログラム
    コード内に前記型制約を侵している箇所を発見した場
    合、前記プログラムコードの前記本実行を禁止するため
    の判定ステップと、を含むことを特徴とするプログラム
    検査方法。
  8. 【請求項8】 請求項7に記載のプログラム検査方法に
    おいて、 前記マージステップを実現する為の機構として、前記プ
    ログラムコード中に存在する分岐命令を前記仮想実行前
    に調査し、分岐元、分岐先の関係とその分岐数の情報を
    保存するための分岐前処理ステップを含み、 前記マージステップは、前記分岐前処理ステップによっ
    て得られた前記分岐数情報を参照し、前記プログラム検
    査時に、マージ処理が終了した分岐元の数を前記分岐数
    情報から減じていくことで、全ての分岐元のマージ処理
    についてデータの制約が侵されないことを証明するため
    の分岐処理カウントステップを含むことを特徴とするプ
    ログラム検査方法。
  9. 【請求項9】 前記マージステップは、前記マージ対象
    となる2つのデータが、同一データ構造を指し示した場
    合、新たなデータを作成せず、前記同一データ構造を持
    つデータに統一する同一データ合流判定ステップを含む
    ことを特徴とする請求項7または8に記載のプログラム
    検査方法。
  10. 【請求項10】 プログラムコードを本実行する前に、
    前記プログラムコードの仮想実行を行なうシステムを利
    用した記憶領域管理方法であって、 前記プログラムコードを前記本実行する前に、前記プロ
    グラムコード内のデータ型制約の検査のみを前記本実行
    と同様に行なうことのできる仮想実行ステップと、 前記仮想実行ステップの処理中に、各々の前記データの
    最終使用位置を判定、記憶する為のデータ有効範囲決定
    ステップと、 前記データ有効範囲決定ステップによって設定されたデ
    ータ有効範囲情報を元に、前記プログラムコードの前記
    本実行時に、前記データ有効範囲を越えたデータについ
    て記憶領域の解放を行なうための記憶領域解放ステップ
    と、を含むことを特徴とする記憶領域管理方法。
  11. 【請求項11】 プログラムコードに対して事前にデー
    タの型情報の制約を侵さないことを検証することによっ
    て前記プログラムコードの本実行時の型情報処理を省略
    したシステムについて、前記プログラムコードの本実行
    以外の別プロセスからデータを参照する為の記憶領域外
    部参照管理方法であって、 前記プログラムコードの前記本実行時の現在実行地点
    と、前記別プロセスが参照するデータ位置情報を元に、
    前記プログラムコードの先頭から現在実行地点までの仮
    想実行を行う仮想実行ステップによって、参照されるデ
    ータの型情報を復元する型情報復元ステップを含むこと
    を特徴とする記憶領域外部参照管理方法。
  12. 【請求項12】 請求項11に記載の記憶領域外部参照
    管理方法において、 前記仮想実行ステップは、前記本実行時前に開始し、前
    記プログラムコードの少なくとも1つ以上の箇所で前記
    データの型情報を、前記仮想実行が終了した後も保持す
    る型情報キャッシュステップを含み、 前記型情報復元ステップは、前記データの型情報の復元
    を、前記型情報キャッシュステップによって保持されて
    いる前記型情報のうち、参照したいデータの位置に最も
    近いプログラム地点の前記型情報を元に、参照したいデ
    ータの前記型情報を算出する第2の型情報復元ステップ
    を含むことを特徴とする記憶領域外部参照管理方法。
  13. 【請求項13】 個々の命令が処理するデータ型に制約
    を有するプログラム命令セットを用いて記述されたプロ
    グラムコードについて、その制約が正しく満たされてい
    るかどうかを本実行前の仮想実行によって前記プログラ
    ムコードを検査するプログラムをコンピュータが読み取
    り可能に記録する記録媒体において、 前記仮想実行時に現れる各々のデータに対して、型情報
    として許容できる下限の型と、そのデータの使用方法に
    基づく上限の型を設定し、前記各データが取り得る型の
    範囲を推論する為のデータ型推論ステップと、 前記プログラムコード中に存在する分岐命令に起因す
    る、複数のパスの合流地点に於けるデータをマージし、
    各々の前記データの共通項をその地点の新たなデータと
    して設定するためのマージステップと、 前記マージステップによって前記データが変化した際、
    前記データの変化に影響を受けるデータ全てに対して、
    変化の内容を反映させる後方反映ステップと、 前記後方反映ステップが反映作業の対象となるデータの
    選択に利用するために、前記マージステップによるマー
    ジ時に前記データが変化した場合、変化前のデータと変
    化後のデータとを関連付けるための後方関連付けステッ
    プと、を備え、 前記データ型推論ステップが、前記検査中のプログラム
    コード内に前記型制約を侵している箇所を発見した場
    合、前記プログラムコードの前記本実行を禁止するため
    の判定ステップを含む各ステップを実現するプログラム
    を記録するコンピュータ読みとり可能な記憶媒体。
  14. 【請求項14】 前記プログラムの検査において、前記
    マージステップを実現する為の機構として、前記プログ
    ラムコード中に存在する分岐命令を前記仮想実行前に調
    査し、分岐元、分岐先の関係とその分岐数の情報を保存
    するための分岐前処理ステップを含み、 前記マージステップが、前記分岐前処理ステップによっ
    て得られた分岐数情報を参照し、前記プログラムの検査
    時に、マージ処理が終了した分岐元の数を前記分岐数情
    報から減じていくことで、全ての分岐元のマージ処理に
    ついてデータの制約が侵されないことを証明するための
    分岐処理カウントステップを含むプログラムを記録する
    請求項13に記載のコンピュータ読みとり可能な記憶媒
    体。
  15. 【請求項15】 前記マージステップが、前記マージ対
    象となる2つのデータが、同一データ構造を指し示した
    場合、新たなデータを作成せず、前記同一データ構造を
    持つデータに統一する同一データ合流判定ステップを含
    むプログラムを記録する請求項13または14に記載の
    コンピュータ読みとり可能な記憶媒体。
  16. 【請求項16】 プログラムコードを本実行する前に、
    前記プログラムコードの仮想実行を行なうシステムを利
    用した記憶領域管理方法であって、 前記プログラムコードを前記本実行する前に、前記プロ
    グラムコード内のデータ型制約の検査のみを前記プログ
    ラムコードの前記本実行と同様に行なうことのできる仮
    想実行ステップと、 前記仮想実行ステップの処理中に、各々の前記データの
    最終使用位置を判定、記憶する為のデータ有効範囲決定
    ステップと、 前記データ有効範囲決定ステップによって設定されたデ
    ータ有効範囲情報を元に、前記プログラムコードの前記
    本実行時に、前記データ有効範囲を越えたデータについ
    て記憶領域の解放を行なうための記憶領域解放ステップ
    と、を実現させるためのプログラムを記録することを特
    徴とするコンピュータ読みとり可能な記憶媒体。
  17. 【請求項17】 プログラムコードに対して事前に前記
    プログラムコードの型情報の制約を侵さないことを検証
    することによって前記プログラムコードの本実行時の型
    情報処理を省略したシステムについて、前記プログラム
    コードの本実行以外の別プロセスからデータを参照する
    為のプログラム検査方法であって、 前記プログラムコードの前記本実行時の現在実行地点
    と、前記別プロセスが参照するデータ位置情報を元に、
    前記プログラムコードの先頭から現在実行地点までの前
    記仮想実行を行う仮想実行ステップによって、参照され
    るデータの型情報を復元する型情報復元ステップを含
    み、前記各ステップを実現させるためのプログラムを記
    録することを特徴とするコンピュータ読みとり可能な記
    憶媒体。
  18. 【請求項18】 請求項17に記載のコンピュータ読み
    とり可能な記憶媒体において、 前記仮想実行ステップは、前記本実行時前に開始し、前
    記プログラムコードの少なくとも1つ以上の箇所で前記
    データの型情報を前記仮想実行が終了した後も保持する
    型情報キャッシュステップを含み、 前記型情報復元ステップは、前記データの型情報の復元
    を、前記型情報キャッシュステップによって保持されて
    いる前記型情報のうち、参照したいデータの位置に最も
    近いプログラム地点の前記型情報を元に、参照したいデ
    ータの前記型情報を算出する第2の型情報復元ステップ
    を含み、前記各ステップを実現させるためのプログラム
    を記録する請求項17に記載のコンピュータ読みとり可
    能な記憶媒体。
JP00791999A 1999-01-14 1999-01-14 プログラム検査システムとプログラム検査方法並びにその記憶媒体 Expired - Fee Related JP3360635B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP00791999A JP3360635B2 (ja) 1999-01-14 1999-01-14 プログラム検査システムとプログラム検査方法並びにその記憶媒体
US09/482,096 US6772410B1 (en) 1999-01-14 2000-01-13 Program verifying system, program verifying method, and storage medium for storing software of program verifying method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP00791999A JP3360635B2 (ja) 1999-01-14 1999-01-14 プログラム検査システムとプログラム検査方法並びにその記憶媒体

Publications (2)

Publication Number Publication Date
JP2000207242A JP2000207242A (ja) 2000-07-28
JP3360635B2 true JP3360635B2 (ja) 2002-12-24

Family

ID=11678947

Family Applications (1)

Application Number Title Priority Date Filing Date
JP00791999A Expired - Fee Related JP3360635B2 (ja) 1999-01-14 1999-01-14 プログラム検査システムとプログラム検査方法並びにその記憶媒体

Country Status (2)

Country Link
US (1) US6772410B1 (ja)
JP (1) JP3360635B2 (ja)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020062476A1 (en) * 2000-07-14 2002-05-23 Saxe James Benjamin Case-reduced verification condition generation system and method by use of dynamic single assumption and assigning labels to variables at control join points
US20030154266A1 (en) * 2000-09-01 2003-08-14 Mark Bobick Server system and method for discovering digital assets in enterprise information systems
US6880149B2 (en) * 2002-04-01 2005-04-12 Pace Anti-Piracy Method for runtime code integrity validation using code block checksums
US7181733B2 (en) * 2003-01-16 2007-02-20 Sun Microsystems, Inc. Method and apparatus for detecting an overflow condition in a kernel stack during operating system development
US7617531B1 (en) * 2004-02-18 2009-11-10 Citrix Systems, Inc. Inferencing data types of message components
TWI305323B (en) * 2004-08-23 2009-01-11 Faraday Tech Corp Method for verification branch prediction mechanisms and readable recording medium for storing program thereof
US8578347B1 (en) * 2006-12-28 2013-11-05 The Mathworks, Inc. Determining stack usage of generated code from a model
US7624131B2 (en) * 2007-01-18 2009-11-24 Microsoft Corporation Type restriction and mapping for partial materialization
US9027003B2 (en) * 2008-03-31 2015-05-05 Vmware, Inc. Precise branch counting in virtualization systems
US8499297B2 (en) 2008-10-28 2013-07-30 Vmware, Inc. Low overhead fault tolerance through hybrid checkpointing and replay
US8875115B2 (en) * 2008-11-29 2014-10-28 International Business Machines Corporation Type merging technique to reduce class loading during Java verification
CN109815136B (zh) * 2019-01-02 2022-03-29 腾讯科技(武汉)有限公司 一种业务运营的数据处理方法和装置

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE69217228T2 (de) 1991-08-07 1997-08-21 Unisys Corp Verfahren zum aufstellen von multi-objekt-bedingungen in dateien
JPH05143301A (ja) 1991-11-19 1993-06-11 Toshiba Corp ソフトウエア開発支援システム
US5748964A (en) * 1994-12-20 1998-05-05 Sun Microsystems, Inc. Bytecode program interpreter apparatus and method with pre-verification of data type restrictions
US5668999A (en) * 1994-12-20 1997-09-16 Sun Microsystems, Inc. System and method for pre-verification of stack usage in bytecode program loops
US6067575A (en) * 1995-12-08 2000-05-23 Sun Microsystems, Inc. System and method for generating trusted, architecture specific, compiled versions of architecture neutral programs

Also Published As

Publication number Publication date
JP2000207242A (ja) 2000-07-28
US6772410B1 (en) 2004-08-03

Similar Documents

Publication Publication Date Title
US7784044B2 (en) Patching of in-use functions on a running computer system
US10866813B2 (en) Linking virtualized application namespaces at runtime
JP6177179B2 (ja) エラーハンドリングをもつトランザクションのグラフ型計算
Abdulla et al. An integrated specification and verification technique for highly concurrent data structures
Krishnamurthi et al. Verifying aspect advice modularly
JP3360635B2 (ja) プログラム検査システムとプログラム検査方法並びにその記憶媒体
EP0718764B1 (en) Bytecode program interpreter apparatus and method with pre-verification of data type restrictions
US8930884B2 (en) Efficient extraction of software dependencies from program code
WO1996012224A1 (en) Method and apparatus for testing object-oriented programming constructs
Artho et al. Combined static and dynamic analysis
WO2005031569A1 (en) Systems and methods for dynamically linking application software into a running operating system kernel
Tsai et al. Testing extensible design patterns in object-oriented frameworks through scenario templates
Chajed et al. Certifying a file system using crash hoare logic: correctness in the presence of crashes
Derrick et al. Verifying correctness of persistent concurrent data structures: a sound and complete method
US7603388B2 (en) Representing file data using virtual hierarchy
US20080295079A1 (en) System and Method for Verifying and Testing System Requirements
Musuvathi et al. Partial-order reduction for context-bounded state exploration
Kokologiannakis et al. Dynamic partial order reductions for spinloops
Atig et al. Context-bounded analysis of TSO systems
Elmas et al. Precise race detection and efficient model checking using locksets
Tasiran et al. Location pairs: a test coverage metric for shared-memory concurrent programs
Yuan et al. Verified functional programming of an IoT operating system's bootloader
Sistla et al. CMV: Automatic verification of complete mediation for Java Virtual Machines
US11334627B2 (en) Data processing
Fasse et al. Modular termination verification with a higher-order concurrent separation logic (Intermediate report)

Legal Events

Date Code Title Description
FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20071018

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20081018

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20091018

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20091018

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101018

Year of fee payment: 8

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111018

Year of fee payment: 9

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121018

Year of fee payment: 10

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131018

Year of fee payment: 11

LAPS Cancellation because of no payment of annual fees