JP2002515996A - シミュレートされたプログラムの実行エラーの検出方法および装置 - Google Patents

シミュレートされたプログラムの実行エラーの検出方法および装置

Info

Publication number
JP2002515996A
JP2002515996A JP50825598A JP50825598A JP2002515996A JP 2002515996 A JP2002515996 A JP 2002515996A JP 50825598 A JP50825598 A JP 50825598A JP 50825598 A JP50825598 A JP 50825598A JP 2002515996 A JP2002515996 A JP 2002515996A
Authority
JP
Japan
Prior art keywords
function
action
model
computer program
memory
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.)
Granted
Application number
JP50825598A
Other languages
English (en)
Other versions
JP4633203B2 (ja
JP2002515996A5 (ja
Inventor
ブッシュ,ウイリアム・アール
ピンカス,ジョナサン・ディ
ウイルバー,リチャード・イー
メジャー―ディグナン,デビイ
シェラフ,デヴィッド・ジョン
Original Assignee
イントリンサ・コーポレーション
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 イントリンサ・コーポレーション filed Critical イントリンサ・コーポレーション
Publication of JP2002515996A publication Critical patent/JP2002515996A/ja
Publication of JP2002515996A5 publication Critical patent/JP2002515996A5/ja
Application granted granted Critical
Publication of JP4633203B2 publication Critical patent/JP4633203B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

(57)【要約】 プログラムステートメントの実行をシミュレートすることによってコンピュータ・プログラム中のエラーを検出するコンピュータ・プログラム・エラー検出システムである。内部フォーマット構造は、コンピュータ・プログラムによって規定される全ての関数のリストと共に検索される。内部フォーマット構造を分析し、全ての関数呼出しおよび関数呼出しの順序付けを決定する。発見された関数呼出しに対応する外部動作モデルは、検索され、モデル・テーブルに記憶される。1つまたは複数の制御フロー・パスは、コンピュータ・プログラムを介してトラバースされる。トラバースされる各パスについて、構造メモリ・モデルが維持され、制御フロー・パスに沿ったステートメントの実行のシミュレートの結果を表す。ステートメントは、オペレーションの組込みモデルを実行することによってシミュレートされる。関数呼出しは、呼び出された関数に対応する外部動作モデルを実行することによってエミュレートされる。外部動作モデルを実行することにより、構造モデル・メモリが更新され、呼び出された関数の実行を反映する。自動モデル化のために、メモリ・モデルの操作を記述する情報をログする。構造メモリ・モデル中の無効条件が検出され、報告される。各パスの分析の後で、自動モデル化のためにログした情報を操作し、そのパスについてのアウトカムを構築する。個別のパスの分析が完了した後で、様々なアウトカムを処理し、重複を除去し、分析中のコンピュータ・プログラムを表す外部動作モデルを生成する。

Description

【発明の詳細な説明】 シミュレートされたプログラムの実行エラーの検出方法および装置マイクロフィッシュの付録の相互参照 付録Aは、本開示の一部であり、合計で2146個のフレームを有する22枚 のマイクロフィッシュ・シートからなるマイクロフィッシュの付録である。マイ クロフィッシュの付録Aは、本発明の一実施態様におけるコンピュータ・プログ ラムおよび関連データのリストである。この実施形態については以下でより完全 に説明する。 本特許文書の開示の一部には、著作権保護を受ける内容が含まれる。著作権所 有者は、特許商標庁の特許ファイルに記録された本特許文書または本特許開示を 正確に複製することには異議を唱えないが、それ以外の場合にはすべての著作権 を留保する。発明の背景 発明の分野 本発明は、コンピュータ・プログラムの分析に関し、詳細には、構造メモリ・ モデルに対してコンピュータ・プログラムをシミュレートされた実行の効果を分 析することによってコンピュータ・プログラムのプログラミング・エラーを検出 することに関する。背景 コンピュータ・プログラムを開発する際には、完成したコンピュータ・プログ ラムの正しさを保証することに多大な努力が払われる。コンピュータ・プログラ ムの目的は、指定された入出力関数をインプリメントすることである。コンピュ ータ・プログラムの正しさとは、プログラムの仕様、設計、インプリメントにお いてエラーが生じない程度である。コンピュータ・プログラムのエラーを検出す る最も一般的な2つの方法は、コンパイル時検査および実行時検査である。 コンパイル時検査とは、形態、構造、または内容に基づいてコンピュータ・プ ログラムを評価するプロセスである。コンパイル時検査は、プログラムが実行さ れる前に確立できる特性を試験する。「構文検査」は、コンパイル時検査の一形 態であり、言語に関して定義された構造規則または文法規則との整合を検証する 。たとえば、周知のCコンピュータ言語で書かれたコンピュータ・プログラムで は、文B+C=Aを使用した場合、正しい形式はA=B+Cであるためにエラー が生じる。構文検査は、Richard ConwayおよびDavid Gr ies著「An Introduction to Programming」 (Winthrop Publishers,Inc.、1979年)に詳しく 記載されている。 「データ・フロー分析」は、他の種類のコンパイル時検査であり、コンピュー タ・プログラム内でデータ転送、使用、変換が実行されるシーケンスを分析して プログラミング・エラーを検出する。データ・フロー分析には、制御フロー情報 を使用することが含まれる。「制御フロー」は、コンピュータ・プログラムを実 行する際に文が実行されるシーケンスである。制御フローは、「制御フロー・パ ス」、または単に「コード・パス」とも呼ばれる。データ・フロー分析は、代入 を行う前に変数を使用することや、、2回連続して変数に代入することや、使用 されることのない変数に値を代入することなどのエラーを検出することができる 。 コンパイル時検査モジュールの最大の欠点は、このような方法ではコンピュー タ・プログラム実行の結果が考慮されないために生じる。コンパイル時検査は、 プログラム実行の動的効果を考慮せずに判定できることに限られる。たとえば、 カリフォルニア州マウンテンビューのSun Microsystems社から 市販されているSPARCworksTM3.0.1.1のプログラミング環境で 使用できるlintコンパイル時チェッカは、コンピュータ・コードによる動的 制御フローにかかわらずにコンピュータ・コードを分析する。この欠点のために 、lintは、使用中の値を初期設定される前に報告する。したがって、実際に は、報告される値は使用中の値とは異なる。 コンパイル時検査によって生成されるエラー・メッセージは通常、内容が不十 分であるか、あるいは過剰である。コンピュータ・プログラムの特定の関数は、 ある資源が有効である場合、その資源を検査の前に使用することができる。この 関数の外部で資源の有効性が検査されない場合、プログラム終了エラーの可能性 が報告されないため、データ構造が破壊され、場合によっては貴重なデータが失 われる恐れがある。しかし、この関数の前に資源の有効性を検査した場合、エラ ーが報告されると、この関数の分析が擬エラーで混乱し、大規模なプログラムで はコンピュータ・プログラムの分析が無用になる恐れがある。 コンパイル時分析方法で報告される他の種類の擬エラーは、制御フローが進行 できない命令の「明らかな」エラーである。文が実行されるシーケンスは多くの 場合、特定の変数に関連する特定の値に依存する。コンパイル時検査方法は一般 に、特定のコード・パスが実行されるかどうか、あるいはプログラム制御フロー がどんな特定の環境の下でコード・パスを流れるかを判定できないので、文は常 に実行されるものと仮定する。 実行時検査は、他の主要な種類のプログラミング・エラー検出方法であり、コ ンピュータ・プログラムを実行中の動作に基づいて評価するプロセスである。実 行時検査では、既知の1組の入力を用いてコンピュータ・プログラムを実行し、 プログラム結果を予期される結果と比較して検証する。この1組の試験入力、実 行条件、予期される結果を「テスト・ケース」と呼ぶ。多くの場合、エラーを見 つけるのを助けるために、それぞれの異なる点での選択された変数の値を示すプ リントアウト(トレース)が作成される。 概念は簡単であるが、実行時検査の有用性は、コンピュータ・プログラムの複 雑さによって制限される。テスト・ケースを構成し、作成し、実行するには多大 な労力が必要である。多大な労力を払ったにもかかわらず、実行時検査のエラー 検出関数は、選択された特定の1組の入力によって実行されるコード・パスに限 られる。ほとんどの最も簡単なコンピュータ・プログラムでは一般に、すべての 可能な制御フロー・パスを実行することは実際的ではない。さらに、実行時検査 では、コンピュータ・プログラムが完全であり、実行準備が完了している必要が ある。関数を分析するにはその関数を実行しなければならないので、関数を、完 全なプログラムに組み込むだけでなく試験するには、関数に必要な実行環境を与 えるプログラム・シェルを構築する追加の労力が必要である。 典型的なプログラミング・エラー検出方法の欠点を解消する1つの方法が、「 Computer Process Resource Modelling Method and Apparatus」と題する米国特許出願第08/2 89148号で本出願人によって提示されている。この出願は、1994年8月 10日に出願され、本出願人に譲渡され、引用によって明示的に本明細書と合体 されている。このプログラミング・エラー検出方法は、プログラム資源の状態に 対するプログラム命令の効果を追跡することによってコンピュータ・プログラム の構成要素を分析する。各資源は、各状態の間のいくつかの状態および遷移によ って表される所定の動作を有する。しかし、状態マシンを維持し使用することは 面倒であるので、コンピュータ・プロセス資源モデリングの能力はスプリアス・ エラーを抑制し、詳細なエラー・メッセージを生成することに限られる。さらに 、方法自体の複雑さのために、この方法を具体化する構造を維持し、かつこの方 法を新しい種類のプログラミング・エラーおよびプログラミング言語に拡張する ことは困難である。 実行されるプログラム命令の動作を考慮し、コンピュータ・プログラム内のほ ぼすべての可能な制御フロー・パスを自動的に考慮し、コンピュータ・プログラ ムの個々の関数を分析することのできるプログラミング・エラー検出方法が必要 である。さらに、呼出し関数を分析する際に被呼関数の動作を考慮するプログラ ミング・エラー検出方法が必要である。必要とされるプログラミング・エラー検 出方法は、維持し、かつ新しいプログラミング言語および異なる種類のエラーに 拡張するのも容易でなければならない。必要とされる方法は、スプリアス・エラ ーを最小限に抑え、詳細なエラー・メッセージを生成することもできるべきであ る。発明の概要 本発明によれば、プログラム文の実行をシミュレートすることによってコンピ ュータ・プログラムの実行時動作を分析するコンピュータ・プログラム・エラー 検出システムが提供される。特に、このシステムを使用して、コンピュータ・シ ステム内の関数のサブセットのみ、あるいはプログラム全体を分析することがで きる。一実施態様では、オブジェクト・ベースの設計方法を使用してシステムの 保全性が高められ、同時に高い拡張性が与えられる。 本発明の一実施態様では、コンピュータ・プログラムがプリプロセッサに入力 される。プリプロセッサには、構成ファイル、ヘッダ・ファイル、コマンド行情 報に含まれる指定された構成オプションも入力される。プリプロセッサは、コン ピュータ・プログラムを内部フォーマット構造(構文構文解析ツリー構造)に変 換する。構文構文解析ツリー構造は、コンピュータ・プログラム内で定義された すべての関数のリストと共に中間ファイルに変換される。この中間ファイル、構 成オプション、コマンド行情報、外部動作モデルは分析エンジンに変換される。 分析エンジン処理ではまず、構成オプションが受け入れられる。構成オプショ ンは、分析エンジンによって実行される分析を制御する。制御構成オプションが 決定されると、中間ファイルからコンピュータ・プログラムの内部フォーマット 構造が取り込まれる。分析エンジンは、やはり中間ファイルから、コンピュータ ・プログラムによって定義されたすべての関数を識別する。コンピュータ・プロ グラムの内部フォーマット構造が分析され、すべての関数呼出しが識別される。 関数分析のスケジューリングは識別された関数呼出しの順序によって制御される 。本発明の他の実施態様では、内部フォーマット構造の代わりにコンピュータ・ プログラムの異なる表現を使用することができる。たとえば、コンピュータ・プ ログラムを表すソース・コードを使用することができる。 分析エンジンは、関数を分析する前に、識別された被呼関数に対応するすでに 構築されている外部動作モデルを見つけて取り込む。収集された外部動作モデル は、モデル・テーブル・エントリによって表される。各モデル・テーブル・エン トリは、モデル・テーブルとして収集される。被呼関数に関する外部動作モデル が見つからない場合、その関数は、欠落しているモデルによって表される。モデ ル・テーブルは、関数分析中に外部動作モデルを参照することを可能にする。 コンピュータ・プログラムによって定義された各関数の分析はループで実行さ れる。関数分析の開始時には、その関数に対応する内部フォーマット構造がメモ リに読み込まれる。分析エンジンは、最大数のパスに到達するか、あるいは分析 するパスがもはやなくなるまで、関数を通るコード・フロー・パスを通ることに よってこの関数を分析する。パスの最大数は、分析エンジン処理の限界を決定す るために構成オプションを用いて設定される。決定的選択点履歴を使用して制御 フロー・パスが選択される。いくつかの異なる制御フロー・パスを通る関数のシ ミュレートされた実行は、CPHツリーによってモデル化される。制御フロー・ パスは未処理の選択点を含むことができる。これは、制御フロー・パス内に処理 できない条件文または述語があることを意味する。CPHツリー内のノードを使 用して、未処理の各選択点が表される。未処理の選択点の分解能をシミュレート するように、ノードのエッジがランダムに選択される。CPHツリー内でパスが 選択された後、このパスが分析される。エッジをランダムに選択すると、制御フ ロー・パス内での文の効果を表す構造メモリ・モデルを更新することによって記 憶されるプログラム変数に関する意味が生じる。 選択したすべてのパスが分析された後、分析中の関数の外部動作モデルが収集 される。分析中の関数がもはや必要なくなると、この関数の内部フォーマット構 造がメモリから解放される。最後に、オートモデラがすべての個々のパス結果を 走査し、無関係の動作を削除し、二重の結果を削除する。オートモデラは次いで 、残りの結果をパッケージして、分析中の関数の外部動作モデルを生成する。 特定の制御フロー・パスを分析するには、制御フロー・パスに沿って各文をシ ミュレートする必要がある。分析エンジンは、パス分析の開始時に、分析中の関 数に関してのみ指定された構成オプションがあるかどうかを検査する。現在の関 数の処理は、検出される構成オプションの影響を受ける。分析エンジンは、分析 される各コード・パスごとに、新しい構造メモリ・モデルを構築する。この構造 メモリ・モデルを使用して、制御フロー・パスに沿って各文の実行の効果がシミ ュレートされる。モデル化されたすべてのメモリ位置を追跡する「チャンク・テ ーブル」と呼ばれるテーブルが設けられる。分析される各コード・パスごとに、 コンピュータ・プログラムで使用される変数名をモデル化メモリ内の位置に関連 付ける記号テーブルが作成される。 パス内の第1の分を処理する前に、関数の返却値に関するモデル化メモリ位置 が作成され、この位置が記号テーブルに挿入される。モデル化メモリ位置は、モ デル化中のメモリのアドレス可能な各ユニットあたり1つの記憶値からなる。4 バイト・ポインタをモデル化する場合、モデル化メモリ位置は4つの記憶値を含 む(1バイトあたり1つの値−最低アドレス可能ユニット)。記憶値は記憶値セ ットとして収集される。チャンク・テーブルは、すべての記憶値セットを追跡す ることによってメモリ・モデルを管理する。 メモリ・モデル内に返却値が配置されると、パスに沿って各文が処理される。 各文が処理された後、いくつかの異なるコード・パスの間の結果の比較が容易に なるように記号テーブルが順序付けされる。パス処理では、リーク検出も実行さ れ、各モデル化メモリ位置が探索され、メモリにおいて、割り付けられているに もかかわらず関数が終了した後にどの記号も指し示さない部分があるかどうかが 判定される。検出されたリークについては適切なエラー・メッセージが生成され る。パス処理では最後に、メモリ・モデル内のオートモデラ走査構造が、関数の 各外部動作モデルに対して実行された試験および各外部動作モデルに加えられた 変更を判定する。この情報は、パスに関する結果として要約される。 特定の文の分析では、文がコンピュータ・メモリに与える効果を反映するよう にメモリ・モデルを操作する必要がある。分析エンジンは、文処理の開始時に、 分析中の文に関してのみ指定された構成オプションがあるかどうかを検査する。 現在の文の処理は、検出される構成オプションの影響を受ける。各文は、処理の ために適切な文ユニットに分配される。文の各種類ごとに異なる文ユニットがあ る。一般に、文ユニットは、文中の式を評価し、適切な処理制御結果を再生する ことによって、プログラム文の実行をシミュレートする。 式のオペランドを表すようにモデル化メモリ位置を作成し、式の演算子をオペ ランドに適用する効果をシミュレートするようにメモリ・モデルを更新すること によって、式が評価される。メモリ・モデルの操作を表す情報が、後でオートモ デラによって検査できるようにログされる。演算子を適用する効果のシミュレー ションは演算ユニットによって実行される。演算ユニットは、関数を表すのに使 用される外部動作モデルと同様な組込みモデルを実行することによって演算をシ ミュレートする。 文が関数呼出しである場合、被呼関数に対応する外部動作モデルが実行され、 この関数呼出しの効果がエミュレートされる。対応する外部動作モデルが存在し ない場合、被呼関数が正常にリターンしたという仮定の下にメモリ・モデルが更 新される。被呼関数に関してオートモデラによって生成された外部動作モデルを 使用して、呼出し関数を分析する際に被呼関数をエミュレートすることができる 。 メモリ・モデルで無効な条件が検出された場合、エラー・メッセージが生成さ れる。エラー・メッセージの報告は、構成オプションによって制御される。構成 オプションは、ある無効な条件のみを報告することを可能にするか、あるいはあ る無効な条件の報告を抑制する。さらに、分析エンジンは二重のエラー・メッセ ージを報告しない。 本発明は、以下の詳細な説明と図面に鑑みてより完全に理解されよう。図面の簡単な説明 第1図は、本発明の一実施形態の入出力のブロック図である。 第2図は、第1図に示した本発明の1つの動作環境のブロック図である。 第3図は、第2図の分析器の内部構造のより詳細なブロック図である。 第4図は、第3図のプリプロセッサのより詳細なブロック図である。 第5図は、Cプログラミング言語文の例と対応する構文構文解析ツリーの図で ある。 第6図は、第3図の分析エンジンのより詳細なブロック図である。 第7図は、第6図の関数ごと制御ブロックの機能図のブロック図である。 第8図は、第3図の分析エンジンによって実行される処理を表すブロック図で ある。 第9図は、本発明の一実施形態で使用されるモデル・テーブル・エントリの図 である。 第10図は、第3図の分析エンジンによる処理の開始時に存在する関数呼出し 順序付けおよび外部動作関数モデル・インベントリの例の図である。 第11図は、第8図の分析関数ブロックによって実行される処理を表すブロッ ク図である。 第12図は、第11図の分析パス・ブロックによって実行される処理を表すブ ロック図である。 第13図は、本発明の一実施形態で使用される記号テーブル・エントリの図で ある。 第14a図は、記号テーブル内の2つのポインタと、第12図の順序記号テー ブル・ブロックで使用されるモデル化メモリへのそのリンクの高次表現である。 第14b図は、第12図の順序記号テーブル・ブロックで使用される記号テー ブルに第14a図とは逆の順序で配置された第14a図からの2つのポインタ( およびモデル化メモリへのそのリンク)の高次表現である。 第15図は、本発明のメモリ作成ユニットの一実施形態によって実行される処 理を表すブロック図である。 第16図は、第15図のメモリ作成ユニットによって使用される原点コンテキ スト構造の図である。 第17図は、第15図のメモリ作成ユニットによって使用されるチャンク・デ ータ構造の図である。 第18図は、第15図のメモリ作成ユニットによって使用される記憶値ブロッ クの図である。 第19図は、第15図のメモリ作成ユニットによって使用される記憶資源ブロ ックの図である。 第20図は、第15図のメモリ作成ユニットによって作成される各データ構造 の間のリンクの高次表現である。 第21図は、第11図の初期設定関数ごとデータ構造ブロックによって使用さ れる実行コンテキストブロックの図である。 第22図は、第12図のパス・ブロックに沿ってプログラム文で実行される処 理を表すブロック図である。 第23図は、本発明のブロック・ユニットの一実施形態の論理流れ図である。 第24図は、本発明の式ユニットの一実施形態の論理流れ図である。 第25a図は、第24図のプロセス演算アクション2424で実行される処理 の一部を表す論理流れ図である。 第25b図は、第24図の演算処理アクション2424で実行される処理の、 第25a図から始まった説明を完了する論理流れ図である。 第26図は、第25b図の演算評価アクション2538によって使用される引 数情報ブロックの図である。 第27図は、本発明の演算ユニットの一実施形態の論理流れ図である。 第28図は、本発明のif−elseユニットの一実施形態の論理流れ図であ る。 第29図は、本発明のループ実行ユニットの一実施形態の論理流れ図である。 第30a図は、本発明の切換えユニットの一実施形態の一部の論理流れ図であ る。 第30b図は、切換えユニットの第30a図から始まった説明を完了する論理 流れ図である。 第31図は、本発明の変数初期設定ユニットの一実施形態の論理流れ図である 。 第32図は、本発明のリターン・ユニットの一実施形態の論理流れ図である。 第33図は、本発明のCPH条件選択ユニットの一実施形態の論理流れ図であ る。 第34図は、本発明の一実施形態で使用されるメモリ・タイプ情報ブロックの 図である。 第35図は、本発明の一実施形態で使用される取込み値ブロックの図である。 第36図は、本発明の一実施形態で使用される述語ブロックの図である。 第37図は、本発明のエラー生成ユニットの一実施形態の論理流れ図である。好ましい実施形態の詳細な説明 本発明の原則によれば、コンピュータ・プログラムの実行をシミュレートし、 プログラミング・エラーを検出する方法および装置が提供される。特に、本発明 によれば、新規のエラー検出方法は、コンピュータ・プログラムのソース・コー ドを仮想マシン上の演算のシーケンスにマップする。仮想イメージ、すなわち、 分析中のコンピュータ・プログラムによって使用されるメモリの詳細な構造モデ ル(「メモリ・モデル」と呼ぶこともある)は、仮想マシンの状態を表す。コン ピュータ・プログラム中の各変数は、メモリ・モデル内の固有の位置に関連付け される。各位置は値を含む。各値は、一意に識別され、変数またはその他のプロ グラム資源の特定の瞬間を表す。実行可能なプログラム命令は、仮想マシンの命 令に変換される。仮想マシンは、メモリ・モデルに含まれる値に命令の動作モデ ルを適用することによって動作する。モデルを適用すると、不正な演算、無効な 値、リーク、その他の種類のエラーが検出される。 コンピュータ・プログラムを分析するには、いくつかの異なるコード・パスを 通る複数の反復が必要である。個々のコード・パスを通る間、未処理の選択点が 処理される。「選択点」とは、条件または述語の値に基づいて、2組以上のプロ グラム文のうち1つが、実行されるプログラム文として選択されるコンピュータ ・プログラム内の点である。プログラムの変数および資源の部分的な知識のみを 用いて分析を行うと、条件値または述語値が求められず、選択点が未処理になる 可能性がある。 コード・パスに沿った関数呼出しは、関数の外部動作モデルを実行することに よって分析される。この外部動作モデルは、対応する関数が入力されたときに真 でなければならないものと、対応する関数が終了するときに真になるものを反映 する。コンピュータ・プログラムの複数回の反復によって得られた情報は、分析 中のプログラムの外部動作モデルを形成するように抽象化される。 以下の説明では、本発明をより完全に理解していただくために、言語構文、プ ログラム・インタフェース、サンプル・データなど多数の特定の詳細について述 べる。しかし、当業者には、これらの特定の詳細なしに本発明を実施できること が明らかになろう。いくつかの場合には、本発明を不必要にわかりにくくしない ように周知のデータ・フォーマットおよびデータ構造については詳しく説明しな い。関数レベルの分析 通常、コンピュータ・プログラムは、すでに開発されている構成要素と新たに 書かれたコードを組み合わせることによって開発される。本明細書では、「コー ド」は、ソース・コード、すなわち、人間が理解できる形式のコンピュータ命令 および/またはオブジェクト・コード、すなわち、コンピュータが理解できる形 式のコンピュータ命令を指す。コンピュータ・プログラムの構成要素は、1つま たは複数の指定されたタスクを実行するコードの部分である。コンピュータ上で コンピュータ・プログラムを実行するときは、ソース・コードが機械コードに変 換され、プログラムがロード・モジュールとしてメモリにロードされる。ロード ・モジュールの作成とプログラムの実行についての詳細は、Arthur Gi ll著「Machine and Assemb1y Language Pr ogramming of the PDP−11」(Prentice−Ha ll,Inc.、1978年)を参照されたい。 コンピュータ・プログラムは任意の数のコンピュータ言語で書くことができる 。従来型のコンピュータ言語、すなわち被呼手続き言語では、コンピュータが所 与のシーケンス内で実行しなければならない特定の1組の命令をプログラマが記 述する。命令とは、プログラミング言語の文であり、コンピュータによって実行 される演算と、関連するオペランドのアドレスおよび値を指定する。たとえば、 命令A=B+1で、「B」および「1」はオペランドであり、「+」は加算演算 を指定するために使用される演算子である。一般に、文は実行すべき動作を指定 する。手続きコンピュータ言語の例には、C、Ada、Pascal、Fort ran、COBOL、PL/1がある。 C++などいくつかの手続き言語はオブジェクト指向である。オブジェクト指 向プログラミング言語は、オブジェクト、すなわち関数および関連するデータの 概念的なグループ分けを維持する。オブジェクトは、「クラス」と呼ばれる構成 要素に構成される。コンピュータ画面上に表示され、コンピュータ・プログラム を作成するためにコンピュータ・プログラマによってリンクされるグラフィカル 画像として命令が表現されるため、いくつかのコンピュータ言語はグラフィック ス・ベースである。いくつかのコンピュータ言語は、マサチューセッツ州Cam bridgeのLotus Development Corporation から市販されているLotus 1−2−3 Spreadsheetプログラ ム用のLotus 1−2−3マクロ言語など特定のソフトウェア製品に特有の 言語である。本発明は、メモリが操作される、任意のコンピュータ言語、すなわ ち任意のコンピュータ命令プロトコルに適用することができる。 上記ではソース・コード・コンピュータ命令プロトコルについて説明したが、 本明細書の教示がオブジェクト・コード形式のコンピュータ命令にも同様に適用 できることが理解されよう。本明細書で説明する例示的な実施形態では、分析さ れる特定のコンピュータ言語は周知のCコンピュータ言語である。 Cコンピュータ言語で書かれたコンピュータ・プログラムは通常、いくつかの 関数に分割される。関数は、ゼロ個以上のパラメータを入力として受け付け、特 定の動作を実行し、多くて1つの戻し項目を出力として生成する。パラメータお よび戻し項目は、メモリに記憶されるデータ構造である。関数は構成要素でも、 あるいは構成要素の一部でもよい。本明細書で説明する例示的な実施形態では、 コンピュータ・プログラムの各関数が個別に分析される。コンピュータ・プログラム分析 第1図は、本発明の一実施形態を示す。エラー検出プロセッサ102はコンピ ュータ・プログラム104を障害インジケータ106およびモデル118に変え る。障害インジケータ106は、コンピュータ・プログラム104内の特定のエ ラーを識別し記述する。本発明の一実施形態では、障害インジケータ106はエ ラー・メッセージの形をとる。エラー・メッセージについては以下で詳しく説明 する。モデル118は、コンピュータ・プログラム104内の対応する関数が実 行する入力メモリから出力メモリへのマッピングを定義する。モデル118は、 対応する関数の外部可視動作の要約表現であるので外部動作モデルである。コン ピュータ関数のモデル化については以下で詳しく説明する。 エラー検出プロセッサ102によるコンピュータ・プログラム104の処理は 様々な入力因子の影響を受ける。このような入力因子には、構成ファイル110 、コマンド行情報108、ヘッダ・ファイル112、モデル118が含まれる。 入力因子については以下で詳しく説明する。 第2図は、エラー検出プロセッサ102用の1つの典型的な動作環境を示す。 第2図の実施形態では、エラー検出プロセッサ102は、中央演算処理装置(C PU)204で実行されるアナライザ202を備える。CPU204は、記憶さ れているプログラム命令を実行する。アナライザ202は、コンピュータ・プロ グラム104、構成ファイル110、ヘッダ・ファイル112と共にメモリ20 6に含まれる。メモリ206はさらに、メイン・メモリ(図示せず)と二次記憶 域(図示せず)に細分することができる。メイン・メモリはプログラム命令また はデータを保持し、CPU204からメイン・メモリに直接アドレスすることが できる。二次記憶域は、直接CPU204の制御を受けることがなく、あるいは CPU204から直接アドレスすることのできないデータを含む。当業者には、 メイン・メモリ206に含まれている情報をメイン・メモリに記憶するか、ある いは二次記憶域に記憶し、必要に応じてCPU204で実行できるようにメイン ・メモリへ転送することができることが認識されよう。 入出力(I/O)回路208は、データをCPU204へ転送し、CPU20 4から受け取る責任を負う。CPU204、メモリ206、入出力回路208は 、バス210と呼ばれる内部データ・チャネルを通して相互接続される。キーボ ード212とマウス214は2つの一般的な入力装置であり、CPU204への データおよび命令の入力を助けるように構成される。たとえば、通常、コマンド 行情報108は、エラー検出プロセッサ102に与えるためにキーボード212 を通して入力される。表示装置216とプリンタ218は2つの一般的な出力装 置であり、CPU204からのデータの出力を助けるように構成される。第2図 の実施形態では、出力信号、すなわち障害インジケータ106はメモリに記憶さ れる。当業者には、表示装置216やプリンタ218など他の出力装置へこの出 力信号を送ることもできることが認識されよう。 第3図は、アナライザ202の機能図である。プリプロセッサ302はコンピ ュータ・プログラム104を対応する構文構文解析ツリー構造304に変換する 。プリプロセッサ302は構文構文解析ツリー構造304を中間ファイル306 に格納する。プリプロセッサ302は、中間ファイル306にも関数分析リスト 310、すなわち、コンピュータ・プログラム104に定義されたすべての関数 のリストを格納する。コンピュータ・プログラム104に定義されている関数は 、分析エンジン308によって分析される関数である。分析エンジン308は、 構文構文解析ツリー構造304を通してエラーを検出し、障害インジケータ10 6を生成する。分析エンジン308は、コンピュータ・プログラム104の各関 数についてのモデル118も生成する。モデル118および分析エンジン308 の その他の出力については以下で詳しく説明する。 プリプロセッサ302の機能図を第4図に示す。プリプロセッサ302は構成 ファイル110から演算命令を受け取る。構成ファイル110は、ユーザがアナ ライザ202をカスタマイズすることを可能にする。構成ファイル110に含ま れる設定は、コンピュータ・プログラム104が分析される環境の特性を決定す る。たとえば、本発明の一実施形態では、構成オプション「maximum_p aths」が、各関数について実行される分析の量の限界を設定する。整数オプ ション値は、アナライザ202によって分析されるパスの数の限界を指定する。 本発明の一実施形態に関する構成オプションの完全なリストを付録Bに示す。 構成ファイル110に含まれる構成オプションは構成ファイル・リーダ402 によって処理される。構成ファイル・リーダ402は、構成ファイル110から 構成オプションを読み込み、構成オプションによって示されたようにパーサ40 4の演算属性を設定する。パーサ404は、コンピュータ・プログラム104の 内部中間表現を作成する。パーサ404はヘッダ・ファイル112を使用してコ ンピュータ・プログラム104を変換する。一実施形態では、ヘッダ・ファイル 112は、「#include」Cプリプロセッサ指令を通してCプログラムに よって使用することのできる標準ライブラリ関数を含む。ヘッダ・ファイルは従 来技術でよく知られている。ヘッダ・ファイルの詳細な議論については、Mar k Williams Companyの「Ansi C:A Lexical Guide」(Prentice Hall 1988年)を参照されたい。 分析の準備として、パーサ404はコンピュータ・プログラム104を解析す る。コンピュータ・プログラムを解析すると、コンピュータ・プログラムがより 多くの基本サブユニットに分解され、各サブユニットの間の関係が確立されるこ とによって、プログラムの構文構造が判定される。パーサ404は、コンピュー タ・プログラム104に現われる文が、ソース言語(C)仕様によって許容され るパターンで生じるかどうかを検査する。パーサ404は、言語仕様に違反する 文について障害インジケータ106を生成する。本発明の一実施形態では、障害 インジケータ106はエラー・メッセージの形をとる。言語仕様に違反するエラ ーを「構文エラー」と呼ぶ。 また、他のエラー検出のためにさらに重要なこととして、パーサ404は、コ ンピュータ・プログラム104の基本サブユニットを構文構文解析ツリー構造3 04で表す。構文構文解析ツリー構造304は構文構文解析ツリーであり、コン ピュータ・プログラム104の構文構造を示す。ツリーとは、多数の分岐を含む 階層構造としてグループ化された要素の集合である。ツリーの一番上の要素をル ート・ノードと呼ぶ。末端ノード、すなわち分岐のないノードをリーフ・ノード と呼ぶ。ツリー内の残りのノードは内部ノードである。 構文構文解析ツリーの概念は、例を介して最もよく理解されよう。第5図は、 簡単なC文と対応する構文構文解析ツリーを示す。文502「a=b+1」は2 つの式に分解される。一次式は等式であり、「a」を二次式によって生成される 値と等しく設定する。一次式の2つのオペランドは「a」と二次式である。二次 式は加算演算であり、「b」に1を加える。二次式の2つのオペランドは「b」 と「1」である。文502は構文構文解析ツリー504によって表される。構文 構文解析ツリー504のルート、すなわちルート・ノード506は、等式を表す 等式演算子を含む。ルート・ノード506の2つの分岐は、等式の2つのオペラ ンドに至る。リーフ・ノード508はオペランド「a」を含み、内部ノード51 0は、加算演算を表す加算演算子を含む。内部ノード510の2つの分岐は加算 演算のオペランドに至る。リーフ・ノード512は「b」を含み、リーフ・ノー ド514は「1」を含む。 パーサを使用して、コンピュータ・プログラムを解析すること、構文エラー用 のエラー・メッセージを生成すること、構文構文解析ツリーを構築することはす べて、従来技術でよく知られている。コンピュータ・プログラムの解析に関する 詳細な議論については、A1fred V.Aho、Ravi Sethi、J effrey D.Ullman著「Compilers:Principle s,Techniques,and Tools」(Addison−Wesl ey Publishing Company、1986年)を参照されたい。 プリプロセッサ302は、構文構文解析ツリー構造304だけでなく、コンピ ュータ・プログラム104に定義されたすべての関数のリストも生成する。この リスト、すなわち関数分析リスト310は、構文構文解析ツリー構造304と共 に中間ファイル306に格納される。分析エンジン308は関数分析リスト31 0にアクセスし、どの関数を分析すべきかを判定する。 第6図は、分析エンジン308の機能図である。主制御ブロック602は分析 エンジン308の主入口点である。メイン制御ブロック602は、ユーザによっ て直接、あるいは統合スクリプトまたは構築ツールによって間接的に、コマンド 行から呼び出される。ユーザは、キーボード212またはマウス214を通して コマンドを直接入力することによってアナライザ202を呼び出す。コマンド行 に入力されるキー情報、すなわち、コマンド行情報108の一部は(構文構文解 析ツリー構造304を含む)中間ファイル306のリストであり、分析すべきコ ンピュータ・プログラムに対応する。コマンド行情報108は、構成ファイル1 10の仕様を含むこともできる。主制御ブロック602は分析エンジン308内 の処理の順序を制御する。 初期設定ブロック604は分析エンジン308内の第1の処理を実行する。初 期設定ブロック604は、(中間ファイル306のリストと構成ファイル110 の任意選択の仕様とを含む)コマンド行情報108とモデル118を処理する。 処理が完了すると、制御は主制御ブロック602に戻る。 次に、処理は関数ごと制御ブロック606によって実行される。1つの構文構 文解析ツリー構造304は、1つのコンピュータ・プログラムに対応し、一度に 分析される。各構文構文解析ツリー構造304は、内部に複数の関数を表すこと ができる。関数ごと制御ブロック606は一度に1つの関数を分析する。関数ご と制御ブロック606は構文構文解析ツリー構造304をトラバースし、障害イ ンジケータ106を生成する。処理は、分析すべき各構文構文解析ツリー構造3 04ごとに繰り返される。すべての構文構文解析ツリー構造304が分析された 後、制御は主制御ブロック602に戻る。 最後の処理は後処理ブロック608によって完了される。後処理ブロック60 8は、関数ごと制御ブロック606によって分析される関数に対応するモデル1 18を書き出す。モデル118は任意の出力媒体に書き出すことができる。通常 、モデル118は二次記憶域に書き出され、そこで他のコンピュータ・プログラ ムの分析に使用することができる。後処理ブロック608は制御を主制御ブロッ ク 602に返し、分析が終了する。 分析エンジン308によって実行される処理の大部分は、関数ごと制御ブロッ ク606内で行われる。関数ごと制御ブロック606の機能図を第7図に示す。 関数ごと制御ブロック606は5つのメイン・オブジェクト上に構築される。オ ブジェクトとは、機能および関連するデータの概念的なグループである。オブジ ェクト・ベースの方法を用いて関数ごと制御ブロック606を構成することによ って、分析エンジン308の拡張性が高まり、分析エンジン308を保守するの が容易になる。拡張性が高まるのは、他のオブジェクトに影響を及ぼさずに特定 のオブジェクト内で機能を追加できるからである。オブジェクトどうしは、慎重 に定義されたインタフェースを使用することによって対話する。インタフェース が維持されるかぎり、1つのオブジェクト内の保守が他のオブジェクトに影響を 与えることはない。したがって、分析エンジン308全体にわたって大規模な補 正を施す必要がある場合と比べて、分析エンジン308を保守し局所補正を実行 するのが容易である。 構文構文解析ツリー・オブジェクト702は、構文構文解析ツリー構造304 によって表されたコンピュータ・プログラム104内の複数のコード・パスをト ラバースする。構文構文解析ツリー・オブジェクト702は、コード・パスを進 むにつれて、命令の演算子を対応するオペランドと共に取り込むことによって、 コード・パスに沿って命令を処理する。取り込まれた演算子およびオペランドは 、シミュレーションのために命令オブジェクト706に渡される。構文構文解析 ツリー・オブジエクト702は、エミュレーションのために関数呼出しも命令オ ブジェクト706に渡す。命令実行のシミュレーションと関数呼出しのエミュレ ーションの両方について以下で詳しく説明する。 仮想マシン704は、コンピュータ上のコンピュータ・プログラム104の実 行および内部表現をシミュレートする。仮想マシン704は、命令オブジェクト 706、仮想メモリ・オブジェクト708、オートモデル・オブジェクト710 からなる。命令オブジェクト706は、構文構文解析ツリー・オブジェクト70 2から渡された演算子を解釈する。さらに、命令オブジェクト706は、処理中 の演算子または関数に対応するモデル118を実行する。モデル118を実行す ることの効果は、メモリ・モデルが適切に修正されることである。メモリ・モデ ルについては以下で詳しく説明する。 仮想イメージ・オブジェクト708は仮想イメージ(図示せず)を維持する。 仮想イメージとはコンピュータ・メモリの構造モデル(「メモリ・モデル」)で ある。仮想イメージ・オブジェクト708は、メモリ・モデルの位置、コンピュ ータ・プログラム104を「実行」する間に各位置にどんな値が記憶されたか、 特定のメモリ・モデル位置でどんな試験が実行されたかを追跡する。仮想イメー ジ・オブジェクト708は、メモリ内の値に作用するvimプリミティブと呼ば れる1組のプリミティブも維持する。コンピュータ・メモリのモデルとvimプ リミティブについては以下で詳しく説明する。 オートモデル・オブジェクト710は、現在分析中の関数のモデル118を構 築する責任を負う。関数内の各コード・パスが実行された後、オートモデル・オ ブジェクト710は、仮想イメージ・オブジェクト708に問合せを行い、関数 によって実行された入出力マッピングに関する情報を得る。オートモデル・オブ ジェクト710によって作成されるモデル118は、複数のコード・パスを介し て仮想イメージ・オブジェクト708から得られた情報を抽象化したモデルであ る。モデル118と、それを構築するのに必要な情報については以下で詳しく説 明する。 検出される大部分のプログラミング・エラーは仮想イメージ・オブジェクト7 08で見つけられるが、実際の障害インジケータ106は障害インジケータ・オ ブジェクト712で生成される。障害インジケータ・オブジェクト712は、プ ログラミング・エラーを識別する情報を受け取る。本発明の一実施形態では、情 報がアセンブルされ、障害インジケータ106はエラー・メッセージの形でユー ザに提示される。エラー・メッセージ処理については以下で詳しく説明する。アナライザの構成 本発明の一実施形態では、アナライザ202のいくつかの異なる構成要素を表 すソース・コードは、パッケージと呼ばれるグループにインプリメントされる。 パッケージとは、より大きなコンピュータ・プログラムの論理的に関係するサブ セットであり、コンピュータ・プログラムに対して関連する1組のサービスを行 う。本発明の一実施形態について、表1に、アナライザ202を形成するすべて のパッケージをリストする。表1の「使用されるパッケージ」のシーケンスは、「パッケージ」のシーケンス にリストされたパッケージからアクセスされる他のパッケージを示す。パッケー ジは、それがアクセスする他のすべてのパッケージに依存する。したがって、「 使用されるパッケージ」のシーケンスは、パッケージ依存性のリストを示す。依 存性に留意するのは、パッケージが、依存する他のパッケージの誤動作の悪影響 を受ける可能性があるからである。bot:ユーティリティ・パッケージ bot、すなわちユーティリティ・パッケージは、文字列、ファイル、ファイ ル名、メモリ、集合を操作する汎用関数を与える。これらのユーティリティは、 他のパッケージが移植性の問題の影響を受けるのを妨げる。第2図の実施形態で は、CPU204上でアナライザ202が実行される。異なるCPUを使用した 場合、動作環境から与えられる資源が変更されることがある。botパッケージ は、他のすべてのパッケージをこのような変更から保護する。さらに、botパ ッケージ内のユーティリティは、システム資源を使用する必要のあるパッケージ に関する一様な呼出し規約を提供する。頻繁に使用される関数に関する一様な呼 出し規約を有する場合、アナライザ202の保全性が高まる。botパッケージ は他のパッケージには依存しない。 表2は、本発明の一実施形態に含まれるbotパッケージから与えられるユー ティリティを参照したものである。 集合 bot_colユーティリティは集合をサポートする。集合とは、概念的には 、順序付けされた1組のメンバまたはこれらのメンバの順序付けされたバッグで ある(すなわち、複製を許可する)。メンバはキーとして使用することができ、 その場合、各メンバに何らかの追加のデータを関連付けることができる。 集合は、種類、内容の説明、サイズを有する。種類は、解釈されない整数に過 ぎず、予期される種類を実際の種類と比較するために使用される。したがって、 集合は明示的に入力され、すなわち、各集合は特定のデータ・クラスを予期する 。内容の説明は、集合が何で構成されているか、たとえば、ビット、整数、コピ ーされた文字列などを指定する。集合のサイズは、集合中のメンバの数である。 本発明の一実施形態では、以下の項目の集合がサポートされる。 ・ブール演算 ・指し示された文字列(集合が単に、文字列を指し示すポインタを記憶する場合 ) ・コピーされた文字列(集合が、文字列にメモリを割り付け、この文字列をコピ ーする場合) ・整数 ・ポインタ(集合が、指し示されているものに関する情報を有さない場合) ・バイト(集合が、これらのバイトの構造に関する情報を有さない場合) アナライザ202での集合の一般的な使用は以下の通りである。 ・固定サイズ・ビット・アレイ(抑制コード、選択点履歴) ・名前による参照が重要な可変サイズ文字列リスト(構成オプション) ・記号テーブル:可変サイズであり、解釈されないポインタを指数として有する 。 ・チャンクおよび取込み値の固定サイズの記憶値 ・記憶値のアレイの固定サイズ・サブセット ・(オート・パッケージ内の)パスごと外部テーブル ・述語の集合 ・(モデル内の)結果の集合 ・(結果内の)外部動作モデルの集合 ・モデル・テーブル:可変サイズであり、モデル識別子を指数として有する。 ・(mcilによって生成された)関数ポインタの集合 集合は、bot_col_createユーティリティを呼び出し初期サイズ および最大サイズを供給することによって作成される。初期サイズはゼロ要素で よく、最大サイズは無制限でよい。本発明の一実施形態は、集合サイズが無制限 であることを示すためにbot_col_createユーティリティに渡され るBOT_COL_NO_MAX_SIZEと呼ばれる定数を定義する。固定サ イズ集合は、初期サイズを最大サイズ値と等しく設定することによって作成され る。固定サイズ集合は、最適化されたいくつかの処理系を可能にする。たとえば 、固定サイズ・ブール演算集合はビットとしてインプリメントされる。bot_ col_copyユーティリティを呼び出して既存の集合をコピーするか、ある いはbot_col_subsetユーティリティを呼び出して既存の集合のサ ブセットを取り出すことによって、集合を作成することもできる。 集合の各メンバはいくつかの関連する生データを有することができる。メンバ に関連する生データを有することは、記号テーブルを集合としてインプリメント する場合に有用である。記号テーブルとは名前の値へのマッピングである。集合 としてインプリメントされた記号テーブルは、名前をメンバとして表し、その値 を関連する生データとして表す。 本発明の一実施形態では、集合はしばしば、アレイをインプリメントするため に使用される。新しいメンバの指数を返すbot_col_add_membe rユーティリティを使用することによって、アレイにメンバが追加される。bo t_col_get_memberユーティリティを呼び出すことによって、特 定の指数にあるメンバがアレイから取り込まれる。bot_col_get_m ember_and_rawユーティリティによってメンバの値とそれに関連す る生データの両方を取り込むことができる。bot_col_replace_ memberユーティリティを使用することによってアレイのメンバの値が置き 換えられる。 多くの場合、アレイの各メンバを反復する必要がある。アレイの各メンバを通 過することは、通常、forループを使用して行われ、当技術分野で十分に理解 されている。bot_col_get_num_membersユーティリティ はアレイのサイズを返し、このユーティリティを使用してforループの上限を 確立することができる。前述のように、forループの本体内部では、botc ol_get_memberを使用してアレイの各メンバを取り込むことができ る。 本発明の一実施形態では、参照テーブルは通常、集合としてインプリメントさ れる。bot_col_lookup_memberユーティリティを使用して 、メンバの指数を特定の値と共に返すことができる。参照テーブルは、入力値と 出力値との間の対応を識別する。参照テーブルは従来の技術で十分に理解されて いる。分析エンジン308の詳細な説明 前述のように、分析エンジン308は、障害インジケータ106およびモデル 118を生成するためにユーザによってコマンド行から(あるいは自動化ツール によって間接的に)呼び出される。本発明の一実施形態によれば、分析エンジン 308の処理はブロック図800(第8図)で示されている。処理はベース・パ ッケージアクション802(以下では「アクション802」と呼ぶ)のグローバ ル・データ構造初期設定から始まり、この場合、4つのベース・パッケージによ って必要とされるグローバル・データ構造が初期設定される。4つのベース・パ ッケージとはbotパッケージ、errパッケージ、ctxパッケージ、con fパッケージである。アクション802は、コンピュータ・プログラム104を 処理するために分析エンジン308によって必要とされるセットアップを実行す る。 すべてのパッケージは、botパッケージから与えられるユーティリティを使 用する。したがって、botパッケージによって必要とされるグローバル・デー タ構造がまず初期設定される。初期設定の後で、botパッケージ内のユーティ リティを他のパッケージが使用することができる。次に、構成オプションを処理 する際に出会うエラーを処理するためにerrパッケージを使用できるようにe rrパッケージ内のグローバル・データ構造が初期設定される。errパッケー ジ処理の後で、実行コンテキストブロック2100、すなわちctxパッケージ によって定義されるグローバル・データ構造が割り付けされクリアされる。er rパッケージは、エラー・メッセージに挿入されるコンテキスト情報に関して実 行コンテキストブロック2100を参照する。実行コンテキストブロック210 0については以下で詳しく説明する。実行コンテキストブロック2100が初期 設定された後、confパッケージのグローバル・データ構造が初期設定される 。第8図の実施形態では、botパッケージ、errパッケージ、ctxパッケ ージ、confパッケージのグローバル・データ構造の初期設定はルーチンによ って実行される。マイクロフィッシュの付録Aの実施形態では、botパッケー ジ、errパッケージ、ctxパッケージ、confパッケージのグローバル・ データ構造を初期設定するルーチンをそれぞれ、bot_begin、err_ begin、ctx_begin、conf_beginと呼ぶ。処理はアクシ ョン802からデフォルト構成ファイル処理アクション804(以下では「アク ション804」と呼ぶ)へ移る。 構成オプションは、分析エンジン308によって実行される多くの処理に影響 を与える。したがって、アクション802で必要なセットアップが行われると、 アクション804で構成オプションが処理される。構成オプションは構成ファイ ル110内に記憶される。デフォルト構成ファイル110はデフォルト・オプシ ョン設定を含む。デフォルト構成ファイル110は分析エンジン308用の標準 構成を生成する。 デフォルト構成ファイル110はアクション804内で処理される。まず、デ フォルト構成ファイルが見つけられる。本発明の一実施形態では、デフォルト構 成ファイルはアナライザ202のホーム・ディレクトリに格納される。デフォル ト構成ファイル110が見つかった後、分析エンジン308にデジタル・オプシ ョン設定がロードされる。デフォルト構成ファイルに含まれるすべてのオプショ ンがロードされるまで、オプション設定が一度に1つずつ読み込まれる。第8図 の実施形態では、デフォルト構成ファイル110はルーチンによって処理される 。マイクロフィッシュの付録Aの実施形態では、conf_load_defa ultsルーチンによってアクション804が実行され、このルーチンはcon f_read_fileルーチンをすべてのオプションを読み込む。conf_ read_fileルーチンは、構成ファイル110全体にわたって1行ずつ反 復し、conf_parse_optionルーチンを使用して構成ファイルの 各行を解析し、オプションを取り込む。アクション804によって実行される関 数は当業者によく知られている。 構成オプションは、分析エンジン308によって実行される分析のレベルと、 分析エンジン308によって生成される出力の種類および量を制御する。たとえ ば、構成オプションは、処理中のコードで実行されるパスの数と、どんなエラー が報告されるかと、エラーが報告される形式と、あるエラーが報告される場所を 判定することができる。第8図の実施形態については、構成オプションのリスト および各オプションの説明はアペンデッィクスBに含まれている。 処理は、アクション804からユーザ指定構成情報処理アクション806(以 下では「アクション806」と呼ぶ)に移り、ユーザ指定構成ファイル110が 処理される。ユーザは、コマンド行情報108内のコマンド行上に構成ファイル 110を指定することによって分析エンジン308内で実行される処理をカスタ マイズするオプションを有する。ユーザ指定構成ファイル110に設定された構 成オプションは、デフォルト構成ファイル110に設定された対応するオプショ ンに優先する。 本発明の一実施形態では、コマンド行上の「−config」制御語を使用し てオプションのユーザ指定構成ファイル110が識別される。「−config 」制御語の後に空白が続き、その後にユーザ指定構成ファイル110の名前が続 く。たとえば、「−config custom」は、「custom」と呼ば れるユーザ指定構成ファイル110を識別する。 アクション806はまず、ユーザがオプションの構成ファイル110を指定し たかどうかを判定する。そうでない場合、アクション806ではもはや処理は必 要とされない。ユーザ指定構成ファイル110が識別された場合、処理はアクシ ョン804と同様に継続する。アクション806内では、ユーザ指定オプション 設定が分析エンジン308にロードされる。このようなユーザ指定オプション設 定は、アクション804に設定された対応するデフォルト設定に優先する。ユー ザ指定構成ファイル110に含まれるすべてのオプションがロードされるまで、 オプション設定は一度に1つずつ読み込まれる。第8図の実施形態では、ユーザ 指定構成ファイル110はルーチンによって処理される。マイクロフィッシュの 付録Aの実施形態では、アクション806はconf_loadルーチンによっ て実行され、このルーチンは、conf_load_defaultsルーチン と同様に、conf_read_fileルーチンを使用してすべてのオプショ ンを読み込む。 アクション806は、ユーザによって指定されたコマンド行構成オプションも 処理する。コマンド行情報108内のコマンド行上に複数の構成オプションを指 定することができる。本発明の一実施形態では、制御行構成オプション(および その値)の前に「−prefix_opt」制御語が指定される。「−pref ix_opt」制御語の後で、引用符で囲まれた構成オプションに値が割り当て られる。言い換えれば、コマンド行構成オプション指定は以下の形式を有する。 −prefix_opt“option name=option valu e” たとえば、「maximum_paths」構成オプションは、以下のものを指 定することによってコマンド行上に設定することができる。 −prefix_opt“maximum_paths=300” 付録Bは、本発明の一実施形態についての様々な構成オプションおよび許容され るオプション値を含む。 アクション806は、コマンド行構成オプションをコマンド行上のその位置に 対して左から右へ処理する。構成オプションがコマンド行上に指定されたか、そ れとも構成ファイル110内に含まれるかにかかわらず、所与のコマンド行構成 オプション指定は、すでに指定されているすべての構成オプションに優先する。 処理はアクション806から残余グローバル・データ構造初期設定アクション 808(以下では「アクション808」と呼ぶ)へ移り、コンピュータ・プログ ラム104を分析する準備として残りのパッケージが初期設定される。構成オプ ションをロードした後の、処理を行う方法は知られている。この時点で、処理に 必要とされるグローバル・データ構造が初期設定される。本発明の一実施形態で は、autoパッケージ、cphパッケージ、exeパッケージ、insパッケ ージ、mcilパッケージ、symパッケージ、vimパッケージはすべて、グ ローバル・データ構造を有し、これらの構造を初期設定しなければならない。第 8図の実施形態では、ルーチンを使用してパッケージ内のグローバル・データ構 造が初期設定される。マイクロフィッシュの付録Aの実施形態では、「pkg_ begin」と呼ばれるルーチンによってパッケージ内のグローバル・データ構 造が初期設定される。「pkg」はパッケージの名前を表す。たとえば、aut oパッケージ内のグローバル・データ構造は、「auto_begin」と呼ば れるルーチンによって初期設定される。 処理はアクション808から中間ファイル読取りアクション810(以下では 「アクション810」と呼ぶ)へ移り、コマンド行情報108内のコマンド行上 にリストされた中間ファイル306が読み取られ、準備処理が実行される。まず 、コマンド行に含まれる中間ファイル306のリストが取り込まれる。各中間フ ァイル306の内容がメモリに読み込まれる。ユーザは、空白で区切られた複数 の中間ファイル306をコマンド行上に指定することができる。 プリプロセッサ302は、構築されたあらゆる中間ファイル306に関数分析 リスト310を挿入する。関数分析リスト310は、対応する中間ファイル30 6内の分析すべきすべての関数を含む(すなわち、構文構文解析ツリー構造30 4によって表されたプログラムによって定義されたすべての関数のリスト)。分 析すべきすべての関数を識別する関数分析マスタ・リストを形成するために、コ マンド行上に指定されたすべての中間ファイル306から得たすべての関数分析 リスト310の複合リストが作成される。 分析を必要とするすべての関数の名前が判明した後、処理では続いて、すべて の被呼関数の名前が判定される。「被呼関数」は、(通常は一時的に)転送され る実行の制御である関数を示す。関数分析マスタ・リストを巡回することによっ てすべての被呼関数のリストが生成される。分析を必要とする各関数について、 対応する構文構文解析ツリー構造304がトラバースされ、呼び出される関数が 調べられる。アクション810は、すべての被呼関数の名前と関数呼出しの順序 の両方を判定する。 分析エンジン308は、被呼関数の実行をエミュレートする。分析エンジン3 08は、対応するモデル118を実行できる場合、被呼関数のより確実なエミュ レーションを実行することができる。そうでない場合、分析エンジン308は、 通常実行される被呼関数を示すことからなる最低限のエミュレーションを実行す る。 すべての被呼関数の名前を収集した後、これらの関数に関して存在するすべて のモデルを収集することが可能である。アクション810内で生成される関数呼 出しの順序によって、分析エンジン308は、プログラム全体がより完全に調べ られるように関数分析の順序付けを調整することができる。分析エンジン308 はできる限り、関数を分析の他の部分でエミュレートすることが必要になる前に その関数を分析しモデル化する。関数分析の適切な順序は、アクション810の 最後に関数呼出し順序付け情報のトポロジカル・ソートを行うことによって決定 される。トポロジカル・ソートによって、順序付けされた関数呼出しのリストが 生成される。関数は、順序付けされた関数呼出しのリストに示された順序で処理 される。トポロジカル・ソートは当技術分野でよく理解されている。 例1は、第10図に示されており、関数呼出し順序付けの例を示す。第10図 を参照するとわかるように、関数F1 1002は関数F2 1004を呼び出 す。関数F2 1004は関数F3 1006およびF4 1008を呼び出す 。この例では、関数f1 1002、f2 1004、f3 1006は関数分 析マスタ・リスト上にある(すなわち、分析を必要とする)。被呼関数のリスト にはf2 1004、f3 1004、f4 1008が含まれる。これらの関 数のうちで、分析の開始時に存在するのは関数f4 1008のモデル、f4モ デル1010だけである。したがって、f4モデル1010が実行され、関数f 4 1008の呼出しがエミュレートされる。関数呼出し順序付けでは、分析の 開始時にどのモデルが存在するかだけでなく、どの関数を最初に分析するかも決 定される。f2 1004のモデルが構築される前にまずf1 1002を分析 すると、f2 1004の最低限のエミュレーションが行われる。f2 100 4を最初に分析しモデル化した場合は、関数f1 1002をより詳しく分析す ることができる。同様な理由で、f2 1004を分析する前にf3 1006 が分析されモデル化される。f3 1006が分析されモデル化された後、f2 1004のより完全な分析が可能になり、最終的にf1 1002がより良好 に分析される。 処理はアクション810からモデル・テーブル構築アクション812(以下で は「アクション812」と呼ぶ)へ移り、モデル・テーブルが構築される。モデ ル・テーブルとは、モデル・テーブル・エントリ900を指し示すポインタの集 合である。各モデル・テーブル・エントリ900は、被呼関数リスト上の被呼関 数に対応する。モデル・テーブル・エントリ900を第9図に示す。モデル・テ ーブル・エントリ900は、「function name(関数名)」902 、「model pointer(モデル・ポインタ)」904、「model source(モデル・ソース)」906、「output destina t ion(出力宛先)」908、「newer model index(新しい モデル・インデックス)」910、「loaded flag(ロード済みフラ グ)」912、「missing flag(欠落フラグ)」914、「rep ort missing flag(欠落報告フラグ)」916、「autom odel flag(オートモデル・フラグ)」918、「newer mod el flag(新しいモデル・フラグ)」920、「written fla g(書込み済みフラグ)」922、「replace flag(置換えフラグ )」924、「queue for write flag(書込み待ち行列フ ラグ)」926の各フィールドを含む。 フィールド「function name」902は、モデル・テーブル・エ ントリ900に関連付けされた関数の識別子を指定する。フィールド「mode l pointer」904は、モデル・テーブル・エントリ900によって表 されるモデル118を指し示す。フィールド「model source」90 6は、「model pointer」904によって指し示されたモデルがど こから読み取られたかを指定する。フィールド「ouput destinat ion」908は、「model pointer」904によって指し示され たモデルを書きこむファイルを指し示す。フィールド「newer model index」910は、このモデル・テーブル・エントリ900が関連付けさ れているのと同じ関数のモデルのより新しいバージョンを指し示すモデル・テー ブル内のエントリのインデックスを指定する。 「loaded flag」912は、このテーブル・エントリに関してモデ ルがロードされているかどうかを示す。「missing flag」914は 、このテーブル・エントリに特殊な「missing model」が割り当て られているかどうかを示す。「report missing flag」91 6は、このテーブル・エントリに関して「missing model」メッセ ージが発行されているかどうかを示す。「automodel flag」91 8は、「model pointer」904によって指し示されたモデルが、 現在の分析中にオートモデラによって作成された場合には真である。「auto model flag」918は、モデルが最初に、現在のコンテキストのコン テ キスト外でオートモデラによって作成された場合でも偽である。「newer model flag」920は、このモデル・テーブル・エントリ900が関 連付けされているのと同じ関数の、オートモデラによって生成されたモデル11 8を表すモデル・テーブル・エントリ900をオートモデラが追加しているかど うかを示す。「written flag」922は、モデルがファイルに書き 出されたかどうかを示す。「replace flag」924は、「mode l pointer」904によって指し示されているモデル118をオートモ デラが置き換えているかどうかを示す。最後に、「queue for wri te flag」は、分析の終了時にモデルに書き出すべきである場合は真であ る。そうでない場合は偽である。 まず、アクション812内で、モデル・テーブルを具体化する集合が作成され る。モデル・テーブルはテーブル・エントリ900をモデル化する1組のポイン タであるので、ポインタの集合が作成される。モデル・テーブルの集合が作成さ れると、テーブル内にエントリはなくなる。次に、モデル・テーブル内の初期エ ントリが作成される。すなわち、モデル・テーブル・エントリ900を指し示す メンバがモデル・テーブル集合に追加される。本発明の一実施形態では、モデル ・テーブル集合はルーチンによって構築される。マイクロフィッシュの付録Aの 実施形態では、ルーチンins_mt_readがモデル・テーブルの構築を制 御し、bot_col_create_collectionユーティリティ・ ルーチンを呼び出してモデル・テーブル集合を作成する。 アクション812は次に、モデル・テーブルによって指し示された初期モデル ・テーブル・エントリを作成する。アクション812は、アクション810内で 構築された被呼関数のリスト上の各関数を巡回する。このリスト上の各関数につ いて、モデル・テーブル・エントリ900が割り付けられ初期設定される。フィ ールド「function name」902は現在の被呼関数の名前に設定さ れる。次いで、モデル・テーブル・エントリ900は、フィールド「missi ng flag」914を真に設定することによって欠落モデルを示すように設 定される。モデル・テーブル集合にメンバを追加することによって、新たに作成 されたモデル・テーブル・エントリを指し示すポインタがモデル・テーブルに挿 入される。また、オートモデラによって生成されたモデル118で欠落モデルを 置き換えるべきであることを示すフラグ「replace flag」924が オンにされる。このように、処理は被呼関数リスト全体にわたって反復される。 したがって、アクション812が完了した後、被呼関数リスト上のあらゆる関数 に関するモデル・テーブルによって指し示される1つのモデル・テーブル・エン トリ900がある。本発明の一実施形態では、モデル・テーブルはルーチンを通 して初期設定される。マイクロフィッシュの付録Aの実施形態では、ルーチンm cil_get_next_model_to_readは被呼関数名のリスト 全体にわたって反復され、ルーチンins_mt_insertはモデル・テー ブル・エントリ900を作成し、このエントリを欠落モデルを示すように初期設 定し、bot_col_add_memberユーティリティ・ルーチンはモデ ル・テーブル集合にメンバを追加するために使用される。処理はアクション81 2から集合モデル化アクション814(以下では「アクション814」と呼ぶ) へ移る。 アクション814は、モデル・テーブルで参照された各モデル・テーブル・エ ントリ900に対応するすでに構築されているモデル118(すなわち、被呼関 数リスト上のすべての関数のモデル)を収集する。利用可能なモデル118を探 索する第1のステップは、モデル・ファイルを探索する位置のリストを構築する ことである。モデル・ファイルとはモデルを含むファイルであり、規約上、ファ イル拡張識別子を区別することによってモデル・ファイルが認識される。たとえ ば、「mod」と「mar」は、モデル・ファイルを識別する2つの拡張子であ る。「mod」拡張子は現在のモデル118を含むモデル・ファイルを示し、「 mar」拡張子は、保存されているモデル118を含むモデル・ファイルを示す 。単一のモデル・ファイルに複数のモデル118を格納することができる。モデ ル・ファイルは、ファイルにどの関数がモデル化されているかを示すインデック ス情報をファイルの開始位置と終了位置に有することができる。 通常、モデル・ファイルはディレクトリに配置され、ファイルを探索する場所 のリストは1組のディレクトリである。組内の各ディレクトリは、モデル・ファ イルを求めて探索される。適切なファイル拡張子を有するすべてのファイルが処 理される。選択された各ファイルについて、モデル・ファイルが割り付けされ開 かれる。モデル・ファイルを開いた後、インデックスが走査され、ファイル内の モデル118のうちで、分析に必要な関数に対応するモデルがあるかどうかが判 定される。これは、モデル・ファイル・インデックス中の関数名を被呼関数リス ト上の名前と比較することによって行われる。名前が一致するたびに、一致した 関数を表すモデル・テーブル・エントリ900内で「loaded flag」 912が真に設定されていないかぎり、対応するモデル118が解析されメモリ にコピーされる。コピーされたモデル118を指し示すポインタは、フィールド 「model pointer」904にある対応するモデル・テーブル・エン トリ900に入力される。このモデル・テーブル・エントリ900に関する「m issing flag」はオフにされる。また、この同じモデル・テーブル・ エントリ900について、「loaded flag」912が真に設定され、 「replace flag」924が偽に設定される。「loaded fl ag」912が真に設定されたときは、アクション814が、モデル・テーブル ・エントリ900によって表された関数に一致するすべての後続のモデル118 を無視すべきであることを意味する。すべての一致が処理されると、選択された モデル・ファイルの処理が完了し、モデル・ファイルが閉じられ割付け解除され る。モデル118については以下で詳しく説明する。本発明の一実施形態では、 アクション814はあるルーチンによって実行される。マイクロフィッシュの付 録Aの実施形態では、ルーチンins_mt_readが、すでに構築されてい るモデル118を見つけ、ルーチンins_mt_parseがモデル・ファイ ル内のモデルを解析する。 アクション814は、ファイルのリスト、すなわち出力モデル・ファイル・リ ストも生成する。このリストは、分析中に構築されたモデル118の出力宛先を 指定する。出力モデル・ファイル・リストは、モデル118がモデル・テーブル ・エントリ900に挿入されるときに動的に構築される。モデル118がモデル ・テーブル・エントリ900にリンクされると、出力モデル・ファイル・リスト が検査され、モデル118によって表される関数のソース中間ファイル306と 同じファイル名と「mod」のファイル拡張子とを有する対応する出力モデル・ ファイルがあるかどうかが調べられる。探している出力モデル・ファイルが見つ からない場合、このファイルは出力モデル・ファイル・リストに追加される。あ る関数を表すように構築されたモデル118は、最初にその関数を定義した中間 ファイルに対応する出力モデル・ファイルに格納される。たとえば、中間ファイ ル「test.il」が関数f1を含む場合、関数flを表すように構築された モデル118は出力モデル・ファイル「test.mod」に格納される。アク ション814がモデル・テーブル・エントリ900を初期設定すると、フィール ド「output destination」908が、フィールド「func tion name」902で識別された関数を含む中間ファイル306に対応 する出力モデル・ファイルの名前を記録するように設定される。モデル・ファイ ルについては以下で詳しく説明する。処理はアクション814から関数分析アク ション816(以下では「アクション816」と呼ぶ)へ移る。 アクション816は、関数分析マスタ・リスト上のすべての関数を分析する。 処理の順序は、順序付き関数呼出しリストによって制御される。関数は、順序付 き関数呼出しリスト上の第1の関数から最後の関数まで順次分析される。各関数 について、対応する構文構文解析ツリー構造304がメモリに読み込まれる。関 数を分析すると、障害インジケータ106(エラーが検出された場合)と、分析 された関数を表すモデル118が生成される。関数の分析が完了すると、メモリ に読み込まれた構文構文解析ツリー構造304は破棄される。このように、必要 に応じてのみ構文構文解析ツリー構造304を記憶することによって、CPU2 04のメモリ資源が節約される。アクション816で実行される関数ごと処理に ついては以下で詳しく説明する。処理は、アクション816から出力モデルアク ション818(以下では「アクション818」と呼ぶ)へ移る。 アクション818は、アクション816によって作成されたモデル118を記 憶する責任を負う。出力モデル・ファイル・リスト内の各出力モデル・ファイル は順次処理される。まず、モデル出力ファイルが作成され、割り付けられ、開か れる。次に、アクション818が、モデル・テーブル全体にわたって反復され、 各モデル・テーブル・エントリ900に問合せを行う。フィールド「outpu t destination」908が現在のモデル出力ファイルの名前に等し く、フラグ「queue for write flag」926が真である場 合、フィールド「model pointer」904によって指し示されたモ デル118が現在のモデル出力ファイルに格納される。「written fl ag」922は真に設定される。 出力モデル・ファイル・リスト内の最後のファイルに対する処理が完了すると 、制御はグローバル・データ構造除去アクション820(以下では「アクション 820」と呼ぶ)へ移る。 処理はアクション820で終了し、記憶域クリーンナップが行われる。第8図 の実施形態では、あるルーチンを使用して、パッケージ内のグローバル・データ 構造が除去またはクリーンナップされる。マイクロフィッシュの付録Aの実施形 態では、「pkg_end」と呼ばれるルーチンを実行することによって、パッ ケージ内のグローバル・データ構造が除去またはクリーンアップされる。「pk g」はパッケージの名前を表す。たとえば、errパッケージ内のグローバル・ データ構造は、「err_end」と呼ばれるルーチンによってクリーンナップ される。bot、err、conf、auto、cph、ctx、exe、in s、mcil、sym、vimの各パッケージには「pkg_end」ルーチン が実行される。この時点で、コンピュータ・プログラム104の処理が完了する 。関数分析 前述のように、関数分析マスタ・リスト上にリストされた関数の分析はアクシ ョン816で行われる。(アクション810で実行されるトポロジカル・ソート によって作成される)順序付き関数呼出しリストは、関数が分析される順序を制 御する。アクション816は、ブロック図1100(第11図)に示したように 、順序付き関数呼出しリストを巡回し、リスト上の各関数について関数ごと処理 を実行する。分析中の関数は現在の関数として指定される。関数ごと処理は、関 数ごとデータ構造初期設定アクション1102(以下では「アクション1102 」と呼ぶ)から始まる。 アクション1102は、関数ごとに使用されるデータ構造を割り付けるか、あ るいは初期設定する。第11図の実施形態では、あるルーチンを使用することに よって、パッケージ内の関数ごとデータ構造を割り付けるか、あるいは初期設定 する。マイクロフィッシュの付録Aの実施形態では、「pkg_begin_f unction」(「pkg」はパッケージの名前を表す)と呼ばれるルーチン が、パッケージ内の関数ごとデータ構造を割り付けるか、あるいは初期設定する 。たとえば、exeパッケージ内の関数ごとデータ構造は、「exe_begi n_function」と呼ばれるルーチンによって割り付けられる。「pkg _begin_function」ルーチンは、ctx、mcil、err、v im、sym、ins、cph、auto、exeのパッケージ順序で呼び出さ れる。 アクション1102は、実行コンテキストブロック2100に情報をポストす る。実行コンテキストブロック2100を第21図に示す。実行コンテキストブ ロック2100には、「filename(ファイル名)」2102、「fun ction name(関数名)」2104、「current functi on(現在の関数)」2106、「current iteration(現在 の反復)」2108、「current statement(現在の文)」2 110、「current line number(現在の行番号)」211 2、「current expression(現在の式)」2114、「em ulation depth(エミュレーション深さ)」2116、「emul ation context list(エミュレーションコンテキストリスト )」2118の各フィールドが含まれる。 フィールド「filename」2102は、現在の関数を含むソース・ファ イルを識別する。フィールド「function name」2104は、現在 の関数を識別する。フィールド「current function」2106 は、現在の関数を一意に識別する、現在処理されている構文構文解析ツリー構造 304内のノードを指し示すポインタである。フィールド「current i teration」2108は、分析された現在の関数中のパスの数のカウント を指す。フィールド「current statement」2110は、現在 分析されている文を識別する、現在処理されている構文構文解析ツリー構造30 4内のノードを指し示すポインタである。フィールド「current lin e number」2112は、現在分析されている文を含むフィールド「fi lename」2102のソース・ファイル内の行を識別する。フィールド「c urrent expression」2114は、現在分析されている式を識 別する、現在処理されている構文構文解析ツリー構造304内のノードを指し示 すポインタである。フィールド「emu1ation depth」2116は 、フィールド「function name」2114内の関数の入れ子にされ た関数呼出しの深さである。フィールド「emulation context list」2118は、入れ子にされた関数呼出しで呼び出される各関数に関 するコンテキスト情報の集合である。関数呼出しが「入れ子にされる」のは、そ の関数呼出しが他の関数呼出しの引数として使用されるか、あるいはそれ自体の 引数の1つとして他の関数呼出しを使用するときである。フィールド「emul ation depth」2116および「emulation contex t list」2118が意味を持つのは、現在分析されている式が関数呼出し であるときだけである。 アクション1102は、「filename」2102、「function name」2104、「current function」2106を設定 する。本発明の一実施形態では、あるルーチンを使用して、実行コンテキストブ ロック2100の最初の3つのフィールドが初期設定される。マイクロフィッシ ュの付録Aの実施形態では、「ctx_begin_function」と呼ば れるルーチンが実行コンテキストブロック2100の最初の3つのフィールドを 初期設定する。関数ごとデータ構造が割り付けられるか、あるいは初期設定され 、グローバル・データ構造が関数レベル情報で更新された後、処理は構文構文解 析ツリー構造ロードアクション1104へ移る(以下では「アクション1104 」と呼ぶ)。 アクション1104は、現在の関数を表す構文構文解析ツリー構造304をメ モリに読み込む。処理は、アクション1104からパス分析アクション1108 (以下では「アクション1108」と呼ぶ)へ移る。 アクション1108は、現在の関数全体にわたる複数のコード・パスをシミュ レートされた実行を追跡することによって現在の関数を分析する。アクション1 108は、最大パス数に達するか(maximum_pathオプションが設定 されている場合)、あるいはもはや実行するコードがなくなるまで、コード・パ スを実行し続ける。maximum_pathオプションは、ユーザが、各関数 に対して実行される分析の量の限界を設定することを可能にする。maximu m_pathオプションを設定すると、(現在の関数内のいくつかのコード・パ スがトラバースされていない場合でも)分析されるパスの数の上限が設定される 。アクション1108は、最初に実行すべきパスを見つけるループを実行し、次 いでこのパスを実行する。 アクション1108は、決定的選択点履歴を使用してパスを見つける。関数の 実行は、選択点ノードと選択エッジからなる選択点履歴(CPH)ツリーとして モデル化される。CPHツリーは、第5図に示した構文構文解析ツリーと同様に 構造のツリーである。CPHツリーのルート・ノードは、現在の関数中の第1の 未処理の選択点であり、リーフ・ノードは関数リターンおよび関数終了である。 前述のように、選択点とは、条件または述語の値に基づいて2組以上の代替プロ グラム文のうちの1組の間で選択が行われるプログラム内の点である。選択点ノ ードは、分析エンジン308が、処理するのに十分な情報を有さない選択点に対 応する。選択点ノードは、現在の関数内の未処理の選択点に対応する構文構文解 析ツリー構造304内のノードを指し示すポインタを含む。選択エッジは、選択 点のいくつかの異なる可能な処理に対応する。たとえば、相等性に関する試験で は真と偽のどちらかが判定される。選択点ノードは相等性試験に対応する。この 特定の選択点ノードは2つの選択エッジを有する。一方の選択エッジは「真」結 果に対応し、一方は「偽」結果に対応する。 選択点履歴は、各パスが複製可能であるという点で決定性である。コードのい くつかの異なる実行において未処理の各選択点を同様に処理する場合、コード内 の同じパスをたどる。各選択点ノードは、固定数の選択エッジを有する。これは 、未処理の選択点ノードから延びるパスの数が固定されることを意味する。この 数は、実行の前には未知であるが、選択点ノードに関する選択を初めて行うとき に決定される。現在の関数を実行する前にはCPHツリー構造全体が未知である 。CPHツリーは、現在の関数を分析する間に動的に構築される。 CPHツリーは、修正幅優先構築方法を使用したプログラム実行中に構築され る。アクション1108は「現在レベル」値を維持する。現在レベル値は、CP Hツリーにどの選択点が追加されたかを示す。任意の所与の時間には、現在のレ ベルよりも1つ以上上のレベルであるCPHツリーのすべてのノードが処理され ている。したがって、これらのノードのすべての選択エッジが決定される。 アクション1108は、現在のレベルよりも1つ上のレベルであるノードから 出てルート・ノードに戻る未処理の選択エッジを無作為に選択することによって 、新しいパスを選択する。このように、アクション1108は、ルート・ノード から始まるパスを決定し、現在のレベルよりも1つ上のレベルの選択されたノー ドまでCPUツリーをトラバースする。現在のレベルよりも1つ上のレベルのノ ードから出る未処理の選択エッジが見つからない場合、現在レベル値が1だけ増 加され、ステップが繰り返される。現在レベル値を増加させることは、分析がC PHツリー内で1レベル下に移動したことを意味する。現在レベル値が増加され 、現在のレベルよりも1つ上のレベルのノードから出る未処理の選択エッジが依 然としてない場合、もはやパスを見つけることはできない。本発明の一実施形態 では、あるルーチンによって新しいパスが決定される。マイクロフィッシュの付 録Aの実施形態では、「cph_path_find」ルーチンが新しいパスを 決定する。 各パスが決定されるたびに、アクション1108はメモリ・モデルを作成し、 コード・パスに沿った命令のメモリ・モデルに対する効果をシミュレートし、コ ード・パス上の関数呼出しをエミュレートし、エラーを検出した時点で障害イン ジケータ106を生成し、現在の関数のモデル118を構築するのに必要な情報 を収集する。このパスごと処理については以下で詳しく説明する。処理はアクシ ョン1108から関数外部動作モデル収集アクション1110(以下では「アク ション1110」と呼ぶ)へ移る。 アクション1110は、将来モデル作成時に使用される現在の関数の外部動作 モデルを収集する。アクション1110は、収集した外部動作モデルをグローバ ル変数に変換する。以後の処理時に、モデル作成ルーチンがグローバル変数から このような外部動作モデルを抽出する。関数外部動作モデルとは、関数の外部で 参照することができるか、あるいはいくつかの関数呼出しにわたって持続する値 、すなわち局所静的変数を有する関数内のオブジェクトである。関数外部動作モ デルの最も一般的な2つの例はパラメータと返却値である。現在の関数の外部動 作モデルが記録された後、処理はアクション1110から構文構文解析ツリー構 造解放アクション1112(以下では「アクション1112」と呼ぶ)へ移る。 アクション1112は、現在の関数を表す構文構文解析ツリー構造304を解 放する。現在の関数を表す構文構文解析ツリー構造304を必要なくなった時点 で解放することによって、メモリ資源を効率的に使用することができる。本発明 の一実施形態では、アクション1112はあるルーチンによって実行される。マ イクロフィッシュの付録Aの実施形態では、ルーチン「mcil_releas e_memory_region」が構文構文解析ツリー構造304を解放する 。処理はアクション1112から関数ごとデータ構造クリーンナップアクション 1114(以下では「アクション1114」と呼ぶ)へ移る。 関数ごと処理はアクション1114で終了し、関数ごとに使用される記憶域が クリーンナップされる。本発明の一実施形態では、ルーチンを使用して、パッケ ージ内の関数ごとデータ構造が解放またはクリーンナップされる。このルーチン は、exe、auto、cph、ins、sym、vim、err、mcil、 exeのパッケージ順で呼び出される。特に、それぞれのautoパッケージ・ ルーチンは現在の関数のモデル118を作成する。オートモデル化については以 下で詳しく説明する。マイクロフィッシュの付録Aの実施形態では、「pkg_ end_function」(「pkg」はパッケージの名前を表す)というラ ベルの付いたルーチンが、関数ごとに使用される記憶域をクリーンナップまたは 解放する。たとえば、vimパッケージ内の関数ごとデータ構造は、「vim_ end_function」というラベルの付いたルーチンによって解放される 。「pkg_end_function」ルーチンは、「pkg_begin_ function」ルーチンの逆の順序で呼び出される。アクション1114が 完了すると、関数ごと処理が終了する。パスの分析 前述のように、アクション1108は、複数のシミュレートされた実行のコー ド・パスを追跡することによって現在の関数を分析する。アクション1108は 、分析する各パスごとに1回ずつ、現在の関数を表す構文解析ツリー構造304 (以下では、「現在の構文解析ツリー構造304」と呼ぶ)をトラバースする。 アクション1108は、分析する各パスについて、ブロック図1200(第12 図)に示したようにパスごと処理を実行する。分析中のパスは現在のパスとして 指定される。パスごと処理は、プログラム読取りアクション1202(以下では 「アクション1202」と呼ぶ)から始まる。 アクション1202は、現在の関数に関してプラグマが定義されているかどう かを判定する。プラグマとはIntrinsa指令であり、プラグマの直後の関 数または文の制御を設定する。ユーザは、関数のソース・コードにIntrin saプラグマを埋め込むことによって構成オプションを指定することができる。 関数の直前に配置されたプラグマは、関数全体に適用される。たとえば、以下の プラグマは、主関数のすべての文に適用される。 「抑制(suppress)」構成オプションの詳細は、付録Bに記載されてい る。 アクション1202は、プラグマを見つけるとまず、プラグマによって指定さ れた構成オプションの現在の設定を保存し、次いでプラグマに指定された値に応 じてこのような構成オプションを設定する。処理はアクション1202からパス ごとデータ構造初期設定アクション1204(以下では「アクション1204」 と呼ぶ)へ移る。 アクション1204は、パスごとに使用されるデータ構造を割り付けるか、あ るいは初期設定する。第12図の実施形態では、あるルーチンを実行することに よって、パッケージ内のパスごとデータ構造が割り付けられるか、あるいは初期 設定される。このようなルーチンは、ctx、mcil、err、vim、sy m、ins、cph、auto、exeのパッケージ順で呼び出される。マイク ロフィッシュの付録Aの実施形態では、アクション1204で実行されるルーチ ンには「pkg_begin_path」(「pkg」はパッケージの名前を表 す)というラベルが付けられる。たとえば、symパッケージ内のパスごとデー タ構造は、「sym_begin_path」というラベルの付いたルーチンに よって割り付けられる。 チャンク・テーブルは、アクション1204によって作成されるパスごとデー タ構造の例である。チャンク・テーブルは、1組のすべてのモデル化メモリを含 み、記憶域管理とリーク検出のために使用される。本発明の一実施形態では、チ ャンク・テーブルは、チャンクを指し示すポインタの集合としてインプリメント される。チャンクとは既知のメモリのモデル化された部分であり、これについて は以下で詳しく説明する。概念的には、追跡されるあらゆるパスは関数の異なる 実行であり、したがって、各実行をサポートするために新しいメモリ・モデルが 作成される。本発明の一実施形態では、チャンク・テーブルはあるルーチンによ って作成される。マイクロフィッシュの付録Aの実施形態では、「vim_be gin_path」ルーチンがチャンク・テーブルを作成する。 アクション1204によって作成される他のパスごとデータ構造は記号テーブ ルである。記号テーブルは、名前(「記号」)を含む構文解析ツリー・ノードを メモリ・モデル内の位置と関連付ける。記号テーブルとは、記号テーブル・エン トリ1300を指し示すポインタの集合である。各記号テーブル・エントリ13 00は、現在の関数で使用される変数に対応する。 記号テーブル・エントリ1300を第13図に示す。記号テーブル・エントリ 1300は、「parse tree pointer(構文解析ツリー・ポイ ンタ)」1302、「symbol type(記号タイプ)」1304、「m emory type(メモリ・タイプ)」1306、「symbol loc ation(記号位置)」1308、「symbol location po inter(記号位置ポインタ)」1310、「parent index(親 インデックス)」1312の各フィールドを含む。メモリ・モデル内の位置につ いては以下で詳しく説明する。 フィールド「parse tree pointer」1302は、記号テー ブル・エントリ1300によって表される記号を定義する現在の構文解析ツリー 構造304内のノードを指し示す。フィールド「symbol type」13 04は、記号テーブル・エントリ1300によって表される記号の種類を識別す る。本発明の一実施形態では、フィールド「symbol type」1304 の可能な値は「変数」、「定数」、「ルーチン」、「差」、「返却値」である。 フィールド「memory type」1306は、記号テーブル・エントリ1 300によって表される記号の値を保持するために使用されるメモリの種類を記 述する。メモリ・タイプについては以下で詳しく説明する。 フィールド「symbol location」1308は、記号テーブル・ エントリ1300によって表される記号の値を記憶するチャンクを指し示すコー ド化ポインタである。コード化ポインタについては以下で詳しく説明する。フィ ールド「symbol location pointer」1310は、「s ymbol location」1308によって指し示されるチャンクのコー ド化ポインタを記憶するチャンクのコード化ポインタ(すなわち、記述中の記号 の値を指し示すポインタ)である。フィールド「parent index」1 312は差のためだけに使用される。差とは、ポインタによって指し示される値 を指す。記号テーブル・エントリが微分値を表すとき、フィールド「paren t index」1312は、この微分値に到達するために使用されるポインタ の記号テーブル内でのインデックスを保持する。たとえば、記号テーブル・エン トリが*P(Pによって指し示される値)のエントリである場合、フィールド「 parent index」1312は、ポインタPの記号テーブル内でのイン デックスを含む。 アクション1204は、実行コンテキストブロック2100に情報をポストす る。アクション1206はフィールド「current iteration」 2108内のカウントを1(このパスの数を示す)だけ更新する。処理は返却値 レイアウトアクション1206(以下では「アクション1206」と呼ぶ)へ移 る。 アクション1206は、現在の関数の返却値用のモデル化メモリをレイアウト する。アクション1206はまた、返却値を記号テーブルに入れる。まず、アク ション1206は、返却値を表すのに必要なメモリの量を求める。この量、すな わち返却値の長さはバイト単位で測定される。次いで、アクション1206は、 返却値を表すのに必要なメモリの量を用いてメモリ作成ユニット1500を呼び 出す。メモリ作成ユニット1500は、返却値を保持するモデル化メモリの部分 を作成し、メモリ・モデル内の新たに作成された位置を指し示すコード化ポイン タをアクション1206に返す。メモリ作成ユニット1500の動作については 以下で詳しく説明する。次に、アクション1206は、作成された返却値位置を 指し示すポインタをレイアウトする。第12図の実施形態では、ポインタの長さ は4バイトである。前述のように、アクション1206はメモリ作成ユニット1 500を呼び出し、モデル化メモリの適切なサイズの部分を作成し、新たに作成 されたモデル・メモリ位置を指し示すコード化ポインタを受け取る。アクション 1206は、返却値を指し示すポインタの位置に、返却値の位置のコード化アド レスを格納する。最後に、アクション1206は記号テーブルに返却値を入れる 。 アクション1206は、記号テーブル・エントリ1300を作成する。返却値 を含む構文解析ツリー・ノードを指し示すポインタは、フィールド「parse tree pointer」1302内に置かれる。「変数」の記号タイプは フィールド「symbol type」1302内に置かれる。「返却値」はフ ィールド「memory type」1306内に置かれる。返却値を保持する ために作成された第1の位置を指し示すコード化ポインタは「symbol l ocation」1308内に置かれる。返却値を指し示すポインタを格納する ために作成された第2の位置を指し示すコード化ポインタはフィールド「sym bol location pointer」1310内に置かれる。アクショ ン1206では記号テーブルに記号差を格納することはないので、フィールド「 parent index」1312は使用されない。本発明の一実施形態で は、あるルーチンによって記号テーブルに記号テーブル・エントリ1300が入 れられる。マイクロフィッシュの付録Aの実施形態では、「sym_add_s ymbol」というラベルの付いたルーチンが記号テーブルに記号テーブル・エ ントリ1300を入れる。処理は、パスに沿った文の処理アクション1208( 以下では「アクション1208」と呼ぶ)へ移る。 アクション1208は、現在のパスをトラバースし各文の実行を模倣する責任 を負う。アクション1208は、個々の各文タイプの実行をシミュレートまたは エミュレートするのに適切な処理を実行する。アクション1208の処理につい ての詳細な議論は、以下に見出し「文の分析」の下で提示する。現在のパスに沿 って各文を処理するアクション1208が終了した後、処理は記号テーブル順序 付けアクション1210(以下では「アクション1210」と呼ぶ)へ移る。本 発明の一実施形態では、アクション1208はあるルーチンによって実現される 。マイクロフィッシュの付録Aの実施形態では、「exe_execute_s tatement」というラベルの付いたルーチンがアクション1208の関数 を実行する。 アクション1210は、記号テーブルをソートし、分析エンジン308によっ てトラバースされる各パスに関する記号テーブル上の順序を同じにする。オート モデル化では、いくつかの異なるパスの結果を比較する必要がある。記号テーブ ルをソートすると、現在のパスを実行した結果を他のパスを実行した結果と比較 するのが容易になる。本発明の一実施形態では、記号テーブルはアルファベット 順にソートされる。 記号テーブルをソートする理由は例を介して最もうまく説明することができる 。オートモデル化中には、後述のように、オートモデル化のために必要な記号テ ーブル内のあらゆる記号が調べられる。記号テーブル・エントリ1300がポイ ンタである場合は、ポインタ・チェーンをたどる。ポインタ・チェーンに沿った 各位置は、チェーンの先頭にある記号の名前と、その前にある、この位置に到達 するのに必要な各間接参照レベルについてのアスタリスク(「*」)とでラベル 付けされる。たとえば、第14a図を参照するとわかるように、p1412は、 「Loc1」位置1416を指し示す記号テーブル1410内のポインタである 。 「Loc1」位置1416は、ポインタp1412から1間接参照レベルだけ離 れており、「*p」とラベル付けされる。「Loc1」位置1416は「Loc 2」位置1418を指し示す。「Loc2」位置1418は、ポインタp141 2から2間接参照レベルだけ離れており、「**p」とラベル付けされる。 記号は、関数のパスに沿って記号に出会う順序で記号テーブル内に置かれる。 関数のそれぞれの異なる経路をトラバースする際にそれぞれの異なる順序で記号 に出会う。第14a図では、コード・パス上でポインタq1414よりも前にポ インタp1412に出会っており、したがって、p1412は記号テーブル14 10ではq1414よりも前にある。同じ関数中の異なる経路を表す第14b図 では、ポインタp1412よりも前にポインタq1414に出会う。したがって 、第14b図では、q1414は記号テーブル1420でp1412よりも前に 記録される。 ポインタp1412およびq1414は、値ゼロを含むメモリ・モデル位置1 424(Loc2)を指し示す共用メモリ・モデル位置1422(Loc1)を 指し示す。前述のラベル付けステップを第14a図の記号テーブル1410に対 して実行すると、結果は「*p=0」になる。この結果は、チェーンがポインタ p1412から始まることに基づいて「Loc1」位置1416を*pとラベル 付けすることから導かれる。ラベル付け演算を第14b図の記号テーブル142 0に対して実行すると、結果は「*q=0」になる。この結果は、チェーンがポ インタq1414から始まることに基づいて位置1422「Loc1」を*qと ラベル付けすることから導かれる。2つのパスは共に同じ実際の結果を有するが 、式が異なる(「*p=0」と「*q=0」)ので、結果を併合することは難しい 。 記号テーブルをソートすると、ポインタp1412は常にポインタq1414 よりも前に処理される。このように、2つのパスは共に結果を「*p=0」とし て表す。記号テーブルを順序付けることによって、2つのパスの結果を単一の結 果に併合することができる。したがって、記号テーブルを順序付けると、オート モデル化処理によって、いくつかの異なるパスの結果を容易に比較することがで きる。本発明の一実施形態では、あるルーチンによって記号テーブルが順序付け される。マイクロフィッシュの付録Aの実施形態では、ルーチン「sym_or der_table」が記号テーブルを順序付ける。処理はアクション1210 からリーク検出アクション1212(以下では「アクション1212」と呼ぶ) へ移る。 アクション1212はリーク検出処理を実行する。アクション1212は、す べてのモデル化メモリを巡回し、現在のパスを分析する間に累積されたメモリ割 付けに関する情報を走査する。アクション1212は、現在の関数が終了する際 にリークするメモリのチャンクを識別する。割付け時にはメモリの一部がリーク するが、このことが、関数が終了した後に記号によって指摘されることはない。 アクション1212は、リークした資源も検出する。アクション1212によっ て実行される処理の詳細な説明は、以下に見出し「リーク検出」の下で与える。 処理はアクション1212からpragma_optionリセットアクション 1214(以下では「アクション1214」と呼ぶ)へ移る。 アクション1214は、アクション1202で設定された構成オプションを再 生する。現在の関数にプラグマが定義されている場合、アクション1214は、 このプラグマに指定されている構成オプションをアクション1202で保存され た値に設定する。アクション1214は、処理をパスごとデータ構造解放または クリーンナップアクション1216(以下では「アクション1216」と呼ぶ) へ移す。 パスごと処理はアクション1216で終了し、パスごとに使用される記憶域が クリーンナップされ、グローバル・データ構造が現在のパスに関する情報で更新 される。第13図の実施形態では、あるルーチンを実行することによって、パッ ケージ内のパスごとデータ構造が解放またはクリーンアップされる。このような ルーチンは、アクション1204で実行されるルーチンとは逆のパッケージ順で 呼び出される。アクション1216によって呼び出されるルーチンは、exe、 auto、cph、ins、sym、vim、err、mcil、ctxのパッ ケージ順で呼び出される。マイクロフィッシュの付録Aの実施形態では、アクシ ョン1216によって呼び出されるルーチンには「pkg_end_path」 というラベルが付けられる。この場合、「pkg」はパッケージの名前を表す。 たとえば、exeパッケージ内のパスごとデータ構造は、「exe_end_p ath」というラベルの付いたルーチンによって解放される。autoパッケー ジに対応するアクション1216によって実行されるルーチンは、現在のパスの 「実行」に関する情報を収集し、現在の関数のモデル118を作成する際に助け となるので特に重要である。オートモデル化については以下で詳しく説明する。 アクション1216が完了すると、パスごと処理が終了する。メモリ作成ユニット1500 前述のように、メモリ作成ユニット1500は、メモリをモデル化するために 必要なデータ構造を作成する。分析エンジン308によって作成されたメモリ・ モデルは、実行中にプログラムが使用するメモリを表している。分析エンジン3 08は構造上のメモリ・モデルを作成する。というのは、そのモデルは値ではな く値の内部合成物(composition)を単一ユニットとして模倣するか らである。たとえば、C言語プログラムを分析する本発明の一実施形態では、倍 長整数は、1つの単一アドレス可能値とは対照的に、個々にアドレス可能な4バ イトの合成物として表されている。しかし、メモリ・モデルは、一時値を格納す るために多くのコンピュータ・プログラムが使用するヒープ記憶域のように、物 理的に隣接しているわけではない。 メモリ・モデルは、チャンク(chunk)・テーブルと、チャンク1700 と、ポインタによってまとめてリンクされた格納値1800から構成される。前 述のように、チャンク・テーブルはモデル化メモリのすべてを記録する。チャン ク1700は、1つまたは複数の隣接メモリ位置をモデル化する。格納値180 0は、1つまたは複数のメモリ位置(すなわち、チャンク1700)に格納され た値を保持する。チャンク1700および格納値1800については以下に詳述 する。メモリ作成ユニット1500の処理は、起点情報収集アクション1502 (以下「アクション1502」という)から始まる。 アクション1502は、メモリが作成されるコンテキストを追跡するものであ る。アクション1502は、メモリ作成ユニット1500が処理を開始したとき にコンテキスト情報をカプセル化する起点コンテキスト構造1600を作成する 。起点コンテキスト構造1600は、後述するようにチャンク1700に格納さ れ る。起点コンテキスト構造については第16図に示す。起点コンテキスト構造1 600は、「外部IDタイプ」1602と、「外部ID」1604と、「メモリ ・タイプ」1606と、「ステートメントの作成元」1608と、「式の起点」 1610と、「エミュレーション中フラグ」1612と、「ソース・コード・フ ァイル」1614と、「ソース行番号」1616と、「入力名」1618と、「 出力名」1620というフィールドを含む。 フィールド「外部IDタイプ」1602は、その記憶域が作成された項目のタ イプを示す。本発明の一実施形態で可能な項目タイプは、「記号」、「格納値」 、「文字列」、「戻り値」、「未知」である。「格納値」については後述するが 、「未知」は項目タイプを決定できないことを意味する。「記号」および「文字 列」というタイプの項目は、当業者には周知のものである。フィールド「外部I D」1602は、モデル化したメモリの作成をトリガする項目を明確に識別する 現行構文解析ツリー構造304内のノードを指すポインタを含む。 フィールド「メモリ・タイプ」1606は、何のためにそのメモリが作成され るのかを分類する。以下に詳述するように、フィールド「メモリ・タイプ」16 06はモデル化のために使用する。その関数の外部で可視の項目のためにメモリ を作成している場合、それは自動モデル化の際に使用されることになる。本発明 の一実施形態では、モデル化したメモリのタイプは、定数、グローバル、グロー バルのデリファレンス、スタティック、スタティックのデリファレンス、ローカ ル、パラメータ、パラメータのデリファレンス、ヒープ・メモリ、資源定義、資 源、一時、未知、アドレス定数、文字定数、ゼロ定数である。当業者であれば、 定数、グローバル、ローカル、スタティック、パラメータ、戻り値の各項目につ いては分かるだろう。 前述のように、デリファレンスとは、ポインタが指し示す値を意味する。たと えば、グローバルのデリファレンスは、グローバル変数が指し示す値を保持する メモリ位置を示す。「未知」というメモリ・タイプは、モデル化したメモリの区 画がその関数の外部で可視ではないことを示す。メモリ・タイプが「未知」の項 目は、現行関数用のモデル118を作成する際に使用しない。一時値は、現行関 数が実行する計算の中間ステップから得られ、現行構文解析ツリー構造304で 識別される。ヒープ・メモリは現行関数が割り振ったメモリである。たとえば、 C言語の「malloc(10)」という関数呼出しは10バイトのヒープ・メ モリを作成する。資源および資源定義は、ファイルおよびウィンドウなど、関数 が使用するオブジェクトを示す。 より一般的な「定数」メモリ・タイプは、分析エンジン308内の処理の最適 化を見込んでおくために、アドレス、文字、文字列定数という特定のケースとは 区別される。ゼロは頻繁に使用される数なので、分析エンジン308は、現行関 数で使用するたびに定数ゼロのインスタンスを1つだけモデル化する。他の定数 タイプとは対照的に、アドレス定数だけがデリファレンスされるので、リーク検 出処理が改善される。項目が有効ポインタであるかどうかを判定するチェックは 、文字定数については行う必要がないので、全体的な効率が改善される。最適化 されたメモリ管理および意志決定によって、分析エンジン308のパフォーマン スが改善される。 フィールド「ステートメントの作成元」1608は、フィールド「外部ID」 1604で識別された項目を含むステートメントを識別する現行構文解析ツリー 構造304内の構文解析ツリー・ノードを指すポインタである。フィールド「式 の起点」1610は、フィールド「外部ID」1604で識別された項目を含む 式を識別する現行構文解析ツリー構造304内の構文解析ツリー・ノードを指す ポインタである。フラグ「エミュレーション中フラグ」は、モデル化メモリがモ デル118の実行のために作成されるときに真になる。フィールド「ソース・コ ード・ファイル」1614は、現行関数を含むソース・コード・ファイルの名前 を識別する。フィールド「ソース行番号」1616は、フィールド「ステートメ ントの作成元」1608によって識別されるステートメントのフィールド「ソー ス・コード・ファイル」1614によって識別されるソース・コード・ファイル 内の行番号を識別する。フィールド「入力名」1618は、作成中のモデル化メ モリの区画に関連する元の格納値の名前を含む。フィールド「出力名」1620 は、作成中のモデル化メモリの区画に関連する最終値の名前を含む。フィールド 「入力名」1618およびフィールド「出力名」1620は、モデル化している メモリ位置が現行関数の開始時(「入力名」1618)または終了時(「出力名 」 1620)のいずれでアクセス可能であるかを記録するために自動モデル化プロ グラムによって使用される。起点コンテキスト構造1600に適切に記入した後 、処理はアクション1504に移行する。 アクション1504は、1つまたは複数の隣接メモリ位置用のモデルを作成す るものである。メモリ位置は、アドレスによって明示的かつ明確に指定可能なメ モリの最小単位である。通常、コンピュータ・メモリはバイト・アドレス可能で あり、したがって、1つの位置は1バイトである。アクション1504は、チャ ンク1700を使用してメモリをモデル化する。チャンク1700については第 17図に示す。チャンク1700は、「解放フラグ」1702と、「到達可能フ ラグ」1704と、「紛失フラグ」1706と、「メモリ・タイプ」1708と 、「チャンク番号」1710と、「起点コンテキスト構造ポインタ」1712と 、「格納値ポインタ」1714と、「元の格納値ポインタ」1716というフィ ールドを含む。 フラグ「解放フラグ」は、チャンク1700によってモデル化されたメモリ位 置が解放されたときに真になる。フラグ「到達可能フラグ」1302は、そのメ モリ位置が到達可能であるかどうかを判定するためにリーク検出処理が使用する 。フラグ「紛失フラグ」1706は、モデル化したメモリが解放されるかまたは リークされるかどうかを判定できないときに真になる。紛失メモリの場合、関数 が終了したあとでメモリを指し示すものが何もない可能性があるが、メモリを指 すポインタのレコードがないというだけで、このようなポインタが存在しないこ とを意味するわけではない。たとえば、欠落モデルによってモデル化されるルー チンにメモリを割り振って、渡すことができる。分析エンジン308は、ルーチ ンに渡された割振りメモリに何が起きたのかを確かめることができない。したが って、そのメモリは「紛失」としてマークされる。フィールド「メモリ・タイプ 」1708は、前述のフィールド「メモリ・タイプ」1606と同じ情報を保持 する。フィールド「チャンク番号」1710は、チャンク1700用の固有の識 別子である。フィールド「起点コンテキスト構造ポインタ」1712は、アクシ ョン1502で作成された起点コンテキスト構造1600を指し示す。フィール ド「格納値ポインタ」1714は、モデル化メモリ位置にある現行値を指し示す 。 フィールド「元の格納値ポインタ」1716は、モデル化メモリ位置にある元の 値を指し示す。 まず、アクション1504は、チャンク1700を再使用できるかどうかを判 定するために、チャンク・テーブル内を反復してチャンク1700を調べる。ア クション1504がチャンク1700を再使用できない場合、新しいチャンク1 700を作成しなければならない。新しいチャンク1700を指すポインタはチ ャンク・テーブル内に配置される。チャンク番号1710には、新しいチャンク 1700を明確に識別する番号が割り当てられる。フラグ「解放フラグ」170 2、「到達可能フラグ」1704、「紛失フラグ」1706は、偽に初期設定さ れる。フィールド「メモリ・タイプ」1708は、アクション1502で設定さ れた「メモリ・タイプ」1606と等しくなるように設定される。フィールド「 起点コンテキスト構造ポインタ」1712は、アクション1502で構築された 起点コンテキスト構造1700を指し示すように設定される。次に処理は、格納 値セットを作成するために値モデル化アクション1506(以下「アクション1 506」という)に移行する。 アクション1506は、アクション1504で作成したチャンク1500によ ってモデル化された位置に配置された値をモデル化するものである。メモリ作成 ユニット1500は、格納値セットを作成することによって値をモデル化する。 格納値セットは格納値の集合である。各格納値は、1単位分のメモリを表すデー タ構造である。第15図の実施形態では、メモリ作成ユニット1500は、Cコ ンピュータ言語のメモリ管理特性を模倣する。Cコンピュータ言語は、隣接バイ ト・セットとして値を割り振る。各格納値は1バイト分のメモリを表す。したが って、1セット分の格納値は、1つの値を格納するために使用するバイトの集合 を表す。たとえば、正規整数は、通常、長さ4バイトである。アクション150 6は、4つの格納値を作成し、それを格納値セット内に配置することによって整 数をモデル化する。 アクション1506は、作成中のメモリの各バイトごとに1つの格納値を作成 する。作成した各格納値を指すポインタは格納値セット内に配置される。したが って、格納値セットは、格納値を指すポインタの集合になる。格納値は、格納値 ブロック1800によって表される。格納値ブロック1800については第18 図に示す。格納値ブロック1800は、「起点ポインタ」1802と、「資源フ ラグ」1804と、「正確値既知フラグ」1806と、「初期設定済みフラグ」 1808と、「想定値フラグ」1810と、「制約フラグ」1812と、「結果 フラグ」1814と、「保護フラグ」1816と、「正確値」1818と、「入 力からのバイト」1820と、「出力からのバイト」1822というフィールド を含む。 フィールド「起点ポインタ」1802は、アクション1502で作成した起点 コンテキスト構造1600を指し示す。フラグ「資源フラグ」1804は、この データ構造が格納値または格納資源のいずれを表すかを識別する。フラグ「資源 フラグ」1804は、データ構造が格納値を表す場合に必ず偽になる。資源は格 納値と同様に表されるが、格納値ブロック1800の代わりに格納資源ブロック 1900を使用する。格納資源ブロック1900については後述する。フラグ「 正確値既知フラグ」1806は、フィールド「正確値」1818が有効値を含む ときに真になる。フラグ「想定値フラグ」1810は、この値が処理中に想定さ れた場合に真になる。フラグ「制約フラグ」1812は、モデル118内の制約 でこの値を使用できる場合に真になる。フラグ「結果フラグ」1814は、モデ ル118内の結果でこの値を使用できる場合に真になる。フラグ「保護」は、モ デル118内の保護でこの値を使用できる場合に真になる。制約、結果、保護に ついては「概念のモデル化」という見出しの項で詳述する。フィールド「正確値 」1818は、モデル化メモリ位置に格納された正確値を含む。フィールド「入 力からのバイト」1820は、この格納値に対応する(「元の格納値ポインタ」 1716が指し示す)元の格納値セット内の特定のバイトを識別する。フィール ド「出力からのバイト」1822は、この格納値に対応する(「格納値ポインタ 」1714が指し示す)最終格納値セット内の特定のバイトを識別する。 あるいは、資源用のメモリをモデル化するためにメモリ作成ユニット1500 を呼び出す場合、アクション1506は、格納資源ブロック1900を作成する ことになる。格納資源ブロック1900については第19図に示す。格納資源ブ ロック1900は、「起点ポインタ」1902と、「資源フラグ」1904と、 「リーク可能フラグ」1906と、「到達可能フラグ」1908と、「紛失フラ グ」1910と、「想定フラグ」1912と、「資源タイプ」1914と、「資 源状態」1916というフィールドを含む。 フィールド「起点ポインタ」1902は、アクション1502で作成した起点 コンテキスト構造1600を指し示す。フラグ「資源フラグ」1904は、この データ構造が格納値または格納資源のいずれを表すかを識別する。フラグ「資源 フラグ」1904は、データ構造が格納資源を表す場合に必ず真になる。フラグ 「リーク可能フラグ」1906は、現行関数が終了したあとで資源を指し示すこ とができないときに真になる。フラグ「到達可能フラグ」1908は、後述する ようにリーク検出処理の際に使用する。フラグ「紛失フラグ」1910は、現行 関数が終了したあとで資源を指し示すかどうかを分析エンジン308が予測でき ないことを示す。フラグ「想定フラグ」1912は、分析エンジン308での処 理中に資源が想定されたときに真になる。フィールド「資源タイプ」1914お よび「資源状態」1916は、モデル化メモリを必要とする資源のタイプと状態 をそれぞれ保持する。必要な数の格納値ブロック1800または格納資源ブロッ ク1900が作成され、格納値セット内に配置された後、処理はメモリ位置と値 とのリンク・アクション1508(以下「アクション1508」という)に移行 する。 アクション1508は、モデル化値(または資源)をモデル化メモリ位置にリ ンクするものである。これがチャンク1700について第1の格納値セットであ る場合、格納値ポインタ1714と元の格納値ポインタ1716の両方は、アク ション1504で作成した格納値セットを指し示すように設定される。そうでは ない場合、格納値ポインタ1714だけが、アクション1514で作成した格納 値セットを指し示すように設定される。このようにして、1つの位置に関する元 の格納値セットと、1つの位置に関する最新格納値セットがチャンク1700に 記憶される。格納値の中間インスタンスは自動モデル化には必要ないので廃棄さ れる。モデル118は、関数が求める結果を記述するものであって、結果に到達 する方法を記述するものではない。したがって、中間インスタンスではなく、格 納値の初期インスタンスと最終インスタンスだけが、自動モデル化のために検査 される。 メモリ作成ユニット1500用の処理は終了し、アクション1508はメモリ 作成ユニット1500の呼出し側に新たにモデル化したメモリを指す符号化ポイ ンタを返す。符号化ポインタは、チャンク1700を指すポインタと、格納値ポ インタ1712が指し示す格納値セットへのオフセットからなる。モデル化メモ リ内の位置はシミュレートしたメモリ位置なので、符号化ポインタが必要になる 。たとえば、第20図に示すようにメモリをモデル化するために使用するデータ 構造間のリンクの簡略図を参照されたい。チャンク2004は、チャンク・テー ブル2002内の項目によって配置される。次にチャンク2004は、関連の格 納値セット2006を指すポインタを含む。格納値セット2006へのオフセッ トは、格納値2008、2010、2012を指すポインタである。したがって 、モデル化メモリ内では、真のメモリ位置とは異なり、単純な物理アドレスによ って値にアクセスすることができない。このため、モデル・メモリ位置、または より単純に位置は、格納値ブロック1800を指す符号化ポインタになる。リーク検出 前述のように、リークは、パス内のステートメントが処理されたあとでパス分 析の終わりにアクション1212で検出される。メモリ・リークは、マーク・ス ウィープ方法を使用して検出される。まず、アクション1212は、チャンク・ テーブル内を反復し、各チャンクを到達不能としてマークする。チャンク170 0は、フラグ「到達可能フラグ」1704を偽に設定することによって到達不能 としてマークされる。次に、アクション1212は、記号テーブル内の各外部内 を反復し、ポインタ連鎖のみを移動する。アクション1212は、ポインタ連鎖 内で検出された各チャンク1700を到達可能としてマークする。チャンク17 00は、フラグ「到達可能フラグ」1704を真に設定することによって到達可 能としてマークされる。記号テーブルを処理した後、アクション1212は、チ ャンク・テーブル内を反復して各チャンク1700を検査する。各チャンクごと に、それがヒープ記憶域であって、解放も紛失もされておらず、依然として到達 不能としてマークされている場合、そのチャンクはリーク済みとして報告される 。 本発明の一実施形態では、メモリ・リークは、対応する故障インジケータ106 によって報告される。 また、アクション1212は資源リークも報告する。チャンク・テーブル内で もう一度反復が行われるが、今回のアクション1212は、資源を示すようにフ ィールド「メモリ・タイプ」1708が設定されたすべてのチャンク1700を サーチする。資源を定義する各チャンクごとに、対応する格納資源ブロック19 00に対して問合せを行う。資源が到達可能ではなく、認識された状態の1つに なっていない場合、それはリーク済みとして報告される。認識された状態として は、閉、解放、リリース済み、削除済みがある。本発明の一実施形態では、資源 リークは対応する故障インジケータ106によって報告される。ステートメント分析 アクション1208は、前述のように、現行パスに沿って各ステートメントの 実行の模倣を担当する。分析中の現在のステートメントを現行ステートメントと 称する。アクション1208は、さらに処理するために現行ステートメントを識 別し、分散する。アクション1208については第22図のブロック図に示す。 アクション1208用の処理は、プラグマ読取りアクション2202(以下「ア クション2202」という)から始まる。 アクション2202は、現行ステートメント用にプラグマが定義されているか どうかを判定するものである。前に提示したように、プラグマは、プラグマの直 後の関数またはステートメントに関する制御を設定するIntrinsa指示文 である。ステートメントの直前のソース・コード内に配置されたIntrins aプラグマは、その特定のステートメントのみを制御するための構成オプション を指定する。たとえば、以下のプラグマは、「a=1+2;」というステートメ ントのみに適用される。 #pragma INTRINSA“suppress=null_point er,uninitialized” a=1+2; b=a; 「suppress」構成オプションに関する詳細は付録Bに記載されている 。アクション2202は、プラグマを検出した場合、まず、プラグマによって指 定された構成オプションの現行設定を保管し、次に、プラグマ内に指定された値 に応じてこれらの構成オプションを設定する。処理は、アクション2202から コンテキスト情報更新アクション2204(以下「アクション2204」という )に移行する。 アクション2204は、実行コンテキスト・ブロック2100にコンテキスト 情報を通知するものである。現行ステートメント2110は、現行ステートメン トを表す現行構文解析ツリー構造304内のノードを指し示すように設定される 。 現行行番号2112は、現行ステートメントを含む現行関数を格納するファイル 内の行番号に設定される。処理は、アクション2204から個々のステートメン ト・タイプに基づく直接処理アクション2206(以下「アクション2206」 という)に移行する。 アクション2206は、さらに処理するためにステートメント・ユニットに分 散することにより、個々のステートメントを処理するものである。アクション2 206は、まず、分析中のステートメントのタイプを識別する。次にアクション 2208は、処理制御を対応するステートメント・ユニットに移転する。第22 図の実施形態に関して、表3は、ステートメントのタイプと呼び出されたステー トメント・ユニットとの対応関係を示している。「ステートメント・ユニット」 という列に列挙したモジュールについては以下に詳述する。「ステートメント・ タイプ」という列に列挙したステートメント・タイプは、当業者にとって周知も のである。制御がアクション2206に戻ると、処理は、プラグマ・オプション ・リセット・アクション2208(以下「アクション2208」という)に移行 する。 アクション2208は、アクション2202で設定した構成オプションを復元 するものである。現行ステートメント用にプラグマが定義されている場合、アク ション2208は、プラグマ内に指定された構成オプションをアクション220 2で保管した値に設定する。アクション2208は処理制御を開始アクション制 御に返す。 次にステートメント・ユニットの説明に移行すると、ブロック・ユニットは、 ブロック・ステートメント内のステートメントによるループを実行する。ブロッ ク・ステートメントは、しばしば複文と呼ばれるが、1つの構文ユニットを形成 する1組のステートメントである。通常、ブロック・ステートメントは、Cプロ グラミング言語で書かれた関数内の最高レベルのステートメントである。ブロッ ク・ユニットについては、論理流れ図2300(第23図)として詳細に示す。 パス終了判断2301(以下「判断23011という)では、現在のブロック が終了したかどうかを確認するためにチェックを行う。nullまたはexit ステートメントが前に処理されている場合、現行ブロック・ステートメントの分 析は完了し、論理流れ図2300による処理、したがって、ブロック・ユニット は終了する。現在のブロックが依然として活動状態である場合、処理は、got oステートメントが処理されているかどうかを判定するgotoケース判断23 02(以下「判断2302」という)に移行する。第23図の実施形態では、g oto処理は、gotoパラメータに問い合わせることによって識別される。マ イクロフィッシュの付録Aの実施形態では、gotoパラメータは「goto_ statement」と命名されている。gotoステートメントがシミュレー トされることをgotoパラメータが示している場合、処理はターゲット判断2 303(以下「判断2303」という)に移行し、そうではない場合、処理制御 はステートメント分析アクション2305(以下「アクション2305」という )に移行する。 判断2303は、活動gotoステートメントのターゲットであるステートメ ントに到達したかどうかを確認するためにテストを行う。判断2303は、ブロ ック内の現行ステートメントを表す現行構文解析ツリー・ノードを指すポインタ と、gotoターゲット・ステートメントを表す現行構文解析ツリー・ノードを 指すポインタとを比較する。2つのポインタが一致する場合、ブロック内の現行 ステートメントはgotoターゲット・ステートメントである。gotoターゲ ット・ステートメントに到達している場合、処理はgoto切断アクション23 04(以下「アクション2304」という)に移行する。ブロック内の現行ステ ートメントがgotoターゲット・ステートメントではない場合、処理は最終判 断2306(以下「判断2306」という)に移行する。 アクション2304は、処理中の活動gotoステートメントがないことを示 すためにgotoパラメータを偽に設定する。アクション2304が完了した後 、処理はアクション2305に移行する。アクション2305はブロック内の現 行 ステートメントを分析するものである。アクション2305は、ブロック内の現 行ステートメントを表す現行構文解析ツリー構造304内のノードを指すポイン タを取り出し、処理制御とともにそのポインタを再帰的にアクション1208に 転送する。制御がアクション2305に戻ると、処理は最終判断2306に移行 する。 判断2306は、現在のブロック・ステートメント内の最終ステートメントが 処理されたかどうかを判定する。判断2306が真になる場合、論理流れ図23 00による処理、したがって、ブロック・ユニットは終了する。そうではない場 合、最終ステートメントに到達していないので、処理は次の獲得アクション23 09(以下「アクション2309」という)に移行する。アクション2309は 、ブロック内の次のステートメントを獲得し、判断2301に制御を移転して、 現在のブロック・ステートメントの処理を続行する。 式ユニットは式を処理するものである。入力として、式ユニットは、処理すべ き式を表す現行構文解析ツリー構造304内のノードを指すポインタを受け取る 。出力として、式ユニットは、式の結果を保持する位置を指すポインタを返す。 「式」という用語は、本明細書では、KernighanおよびRitchie によるThe C programming language、185(Pr entice−Hall、1978年)に定義されているように使用する。ステ ートメントは、セミコロンとともにそのあとに続くことによって、式から構築す ることができる。本発明の一実施形態では、式ユニットはルーチンによって実現 される。マイクロフィッシュの付録Aの実施形態では、式ユニットは「exe_ evaluate_expr」ルーチンによつて実現される。式ユニットについ ては、論理流れ図2400(第24図)として詳細に示す。 式の処理は、null式判断2402(以下「判断2402」という)から始 まる。判断2402は、入力式がnull式と等しいかどうかを判定する。入力 式がnull式と等しいときは、いかなるアクションも不要であり、論理流れ図 2400による処理、したがって、式ユニットは終了する。そうではない場合、 入力式がnull式と等しくないときは、処理は現行コンテキスト保管アクショ ン2404(以下「アクション2404」という)に移行する。アクション24 04は、現行式2114の値を保管する。処理は、入力式を表す現行構文解析ツ リー構造304内のノードを指すポインタを現行式2114に格納する新コンテ キスト設定アクション2406(以下「アクション2406」という)に移行す る。古いコンテキスト情報が保管され、新しいコンテキストが設定された後、処 理は値判断2408(以下「判断2408」という)に移行する。 判断2408は、入力式が値であるかどうかを判定する。構文解析ツリーに関 する前述の説明に戻ると、値は構文解析ツリー内のリーフノードである。一実施 形態の値は、定数、変数、可変アドレス、またはルーチン・アドレスにすること ができる。入力式が値である場合、処理は値探索アクション2410(以下「ア クション2410」という)に移行し、そうではない場合、処理は演算判断24 22(以下「判断2422」という)に移行する。 アクション2410は、入力式の値を決定するものである。構文解析ツリー構 造304は各値ごとに固有の宣言ノードを有する。宣言ノードは、そのタイプや その内容など、値に関する情報を有する。アクション2410は、対応する宣言 ノードを指すポインタを入力式を表すノードから取り出す。また、宣言ノードを 指すポインタは、本明細書ではexternal_idともいう。これは、記号 テーブル内の記号を探索するために使用するexternal_idである。値 の内容の判定は、参照した宣言ノードによって行われる。参照した宣言ノードが 値の内容を含まない場合、その値は「未知」としてフラグが付けられる。処理は 、アクション2410から記号テーブル内検出判断2412(以下「判断241 2」という)に移行する。 判断2412は、値が記号テーブルに格納されているかどうかを判定するもの である。判断2412は、アクション2410で検出したexternal_i dと、記号テーブル項目内の構文解析ツリー・ポインタ1302とを比較する。 一致が検出された場合、その値は記号テーブル内にあり、処理はコンテキスト復 元アクション2428(以下「アクション2428」という)に移行する。その 値が記号テーブル内で検出されない場合、処理はメモリ作成アクション2414 (以下「アクション2414」という)に移行する。 アクション2414は、現行式用に(すなわち、値用に)モデル化メモリをレ イアウトするものである。アクション2414は、現行関数の戻り値用にモデル 化メモリをレイアウトする前述のアクション1206と同様のものである。まず 、アクション2414は、現行式を表すために必要なメモリの量を決定する。次 に、アクション2414は、メモリ作成ユニット1500を呼び出して、現行式 を表すために必要な量のメモリをモデル化する。次にアクション2414は、( 参照した宣言ノードで検出された)現行式の内容を新たにモデル化したメモリに 格納する。現行式が変数である場合、アクション2414は作成したばかりの現 行式位置を指すポインタをレイアウトする。アクション2414は、メモリ作成 ユニット1500を呼び出して、モデル化メモリのポインタ・サイズの区画を作 成する。アクション2414は、現行式の位置の符号化アドレスを現行式を指す ポインタ用の位置に格納する。処理はアクション2414から非ゼロ定数判断2 416(以下「判断2416」という)に移行する。 判断2416は、現行式が非ゼロ定数であるかどうかを判定するものである。 現行式が非ゼロ定数である場合、処理はアクション2428に移行し、そうでは ない場合、処理は記号テーブルへの追加アクション2418(以下「アクション 2418」という)に移行する。アクション2418は、現行式を表すための記 号テーブル項目1300を作成し、新たに作成した記号テーブル項目1300を 記号テーブルに格納する。ゼロは記号テーブル内に配置される唯一の定数である 。ゼロは、定数ゼロを使用するたびに何度もメモリをモデル化するのを回避する ために最適化として記号テーブル内に配置される。処理はアクション2418か らスタティックおよびグローバル変数のリスト保守アクション2420(以下「 アクション2420」という)に移行する。 アクション2420は、自動モデル化のために、グローバル変数のリストとス タティック変数のリストを保守するものである。変数タイプ情報は現行式に対応 する宣言ノードに記録されている。本発明の一実施形態では、変数は、グローバ ル、スタティック、またはローカルのいずれかのタイプにすることができる。現 行式がグローバル変数である場合、アクション2420はグローバル変数リスト を更新し、現行式がスタティック変数である場合、アクション2420はスタテ ィック変数リストを更新することになる。処理はアクション2420からアクシ ョン2428に移行する。 入力式が値ではない場合、演算判断2422(以下「判断2422」という) は、現行式が演算であるかどうかを判定することになる。現行式が演算である場 合、処理は演算処理アクション2424(以下「アクション2424」という) に移行する。アクション2424については以下に詳述する。現行式が演算では ない場合、処理は非評価ケース・アクション2426(以下「アクション242 6」という)に移行する。アクション2426は、現行式を識別できない場合に 適切なエラー・コードを発行する。現行式が分析エンジン308によってサポー トされていない場合、いかなるアクションも行われない。たとえば、第24図の 実施形態では、「new」と「delete」というC++式はサポートされて いない。処理はアクション2426からアクション2428に移行する。 アクション2428は、アクション2404で保管した値を現行式2114に 復元する。次に、論理流れ図2400による処理、したがって、式ユニットは終 了する。終了すると、式ユニットは開始サイト制御に制御を移転する。 演算を処理するアクション2424については、論理流れ図2500(第25 a図、第25b図)に示す。アクション2424は、どのタイプの演算を現行式 が表しているかを判定し、適切な処理を実行する。演算式は、演算子と1つまた は複数のオペランドから構成される。オペランドも式である。処理は、現行式が 関数呼出しを表すかどうかを判定する関数呼出し判断2502(以下「判断25 02」という)から始まる。現行式が関数呼出しである場合、処理は、呼び出し た関数をエミュレートする関数エミュレート・アクション2504(以下「アク ション2504」という)に移行し、そうではない場合、処理は短絡演算判断2 506(以下「判断2506」という)に移行する。 アクション2504は、その対応モデル118を実行することによって関数を エミュレートする。モデル118を実行すると、アクション2504は、対応す る関数がメモリ・モデルに対してどのような影響を及ぼすか(関数の外部効果) を判定することができる。実行すべき関数が欠落モデルによって表される場合、 アクション2504は、関数呼出しが正常に完了すると想定するだけである。付 録Fには、アクション2504を実現するために使用する一実施形態の擬似コー ドが提示されている。アクション2504が完了すると、論理流れ図2500に よる処理、したがって、アクション2424は終了する。 判断2506は、現行式が短絡演算であるかどうかをチェックする。短絡演算 子である論理積(&&)および論理和(||)はこのように呼ばれる。というの は、(おそらくすべてのオペランドが評価される前に)演算の真理値が決定され ると、ただちに演算の評価が停止するからである。現行式が短絡演算である場合 、処理はLHS式評価アクション2508(以下「アクション2508」という )に移行する。アクション2508は、プロセス制御を式ユニット(アクション 2402)に移転することにより、演算の左辺式(すなわち、左辺オペランド) を評価する。左辺式を評価した後、処理は、入力式の真理値が決定されたかどう かを判断する真理値決定判断2510(以下「判断2510」という)に移行す る。入力式が論理積であって左辺式が偽と評価されるか、または入力式が論理和 であって左辺式が真と評価された場合、入力式の真理値が決定され、論理流れ図 2500による処理、したがって、アクション2424は終了する。そうではな い場合、処理は、処理を式ユニット(アクション2402)に移行することによ り現行式の右辺(すなわち、右辺オペランド)を評価するRHS式評価アクショ ン2512(以下「アクション2512」という)に移行する。右辺式が評価さ れた後、論理流れ図2500による処理、したがって、アクション2424は終 了する。本発明の一実施形態では、アクション2424の処理はルーチンによっ て実行される。マイクロフィッシュの付録Aの実施形態では、「exe_eva luate_operation」ルーチンがアクション2424の処理を実行 する。 現行式が短絡演算ではない場合、処理は、現行式が3項演算子「?:」である かどうかを判定する疑問符演算判断2514(以下「判断2514」という)に 移行する。現行式が疑問符演算である場合、処理は、疑問符演算のテスト式を評 価するテスト式評価アクション2516(以下「アクション2516」という) に移行する。テスト式は、式ユニットを呼び出すことによって評価される。テス ト式が評価された後、処理は、テスト式の真理値を検査するテスト式判断251 8(以下「判断2518」という)に移行する。テスト式が真と評価された場合 、処理は、「真」というテスト式結果に対応する式を評価する「真」式評価アク シ ョン2520(以下「アクション2520」という)に移行する。そうではない 場合、処理は、真ではないテスト式結果に対応する式を評価する「偽」式評価ア クション2522(以下「アクション2522」という)に移行する。アクショ ン2520またはアクション2522の後、論理流れ図2500による処理、し たがって、アクション2424は終了する。 現行式が疑問符演算ではない場合、処理は、現行式がカンマ演算であるかどう かを判定するカンマ演算判断2524(以下「判断2524」という)に移行す る。現行式がカンマ演算である場合、処理はLHS評価(戻り値なし)アクショ ン2526(以下「アクション2526」という)に移行する。アクション25 26は、カンマ演算の左辺式を評価する。アクション2526は、左辺式に関し て返された値を必要としないので、空ポインタを式ユニットに渡す。左辺式の評 価後、処理は、カンマ演算の右辺式を評価するRHS評価(戻り値)アクション 2528(以下「アクション2528」という)に移行する。アクション252 8は戻り値を必要とするので、式の結果用の位置を指すポインタによって式ユニ ットを呼び出す。アクション2528の後、論理流れ図2500による処理、し たがって、アクション2424は終了する。 現行式がカンマ演算ではない場合、処理は、現行式がビット・フィールドまた はフィールド演算であるかどうかを判定するビット・フィールドおよびフィール ド演算判断2530(以下「判断2530」という)に移行する。現行式がビッ ト・フィールドまたはフィールド演算である場合、演算子が構造内のフィールド を参照することを意味し、処理はlhs式評価アクション2540(以下「アク ション2540」という)に移行する。 アクション2540は、式評価ユニットを呼び出すことにより、左辺オペラン ド(すなわち、lhs式)を評価する。左辺式は、ビット・フィールドまたはフ ィールド演算が参照する構造を指すポインタである。左辺式が評価された後、処 理制御は、値必要判断2452(以下「判断2542」という)に移転する。 判断2542は、ビット・フィールドまたはフィールド演算がその構造から値 を取り出すかどうかを判定する。演算が値を必要とする場合、処理はメモリ作成 アクション2544(以下「アクション2544」という)に移行し、そうでは ない場合、処理制御はrhs argとしてのオフセットの使用アクション25 46(以下「アクション2546」という)に移転する。アクション2544は 、演算が参照する値用のメモリを作成するものである。アクション2544は、 メモリ作成ユニット1500を呼び出して、構造参照の結果得られる値を保持す るために十分な大きさのモデル化メモリの区画を作成する。必要なモデル化メモ リが作成された後、処理はアクション2546に移行する。 アクション2546は、右辺オペランドに対応する引数情報ブロック2600 に、位置情報ではなくフィールド・オフセット情報を記入することにより、演算 ユニットを呼び出すための準備を行う。引数情報ブロック2600については以 下に詳述する。処理制御は演算評価アクション2538に移転する。 現行式がビット・フィールドまたはフィールド演算ではない場合、処理はLH S式評価アクション2532(以下「アクション2532」という)に移行する 。処理制御がアクション2532に到達した場合、現行式が特殊ケースの処理を 必要としないことが分かっており、「通常」演算処理が始まる。アクション25 32は、現行式の左辺を評価するものである。すべての演算は少なくとも1つの 左辺オペランドを有することになる。左辺式が評価された後、処理は、現行式が 2項演算であるかどうかを判定する2項演算判断2534(以下「判断2534 」という)に移行する。現行式が2項演算である場合、処理は、現行式の右辺を 評価するRHS式評価アクション2536(以下「アクション2536」という )に移行する。右辺式が評価された後または現行式が単項演算であると判定され た後、処理は演算評価アクション2538(以下「アクション2538」という )に移行する。 アクション2538は、評価すべき演算を表す演算子と、引数情報ブロック2 600(第26図)内にパッケージ化された演算子の各オペランドとを指定して 演算ユニットを呼び出すことにより、演算を評価するものである。前述のように 、現行式がビット・フィールドまたはフィールド演算である場合、右辺オペラン ドに対応する引数情報ブロック2600は実際には、モデル化メモリ位置とは対 照的に、構造内へのオフセットを表す。引数情報ブロック2600は、「位置ポ インタ」2602と、「サイズ」2604と、「ブール」2606と、「ポイン ト からサイズ」2608と、「ポイント間からサイズ」2610と、「ビット・フ ィールド・フラグ」2612と、「ビット・オフセット」2614と、「ビット ・サイズ」2616と、「印字式」2618というフィールドを含む。 フィールド「位置ポインタ」2602は、現在の引数ブロック2600に対応 する引数のモデル化メモリ用の符号化ポインタに設定される。各オペランドは、 別々の引数ブロック2600によって記述される。フィールド「サイズ」260 4は、フィールド「位置ポインタ」2602が指し示すメモリのサイズに設定さ れる。一部の演算はブール値を返し、返されたブール値はフィールド「ブール」 2606に格納される。フィールド「ポイントからサイズ」2608は、フィー ルド「位置ポインタ」2602が指し示すモデル化メモリ位置にある値が指し示 すもののサイズを保持する。フィールド「ポイント間からサイズ」2610は、 フィールド「位置ポインタ」2602が参照する値が指し示す位置にある値が指 し示すもののサイズを保持する。フラグ「ビット・フィールド・フラグ」261 2は、フィールド「位置ポインタ」2602がビット・フィールドであるときに オンになる。フィールド「ビット・オフセット」2614は、ビット・フィール ドの開始点を示す。フィールド「ビット・サイズ」2616は、ビット・フィー ルドのビット単位のサイズを保持する。フィールド「印字式」2618は、引数 情報ブロック2600に記述された値を含む式を印字可能なフォーマットで格納 する。 演算ユニットから戻った後、論理流れ図2500による処理、したがって、ア クション2424は終了する。終了すると、アクション2424はアクション2 428(第24図)に処理を移転する。 演算ユニットについては論理流れ図2700(第27図)に示す。一般に、演 算ユニットは組込みモデルを実行して、演算の結果を判定する。組込みモデルは モデル118と同様のものである。モデル制約と同様に、実行すべき演算につい て真になるべきものが真になっていることを確認するテストが行われる。次に、 モデル結果と同様に、演算を実行したあとで真であることが確認されるものを記 述する結果が生成される。演算ユニットはいつでも結果の位置を返す。返された 位置が空になることもありうる。演算ユニットの処理はテスト選択アクション2 702(以下「アクション2702」という)から始まる。本発明の一実施形態 では、演算ユニットの処理はルーチンによって行われる。マイクロフィッシュの 付録Aの実施形態では、「ins_evaluate_operation」と いうルーチンが演算ユニットの処理を実行する。 アクション2702は、評価中の演算について実行すべきテストを選択する。 実行するために使用可能なテストとしては、「comparable」、「va lid_pointer」、「initialized」、「non_zero 」がある。「comparable」テストは、2つのポインタが同じ格納値セ ットを指し示すかどうかを判定する。分析エンジン308はメモリを正確に複製 するわけではないので、2つのポインタは、モデル化メモリの同じ区画を指し示 す場合のみ、比較することができる。「valid_pointer」テストは 、その位置が有効なポインタ、すなわち、モデル化メモリのうちの現在使用中の 区画を指すポインタを含むかどうかを判定する。「initialized」テ ストは、所与の位置に値があるかどうかを判定する。「initialized 」テストは、その位置に対応する格納値ブロック1800を調べ、フラグ「初期 設定済みフラグ」1808をチェックして、その値が初期設定されているかどう かを判定する。「non_zero」テストは、ある位置が定数ゼロ以外の値を 含むかどうかを判定する。このテストは、ゼロに等しい除数に関するスクリーニ ングのために使用する。各演算ごとに、適用するテストと、そのテストが適用さ れるオペランドを付録Cに列挙する。 適切なテストが選択された後、処理はフィールド演算子判断2704(以下「 判断2704」という)に移行する。判断2704は、分析中の演算子がビット ・フィールドまたはフィールド演算子であるかどうかを判定する。分析中の演算 子がフィールド演算子である場合、処理はオフセット・メモリ作成アクション2 706(以下「アクション2706」という)に移行し、そうではない場合、処 理は単項演算子判断2718(以下「判断2718」という)に移行する。 アクション2706は、右辺引数に対応する引数情報ブロック2600に格納 されたフィールド構造内のオフセットを保持するためにモデル化メモリの区画を 作成する。このオフセットは、新たに作成したモデル化メモリ位置に格納される 。 処理はテスト実行アクション2708(以下「アクション2708」という)に 移行する。 アクション2708は、アクション2702で選択したテストを実行する。実 行すべき各テストごとに、アクション2708は、分析中の演算子と、テスト中 のオペランドに対応する引数情報ブロック2600と、テストが成功したかどう かを報告する条件変数とを指定してvim基本テスト・ユニットを呼び出す。v im基本テスト・ユニットは、指示したテストを実行するためにメモリ・モデル に問い合わせる。vim基本テスト・ユニットについては以下に詳述する。選択 したすべてのテストが実行された後、処理は加算演算子適用アクション2710 (以下「アクション2710」という)に移行する。 アクション2710は、分析中の演算子と、左辺オペランド(すなわち、構造 の位置)に対応する引数情報ブロック2600と、右辺オペランド(すなわち、 構造内へのオフセットの位置)に対応する引数情報ブロック2600と、結果位 置を指すポインタと、演算によって1が生成される場合に真理値を保持するため の条件変数とを指定してvim基本評価ユニットを呼び出すことにより、ポイン タ加算演算子を評価する。vim基本評価ユニットは、指示した演算の結果を達 成するようにメモリ・モデルを操作する。vim基本評価ユニットについては以 下に詳述する。ポインタ加算演算子の結果は、構造内の参照フィールドを指すポ インタである。加算演算を評価した後、処理はフィールド値必要判断2712( 以下「判断2712」という)に移行する。 判断2712は、フィールド演算子がフィールドの値を必要とするかどうかを 判定する。フィールド演算子は、構造内の参照フィールドの内容を返すときに値 を必要とする。フィールド値が必要である場合、処理はテスト実行アクション2 714(以下「アクション2714」という)に移行し、そうではない場合、論 理流れ図2700による処理、したがって、演算ユニットは終了する。 アクション2714は、アクション2708と同様に、アクション2702で 選択したテストを実行する。テストが実行された後、処理はデリファレンス演算 子適用アクション2716(以下「アクション2716」という)に移行する。 アクション2716は、分析中の演算子と、左辺オペランド(すなわち、構造内 の参照フィールドを指すポインタ)に対応する引数情報ブロック2600と、結 果位置を指すポインタと、演算によって1が生成される場合に真理値を保持する ための条件変数とを指定してvim基本評価ユニットを呼び出すことにより、ポ インタ・デリファレンス演算子を評価する。vim基本評価ユニットは、指示し た演算の結果を達成するようにメモリ・モデルを操作する。ポインタ・デリファ レンス演算は、構造内の参照フィールドの内容を返す。ポインタ・デリファレン ス演算子を評価した後、論理流れ図2700による処理、したがって、演算ユニ ットは終了する。 判断2718は、分析中の演算子が単項演算子であるかどうかを判定する。分 析中の演算子が単項演算子である場合、処理はテスト実行アクション2720( 以下「アクション2720」という)に移行し、そうではない場合、処理は2項 演算子判断2724(以下「判断2724」という)に至る。アクション272 0は、アクション2708と同様に、アクション2702で選択したテストを実 行する。選択したすべてのテストが実行された後、処理は単項演算子適用アクシ ョン2722(以下「アクション2722」という)に移行する。アクション2 722は、分析中の演算子と、左辺オペランドに対応する引数情報ブロック26 00と、結果位置を指すポインタと、演算によって1が生成される場合に真理値 を保持するための条件変数とを指定してvim基本評価ユニットを呼び出すこと により、単項演算子を評価する。単項演算を評価した後、処理は未決定関係判断 2730(以下「判断2730」という)に移行する。 演算子が単項演算子ではない場合、処理は、演算子が2項演算子であるかどう かを判定する判断2724に移行する。演算子が2項演算子である場合、処理は テスト実行アクション2726(以下「アクション2726」という)に移行し 、そうではない場合、処理は判断2730に至る。アクション2726は、アク ション2720と同様に、アクション2702で選択したテストを実行する。テ ストが実行された後、処理は2項演算子適用アクション2728(以下「アクシ ョン2728」という)に移行する。 アクション2728は、分析中の演算子と、左辺オペランドに対応する引数情 報ブロック2600と、右辺オペランドに対応する引数情報ブロック2600と 、 結果位置を指すポインタと、演算によって1が生成される場合に真理値を保持す るための条件変数とを指定してvim基本評価ユニットを呼び出すことにより、 2項演算を評価する。2項演算を評価した後、処理は判断2730に移行する。 判断2730は、評価した演算が、「不明」値であると評価された関係演算で あったかどうかを確認するためのチェックを行う。モデル化メモリが実メモリの 正確な複製ではない場合の結果の1つは、モデル化メモリが3値真理論理を使用 することである。モデル化メモリ内の真理値は、「真」、「偽」、「不明」のい ずれかになる。「不明」条件は、真のメモリに関する知識が不完全であることに よる。演算の結果、「不明」条件が発生した場合、モデル化メモリの3値真理論 理を2値真理論理に変換しなければならない。判断2730が真になる場合、処 理は条件選択アクション2732(以下「アクション2732」という)に移行 する。アクション2732は、CPH条件選択ユニットを呼び出すことによって 条件を選択する。CPH条件選択ユニットについては以下に詳述する。選択が行 われると、アクション2732は、位置に対応する格納値ブロック1800でフ ラグ「想定値フラグ」1810をオン(真)に設定する。処理は情報想定アクシ ョン2734(以下「アクション2734」という)に移行する。 アクション2732で選択が行われた場合、その選択の含意を示すためにモデ ル化メモリを必ず更新しなければならない。式の結果を選択することは、その式 で使用するオペランドに関する派生効果を有する。たとえば、以下のコード・サ ンプルを検討する。 変数iに関する情報が一切不明である場合、ゼロと同等であるiを評価すると 、「不明」値が返されることになる。変数iと定数ゼロとを比較するための情報 がまったくないので、vim基本評価ユニットによって「不明」という値が返さ れる。iがゼロと同等であると想定するという選択が行われた場合、コード・パ ス に沿って今後のステートメントで変数iを一貫して使用するためには、iがゼロ と等しいことを反映するようにメモリを更新しなければならない。アクション2 734は、モデル化メモリを適切に更新するためにvim想定ユニットを呼び出 す。vim想定ユニットについては以下に詳述する。vim想定ユニットから戻 ると、論理流れ図2700による処理、したがって、演算ユニットは終了する。 終了すると、処理制御は開始サイト制御に返される。 選択点を解決するための条件の選択は、CPH条件選択ユニットによって行わ れる。CPH条件選択ユニットについては論理流れ図3300(第33図)に示 す。処理は、選択実行判断3302(以下「判断3302」という)から始まる 。判断3302は、実行すべき選択がアクション1108で構築したパスの一部 に対応するかどうかを判定する。実行すべき選択がアクション1108で決定し たパス上の選択点によってすでに表されている場合、処理は選択アクション33 04(以下「アクション3304」という)に移行する。アクション3304は アクション1108で構築したパスが指示する選択を行い、論理流れ図3300 による処理、したがって、CPH条件選択ユニットは終了する。 判断3302が偽を返す場合、いかなる選択も前もって決定されていないので 、処理はランダム選択アクション3306(以下「アクション3306」という )に移行する。解決するためにCPH条件選択ユニットが呼び出された未解決の 選択点が選択点ノードに対応することに留意されたい。また、未解決の選択点に 関して可能な解決は、その選択点ノードから出る選択エッジに対応する。アクシ ョン3306は、未調査の選択エッジ間でランダム選択を行うことによって、結 果(選択)を抜き取る。選択が行われた後、処理はCPHツリー更新アクション 3308(以下「アクション3308」という)に移行する。 アクション3308は、選択点ノードで選択したエッジ選択にマークを付ける ものである。この選択点ノードがすでにCPHツリー上にあるものではない場合 、アクション3308はこれをツリーに挿入する。CPHツリーが更新された後 、論理流れ図3300による処理、したがって、CPH条件選択ユニットは終了 する。終了すると、処理制御は開始サイト制御に戻る。本発明の一実施形態では 、CPH条件選択ユニットはルーチンによって行われる。マイクロフィッシュの 付 録Aの実施形態では、「cph_choose_condition」というル ーチンがCPH条件選択ユニットの処理を実行する。 if−elseユニットは、if−elseステートメントを処理するもので ある。if−elseユニットについては論理流れ図2800(第28図)とし て詳細に示す。if−elseユニットの処理は、テスト式評価アクション28 02(以下「アクション2802」という)から始まる。アクション2802は if−elseステートメントのテスト式を評価する。前述のように、式ユニッ ト(アクション2402)を呼び出すことにより、式を評価する。テスト式が評 価された後、処理は、テスト式の結果を検査するテスト式結果判断2804(以 下「判断2804」という)に移行する。テスト式が真であると評価された場合 、処理は、if式を評価する「if」式評価アクション2806(以下「アクシ ョン2806」という)に移行する。そうではない場合、処理は、偽式を評価す る「偽」式評価アクション2808(以下「アクション2808」という)に移 行する。アクション2806または2808後に、論理流れ図2800の処理、 したがって、if−elseユニットは終了する。終了すると、if−else ユニットは開始サイト制御に制御を移転する。 whileループ、do whileループ、forの各ユニットは、いずれ もループ実行ユニットを呼び出して、それぞれに対応するステートメントの処理 を実行する。3つのユニット間の唯一の違いは、forユニットはループ実行ユ ニットを呼び出す前に初期設定ステートメントを評価することである。forユ ニットは、処理制御をアクション1208に移転することにより、初期設定ステ ートメントを評価する。ループ実行ユニットについては論理流れ図2900(第 29図)として詳細に示す。本発明の一実施形態では、ループ実行ユニットはル ーチンによって行われる。マイクロフィッシュの付録Aの実施形態では、「ex e_loop」というルーチンがループ実行ユニットの処理を実行する。 ループ実行ユニットは、ループ・ステートメントを指し示すために実行コンテ キスト・ブロック2100のフィールド「現行ステートメント」2110を更新 するステートメント・コンテキスト設定アクション2902から処理を始める。 処理は、現行ステートメントがforまたはwhileループであるかどうかを 判定するforまたはwhileループ判断2904に移行する。現行ステート メントがforまたはwhileループである場合、処理は、条件偽またはルー プ終了判断2906(以下「判断2906」という)に移行する。そうではない 場合、処理はループ未終了判断2910(以下「判断2910」という)に至る 。 判断2906は、式評価ユニットを呼び出すことにより、テスト条件式を評価 する。判断2906は、条件が偽であるかまたはループが終了したかどうかを判 定する。基本的にこれは、ループの本体より前にテストが評価されることを意味 する。ループ条件が偽であるかまたはループが終了した場合、処理は、ループ終 了フラグをオンにして、ループが完了したことを記憶するループ完了記憶アクシ ョン2908に移行する。そうではない場合、処理は判断2910に移行する。 判断2910は、ループ終了フラグに問い合わせて、ループが完了したかどう かを判定する。ループが完了していない場合、処理はアクション2912に移行 する。そうではない場合、処理はdo whileループ判断2918(以下「 判断2918」という)に移行する。アクション2912は、ループ本体内のす べてのステートメントを実行する。各ステートメントは、アクション1208を 呼び出すことによって実行される。ループ本体内の各ステートメントが実行され ると、処理は、現行ステートメントがforループであるかどうかを判定するf orループ判断2914に移行する。現行ステートメントがforループである 場合、処理は、式ユニットを呼び出すことにより増分式を評価するアクション2 916に移行する。増分式が評価された後、または現行ステートメントがfor ループではない場合、処理は判断2918に移行する。 判断2918は、現行ループがdo whileループであるかどうかを判定 する。現行ループがdo whileループである場合、処理は、式ユニットを 呼び出すことによりループ・テスト式を評価するテスト式評価アクション292 0に移行する。do whileループの場合、テストはループの本体のあとで 評価される。最終テスト式が評価された後、または現行ループがdo whil eループではない場合、論理流れ図2900による処理、したがって、ループ実 行ユニットは終了する。ループ実行ユニットはループ本体の1回の実行だけをシ ミュレートする。終了すると、ループ実行ユニットは開始サイト制御に制御を返 す。 switchユニットはswitchステートメントを処理する。switc hユニットについては論理流れ図3000(第30a図、第30b図)に示す。 switchユニットの処理は、switchテスト式を評価するテスト式評価 アクション3002から始まる。switchテスト式は、式ユニットへの呼出 しにより評価される。制御は、他のcaseラベルを検査しなければならないか どうか、ならびにチェックすべきcaseラベルが残っているかどうかを判定す るチェックすべきcaseラベル判断3004に移転する。依然としてcase ラベルを検査する必要性があり、依然としてチェックすべきものが複数ある場合 、処理は宣言ノード検索アクション3006(以下「アクション3006」とい う)に移行し、そうではない場合、処理はcase選択判断3028(以下「判 断3028」という)に移行する。 アクション3006は、処理すべき次のcaseラベル用の宣言ノードを検索 する。処理は、アクション3006から、caseラベルが記号テーブル内にあ るかどうかを判定する記号テーブル内ラベル判断3008に移行する。case ラベルが記号テーブル内にある場合、処理はラベル集合構築アクション3012 (以下「アクション3012」という)に移行する。そうではない場合、処理は 、そのcaseラベルを記号テーブルに追加する記号テーブルへのラベル追加ア クション3010(以下「アクション3010」という)に移行する。 アクション3010は、そのcaseラベルを表すための記号テーブル項目1 300を作成する。新たに作成した記号テーブル項目1300は記号テーブルに 格納される。処理は、アクション3010からアクション3012に移行する。 アクション3012は、そのcaseラベルをラベル集合に格納し、検討したす べてのcaseラベルの集合を構築する。処理は、アクション3012から、c ase内の第1のステートメントを指すポインタの集合を構築するステートメン ト集合構築アクション3014に移行する。検討した各caseラベルごとに1 つずつのポインタが存在する。ステートメント集合が更新された後、処理は式C aseラベル同等判断3016(以下「判断3016」という)に移行する。 判断3016は、swichテスト式の結果とcaseラベルとを突き合わせ る。switchテスト式の結果がcaseラベルと等しい場合、処理は現在の case選択アクション3018(以下「アクション3018」という)に移行 する。アクション3018は、現在のcaseラベルに対応するステートメント を実行すべきであることを示す。処理は、チェックすべきcaseラベルがこれ 以上ないことを示すためにフラグを設定する調査停止記憶アクション3020( 以下「アクション3020」という)に移行する。処理はアクション3020か ら判断3004に移行する。 switchテスト式の結果が現在のcaseラベルと等しくなかった場合、 処理は、突合せが偽を返したかどうかを判定する突合せ結果偽判断3022に移 行する。突合せが偽を返した場合、処理は、偽の突合せの数をカウントする偽c aseカウント・アクション3024(以下「アクション3024」という)に 移行する。switchテスト式の結果とcaseラベルが等しいことを判定で きなかった場合、処理は、「不明」case集合構築アクション3026(以下 「アクション3026」という)に移行する。アクション3026は、判断30 16が結果を判定できなかったすべてのケースに対応するcaseラベルの集合 に現在のcaseラベルを追加する。処理は、アクション3024およびアクシ ョン3026から判断3004に移行する。 case選択判断3028は、caseが選択されたかどうかを判定する。c aseが選択された場合、処理は、次のbreakステートメントに到達するま で選択したcase内のステートメントを実行する次のbreakまでステート メントを実行するアクション3030に移行する。アクション1208を呼び出 すことにより、ステートメントを実行する。case内のすべてのステートメン トが実行されると、論理流れ図3000による処理、したがって、switch ユニットは終了する。 caseがまだ選択されていない場合、処理は、偽caseの数がswitc hステートメント内のcaseの数に等しいかどうかを判定する偽カウントca se数同等判断3032に移行する。偽caseの数がcaseの数に等しい場 合、いずれのcaseラベルもswitchテスト式結果と一致しないことを意 味し、処理はデフォルトcase内のステートメントを実行するデフォルトca se実行アクション3034(以下「アクション3034」という)に移行する 。アクション1208を呼び出すことにより、ステートメントを実行する。アク ション3034が完了すると、論理流れ図3000による処理、したがって、s witchユニットは終了する。偽caseのカウントがswitchステート メント内のcaseの数に等しくない場合、処理は不明case判断3036( 以下「判断3036」という)に至る。 判断3036は、「不明」caseの集合内にラベルがあるかどうかを判定す る。「不明」case内にラベルがある場合、処理は不明caseとデフォルト caseの選択アクション3038(以下「アクション3038」という)に移 行する。そうではない場合、switchユニット内の処理は終了する。 アクション3038は、「不明」caseとデフォルトcaseとから実行す べきcaseを選択する。アクション3038は、CPH条件選択ユニット(第 33図)を呼び出すことにより、どのcaseを選択するかを判定する。CPH 条件選択ユニットについては以下に詳述する。処理は、アクション3038から 、アクション3038で行った選択に基づいて情報を想定する情報想定アクショ ン3040(以下「アクション3040」という)に移行する。アクション30 40は、演算ユニットのアクション2734(第27図)と同様のものである。 アクション3040は、vim想定ユニットを呼び出して、アクション3038 で行った選択に基づいてモデル化メモリを更新する。 処理は、アクション3040から、次のbreakステートメントが検出され るまで選択したcase内のステートメントを実行するbreakまでのステー トメント実行アクション3042に移行する。ステートメントは、アクション1 208への呼出しにより実行される。ステートメントが実行された後、論理流れ 図3000による処理、したがって、switchユニットは終了する。終了す ると、switchユニットは開始サイト制御に処理制御を返す。 変数初期設定ユニットは、変数初期設定ステートメントを処理するものである 。変数初期設定ユニットについては論理流れ図3100(第31図)として示す 。変数初期設定ユニットの処理は、初期設定式を評価する初期設定評価アクショ ン3102から始まる。初期設定式は、式ユニットを呼び出すことによって評価 さ れる。初期設定式が評価された後、処理は、代入された値を受け取る変数用の宣 言ノードを突き止める、変数宣言ノード検出アクション3104(以下「アクシ ョン3104」という)に移行する。処理は、アクション3104から、演算ユ ニットを呼び出すことにより代入を評価する代入評価アクション3106に移行 する。演算ユニットは代入演算子を指定して呼び出される。代入が評価された後 、論理流れ図3100による処理、したがって、変数初期設定ユニットは終了す る。 returnユニットはreturnステートメントを処理するものである。 returnユニットについては論理流れ図3200(第32図)として示す。 returnユニットは、returnステートメントが式を有するかどうかを 判定するreturn式判断3202から処理を始める。returnステート メントがreturn式を有していない場合、処理は式評価アクション3204 (以下「アクション3204」という)に移行する。そうではない場合、ret urnユニットは終了する。 アクション3204は、式ユニットを呼び出すことにより式を評価する。re turn式が評価された後、処理は、記号テーブル内の戻り値を探索する記号テ ーブル内の戻り値探索アクション3206(以下「アクション3206」という )に移行する。アクション3206は、戻り値に対応する記号テーブル項目13 00からフィールド「記号位置」1306を検索する。処理は、return記 号へのreturn式の代入を評価する代入評価アクション3208(以下「ア クション3208」という)に移行する。アクション3208は、変数初期設定 ユニットのアクション3106(第31図)と同様のものである。代入は、代入 演算子を指定して演算ユニットを呼び出すことによって評価される。代入が評価 された後、論理流れ図3200による処理、したがって、returnユニット は終了する。 ラベル・ユニットは、ステートメントを導入するラベルを処理するものである 。ラベルとは、あとにコロン(「:」)が続く識別子である。「識別子」という 用語は、Brian W.KernighanおよびDennis M.Rit chieによるThe C Programming Language、17 9(Prentice−Hall、1978年)に定義されているように、ここ で 使用する。一実施形態のラベル・ユニットは、フロースルー処理を実行するだけ であり、ラベル・ユニットは開始サイト制御に処理制御を移転する。 gotoユニットは、gotoステートメント内に指示されたステートメント (goto「ターゲット」ステートメント)に移行するように現行パスの制御の 流れを方向付けるものである。gotoユニットは、前述のようにgotoパラ メータを真に設定する。gotoユニットは、gotoターゲット・ステートメ ントを表す現行構文解析ツリー構造304内のノードを指すポインタを検索し、 そのポインタを処理制御とともにアクション1208に転送する。制御がgot oユニットに戻ると、処理は終了し、gotoユニットは開始サイト制御に制御 を移転する。本発明の一実施形態では、gotoユニットはルーチンによって実 現される。マイクロフィッシュの付録Aの実施形態では、gotoユニット23 は、「exe_goto_statement」というルーチンによって実現さ れる。仮想イメージ・オブジェクト708 仮想イメージ・オブジェクト708は、メモリ・モデルを構築、更新、および 検査する。仮想イメージ・オブジェクト708は、4つのユニット、すなわちメ モリ作成ユニット1500(前述)、活力(vim)プリミティブ試験ユニット 、活力プリミティブ評価ユニット、および活力想定ユニットから構成される。仮 想イメージ・オブジェクト708のこれら4つのユニットは、メモリ・モデルに ついての試験および操作を実行し、こうした試験および操作が活力プリミティブ と呼ばれる。活力プリミティブは、メモリ・モデルの記憶された値に対して直接 実行されるわけではなく、フェッチ値と呼ばれる記憶された値の検索したコピー に対して実行される。フェッチ値の使用は、値を操作する前にレジスタ中に置く コンピュータ・プログラムと類似している。活力プリミティブのある特定の使用 についての情報は述語に集められる。述語は、後に自動モデル化に使用するため にログすることができる。活力プリミティブ、フェッチ値、述語、プリミティブ 評価ユニット、および想定ユニットについて、以下でさらに詳細に考察する。 本発明の1実施形態では、18個の別個の活力プリミティブがある。活力プリ ミティブは、true_as_condition、false_as_con dition、initialized、valid_or_null_poi nter、valid_pointer、invalid_pointer、v alid_offset、comparable、incomparable、 freeable、freed_memory、new_memory、non _zero、lost、int_to_float、float_to_int 、state_eq、およびstate_neである。活力プリミテイブ「tr ue_as_condition」は、指定された位置が「真」であると評価さ れるかどうかを示すよう活力ユニットに命令するものである。活力プリミティブ 「false_as_condition」は、指定された位置が「真」以外の 値であると評価されるかどうかを示すよう活力ユニットに命令するものである。 活力プリミティブ「initialized」は、指定された位置が初期値を含 むかどうかを示すよう活力ユニットに命令するものである。 活力プリミティブ「valid_or_null−pointer」は、指定 された位置が、モデル化されたメモリの現在使用されている部分を指すポインタ である有効ポインタ、または現在どこも指していない位置を指定するヌル・ポイ ンタのいずれかを含むかどうかを示すよう活力ユニットに命令するものである。 活力プリミティブ「valid_pointer」は、指定された位置が、有効 ポインタ、すなわちモデル化されたメモリの現在使用されている部分を指すポイ ンタを含むかどうかを示すよう活力ユニットに命令するものである。活力プリミ ティブ「invalid_pointer」は、指定された位置が、モデル化さ れたメモリの現在使用されている部分を指すポインタを含まないかどうかを示す よう活力ユニットに命令するものである。 活力プリミティブ「valid_offset」は、指定された位置が、識別 された構造またはアレイ中への有効オフセットを含むかどうかを示すよう活力ユ ニットに命令するものである。活力プリミティブ「comparable」は、 2つの位置が同じチャンク1700を指すかどうかを示すよう活力ユニットに命 令するものである。活力プリミティブ「incomparable」は、2つの 位置が同じチャンク1700を指さないかどうかを示すよう活力ユニットに命令 するものである。活力プリミティブ「freeable」は、指定された位置が 解放可能なメモリを含むかどうかを示すよう活力ユニットに命令するものである 。活力プリミティブ「freed_memory」は、指定された位置を解放す るよう活力ユニットに命令するものである。活力プリミティブ「new_mem ory」は、メモリ・モデル中で新しい位置を割り当てるよう活力ユニットに命 令するものである。 活力プリミティブ「non_zero」は、指定された位置がゼロ定数以外の 値を含むかどうかを示すよう活力ユニットに命令するものである。活力プリミテ ィブ「lost」は、指定された位置が失われたメモリとしてマークされている かどうかを示すよう活力ユニットに命令するものである。活力プリミティブ「i nt_to_float」は、指定された位置の値を、整数表示から浮動小数点 表示に変換するよう活力ユニットに命令するものである。活力プリミティブ「f loat_to_int」は、指定された位置の値を、浮動小数点表示から整数 表示に変換するよう活力ユニットに命令するものである。活力プリミティブ「s tate_eq」は、指定された位置が、所与の状態と等しい状態にある資源を 表すかどうかを示すよう活力ユニットに命令するものである。最後に、活力プリ ミティブ「state_ne」は、指定された位置が、所与の状態と等しくない 状態にある資源を表すかどうかを示すよう活力ユニットに命令するものである。 活力プリミティブを評価する際にはしばしば、ある位置によってモデル化され たメモリのタイプの特定の特徴を理解することが必要となる。様々なタイプのモ デル化されたメモリについては、「メモリ作成ユニット1500」の見出しで既 に考察した。様々なタイプのモデル化されたメモリのそれぞれについて、対応す るメモリ情報ブロック3400(第34図)が存在する。メモリ情報ブロック3 400は、対応するメモリ・タイプの特定の特徴を識別する。メモリ情報ブロッ ク3400は下記のフィールドを含む。「メモリ・タイプ」3402、「印刷可 能メモリ名」3404、「定数フラグ」3406、「デリファレンス・タイプ」 3408、「開始時初期化フラグ」3410、「開始時有効フラグ」3412、 「ロスト・フラグ」3414、「自由許可フラグ」3416、「フリー・エラー ・コード」3418、「資源フラグ」3420、「ログ試験フラグ」3422、 「初期化」3424、「有効」3426、および「ヌル」3428。 フィールド「メモリ・タイプ」3402は、瞬間メモリ・タイプ情報ブロック 3400(瞬間メモリ・タイプとも呼ばれる)が表すメモリのタイプを識別する 。フィールド「印刷可能メモリ名」3404は、印刷可能なフォーマットの瞬間 メモリ・タイプの名前を指定する。フィールド「印刷可能メモリ名」3404は 、エラー・メッセージの生成に使用される。フラグ「定数フラグ」3406は、 瞬間メモリ・タイプが定数であるときにオンにセットされる。メモリ・タイプが 定数である場合には、そのタイプの位置は割当てを受けることができない。フィ ールド「デリファレンス・タイプ」3408は、適用可能であるときに、瞬間メ モリ・タイプが指すメモリ・タイプを示す。 フラグ「開始時初期化フラグ」3410は瞬間メモリ・タイプが初期化された ときにオンにセットされる。フラグ「開始時有効フラグ」3412は、瞬間メモ リ・タイプが有効ポインタであるときにオンにセットされる。フラグ「ロスト・ フラグ」3414は、瞬間メモリ・タイプが失われる可能性があるときにオンに セットされる。フラグ「自由許可フラグ」3416は、瞬間メモリ・タイプを解 放することができるときにオンにセットされる。フィールド「自由エラー・コー ド」3418は、適用可能である場合には、瞬間メモリ・タイプを解放する際に 生成されるエラー・コードを指定する。 フラグ「資源フラグ」3420は、瞬間メモリ・タイプが資源を参照するとき にオンにセットされる。フラグ「ログ試験フラグ」3422は、瞬間メモリ・タ イプの位置に対して行われる試験をログしなければならないときにオンにセット される。フィールド「初期化」3424は、ある位置を、初期化されたものであ るとして瞬間メモリ・タイプから識別することができるかどうかを指定する。フ ィールド「有効」3426は、ある位置を、有効であるとして瞬間メモリ・タイ プから識別することができるかどうかを指定する。フィールド「ヌル」3428 は、ある位置を、ヌルであるものとして瞬間メモリ・タイプから識別することが できるかどうかを指定する。 フェッチ値は、記憶された値に含まれる値の作業用コピーとして使用される。 フェッチ値をフェッチ値ブロック3500で説明する。フェッチ値ブロック35 00は、第35図に示してある。フェッチ値ブロック3500は下記のフィール ドを含む。「バイト数」3502、「正確な値が既知のフラグ」3504、「正 確値ポインタ」3506、「述語集合ポインタ」3508、「値の形式」351 0、「実数の値」3512、「無符号整数の値」3514、「資源タイプ」35 16、「資源状態」3518、「初期化フラグ」3520、「有効ポインタ」3 522、「非ゼロ・フラグ」3524、「新規述語フラグ」3526、「変更フ ラグ」3528、「想定フラグ」3530、「svsポインタ」3532、「s vsオフセット」3534、「位置からのフラグ」3536、「位置」3538 、「チャンク起点」3540、「メモリ・タイプ」3542、「svサブセット ・ポインタ」3544、「式ポインタ」3546、および「デリファレンス・フ ラグ」3548。 フィールド「バイト数」3502は、記述される値が表すバイト数を指定する 。フラグ「正確な値が既知のフラグ」3504は、記述される値が完全に既知で あるときにオンにセットされる。フィールド「正確値ポインタ」は、適用可能で あるときに、正確な値を含むバイト・アレイを指す。指されるバイト・アレイの サイズは、フィールド「バイト数」3502に含まれる数と等しい。フィールド 「述語集合ポインタ」3508は、瞬間フェッチ値に適用される全ての述語の集 合を指す。フィールド「値の形式」3510は、記述される値の形式のタイプを 示す。フィールド「実数の値」3512は、フィールド「値の形式」3510が 実数値を示すときに、記述される値を実数形式で指定する。フィールド「無符号 整数の値」3514は、フィールド「値の形式」3510が実数値以外を示すと きに、記述される値を整数形式で指定する。 フィールド「資源タイプ」3516は、適用可能である場合には、記述される 値に関連した資源のタイプを示す。フィールド「資源状態」3518は、適用可 能である場合には、記述される値に関連した資源の状態を示す。フラグ「初期化 フラグ」3520は、記述される値が初期化されたときにオンにセットされる。 フィールド「有効ポインタ」3522は、フェッチ値が有効ポインタであるかど うかを示す。フラグ「非ゼロ・フラグ」3524は、真であるときには、フェッ チ値がゼロ定数でないことを知らせる。フラグ「新規述語フラグ」3526は、 「述語集合ポインタ」3508が指す述語の集合に、任意の述語が追加されてい るかどうかを示す。フラグ「変更フラグ」3528は、フェッチ値が任意の活力 プリミティブによって変更されているかどうかを知らせる。フェッチ値は、活力 プリミティブによって変更されているときには、メモリ・モデルに戻して記憶し なければならない。フラグ「想定フラグ」3530は、フェッチ値が活力プリミ ティブによって想定されているかどうかを示す。フェッチ値は、活力プリミティ ブによって想定されているときには、対応する記憶された値に上書きしなければ ならない。 フィールド「svsポインタ」3532は、フェッチ値の発生元となる、記憶 された値のセットを指す。フィールド「svsオフセット」3534は、フィー ルド「svsポインタ」3532が指す記憶された値のセット中のフェッチ値の 開始オフセットを含む。フラグ「位置からのフラグ」は、フェッチ値の内容がモ デル化されたメモリの位置から来たものであるかどうかを示す。フィールド「位 置」3538は、フェッチ値の発生元となるモデル化されたメモリ中の位置を指 す。フィールド「チャンク起点」3540は、フィールド「svsポインタ」3 532が指す記憶された値のセットを指すチャンク1700によって指される起 点コンテキスト構造1600を指す。フィールド「メモリ・タイプ」3542は 、どのような種類のメモリがフェッチ値によって使用されるかを指定する。 フィールド「svサブセット・ポインタ」3544は、フィールド「svsポ インタ」3532が指す記憶された値のセットに含まれる記憶された値のサブセ ットを含む集合を指す。フィールド「式ポインタ」3546は、フェッチ値を含 む式を表す現在の構文解析ツリー構造304中のノードを指すポインタを含む。 フラグ「デリファレンス・フラグ」3548は、フェッチ値が実際に、フィール ド「式ポインタ」3546が示す式中の値のデリファレンスであるかどうかを示 す。 述語は、左側オペランドおよび場合によっては右側オペランドに適用される活 カプリミティブの特定の適用についての情報を記憶している。述語は、述語ブロ ック3600で表される。述語ブロック3600は下記のフィールドを含む。「 プリミティブ」3602、「無符号オペランド・フラグ」3604、「svs ポインタ」3606、「svオフセット」3608、「svカウント」3610 、「引数」3612、「引数オフセット」3614、「引数長さ」3616、「 資源タイプ」3618、および「資源状態」3620。 フィールド「プリミティブ」3602は、この述語が記録する活力プリミティ ブのタイプを指定する。フラグ「無符号オペランド・フラグ」3604は、この 述語が表す活力プリミティブ(表された活力プリミティブと呼ぶ)が無符号オペ ランドに適用されたかどうかを示す。フィールド「svsポインタ」3606は 、表された活力プリミティブが適用される値に対応する記憶された値のセットを 指す。フィールド「svオフセット」3608は、表された活力プリミティブが 適用される、「svsポインタ」3606が指す記憶された値のセットの中の、 第1の記憶された値のオフセットを指定する。フィールド「svカウント」36 08は、表された活力プリミティブが適用される記憶された値の数を指定する。 フィールド「引数」3612は、適用可能である場合には、述語の右側オペラン ドを指す。フィールド「引数オフセット」3614は、右側オペランドについて の第1の記憶された値を指す。フィールド「引数長さ」3612は、右側オペラ ンドを表すために使用される記憶された値の数を指定する。フィールド「資源タ イプ」3618は、活力プリミティブが資源プリミティブであるときに、資源の タイプを示す。フィールド「資源状態」3620は、活力プリミティブが資源プ リミティブであるときに、資源状態を示す。 活力プリミティブ試験ユニットは、メモリ・モデルの内容に対して試験を実行 する。付録Dは、活力プリミティブ試験ユニットを実施するために使用される1 実施形態の疑似コードを含む。活力プリミティブ評価ユニットは、メモリ・モデ ルを更新して、指定されたオペレーションを評価した結果を反映する。付録Dは 、活力プリミティブ評価ユニットを実施するために使用される1実施形態の疑似 コードを含む。活力想定ユニットは、メモリ・モデルを更新して、未解決な選択 点をCPH選択条件ユニットで解決した結果を反映する。付録Dは、活力想定ユ ニットを実施するために使用される1実施形態の疑似コードを含む。障害インジケータ・オブジェクト712 障害インジケータ・オブジェクト712は、障害インジケータ106を生成し て、分析器202が検出したプログラミング・エラーを報告する。障害インジケ ータ・オブジェクト712の処理は、エラー生成ユニットによって実行される。 エラー生成ユニットは、論理流れ図3700(第37図)として詳細に示してあ る。第37図の実施形態では、障害インジケータ106はエラー・メッセージの 形になっている。 エラー生成ユニット中の処理は、検出されたプログラミング・エラーがメモリ または資源の漏れであるかどうかを決定する漏れエラー判断3702(以下「判 断3702」とする)から開始する。エラーが漏れである場合には、処理制御は 、パス終了タイプを決定する処置3704(以下「処置3704」とする)に移 ることになり、そうでない場合には、処理制御は、main関数中のローカル・ エラーの判断3710(以下「判断3710」とする)に移る。 処置3704は、漏れを生じるパスがどのようにして終了したかを決定する。 パスは3通りの方法、すなわち出口、ロングジャンプ、またはリターンの1つで 終了することができる。パス終了のタイプが発見された後で、処理制御は、抑制 終了タイプの判断3706(以下「判断3706」とする)に移る。判断370 6は、構成オプションが、漏れを生じたパスの方法で、終了したパスの漏れエラ ーを抑制するようにセットされているかどうかを決定する。このような構成オプ ションがセットされている場合には、処理制御は、論理流れ図3700に従って 処理を終了するリターン3708に移る。したがって、エラー生成ユニットは、 エラー・メッセージを生み出すことなく終了する。漏れエラーの報告を行う構成 オプションは、「leaks_on_exit」、「leaks_on_lon gjump」、および「leaks_on_return」である。構成オプシ ョンについてのこれ以上の情報は、付録Bに与える。構成オプションが漏れエラ ー・メッセージを抑制するようにセットされていない場合には、処理は判断37 10に移る。 判断3710は、現在の関数名が「main」であるかどうか、またこの関数 が、「main」関数にローカルなメモリにポインタを戻しているかどうかを決 定する。このような(判断3710が真であると決定した)場合には、処理は、 論理流れ図3700に従って処理を終了するリターン3712に移る。したがっ て、エラー生成ユニットは、エラー・メッセージを生み出すことなく終了する。 判断3710が偽であると決定したときには、処理制御は、コンテキスト情報を 得る処置3714(以下「処置3714」とする)に移る。 処置3714は、生成されたエラー・メッセージに記入するために使用するこ とになるコンテキスト情報を収集する。コンテキスト情報により、ユーザは、コ ード中のプログラミング・エラーを突き止めることができる。処置3714は、 障害のある関数を含むファイルのファイル名、および関数内のエラーが検出され た行番号を決定する。処置3714は、エラーのある関数の名前、エラーが発生 したパスの番号、およびエラーを含む式も収集する。関数のエミュレーション中 にエラーが発生した場合には、処置3714は、エミュレートした関数の名前と 、エミュレートした関数を含むファイルの名前と、エミュレートされた関数中の エラーが検出された行に対応するそのファイル中の行番号を収集する。処置37 14でのデータ収集が完了した後で、処理は、構成オプション抑制判断3718 (以下「判断3718」とする)に移る。 判断3718は、検出されたエラーの報告を防止する構成オプションが使用可 能になっているかどうかを決定する。このような構成オプションが指定されてい る(判断3718が真であると決定した)ときには、処理は、リターン3720 に移り、論理流れ図3700に従って処理を終了する。したがって、エラー生成 ユニットは、エラー・メッセージを生み出すことなく終了する。関連のある構成 オプションは、特定のエラー・メッセージのみの生成を指示する「報告」、およ び特定のエラー・メッセージの抑制を指示する「抑制」である。特定の構成オプ ションについてのこれ以上の情報は、付録Bに与える。判断3718が偽である と決定したときには、処理制御は重複エラー判断3722(以下「判断3722 」とする)に移る。 判断3722は、検出されたエラーが以前に報告されたエラーとの重複である かどうかを決定する。エラーは、異なる3つの形で重複エラーに分類される。第 1に、エラーは、以前のエラーが同じファイル名および文中に発生した場合に重 複となる。第2に、エラーは、以前に報告されたミッシング・モデルについての ミッシング・モデル・エラーである場合に重複となる。第3に、エラーは、検出 されたエラーを引き起こした記憶された値のセットが、以前に報告されたエラー を引き起こしたものと同じ記憶された値のセットである場合に重複となる。検出 されたエラーが重複エラーである(判断3722が真であると決定した)場合に は、処理は、リターン3724に移り、論理流れ図3700に従って処理を終了 する。したがって、エラー生成ユニットは、エラー・メッセージを生み出すこと なく終了する。判断3722が偽であると決定したときには、処理制御はエラー 報告処置3726(以下「処置3726」とする)に移る。 処置3726は、検出されたエラーのタイプに対応するエラー・メッセージを 印刷する。印刷する前に、エラー・メッセージには、処置3714で収集された コンテキスト情報が記入される。エラー・メッセージが印刷された後で、論理流 れ図3700による処理、したがってエラー生成ユニットは終了する。終了する と、エラー生成ユニットは、制御が発生したサイトに処理制御を戻す。自動モデル化 概説 モデル118は、対応する関数の動作を概略的に表すものでる。モデル118 は、関数の外部に可視の動作、すなわち関数の呼出し元に見える動作のみを含む 。 別の関数を呼び出す関数を分析するときには、分析器202は、呼び出される 関数のモデルを使用してその動作を決定する。これにより分析は非常に簡単にな り、速度も上がり、分析器202は、呼び出される関数のソース・コードを必要 としなくなり、その分析に時間をかける必要もなくなる。 モデルは、分析器202によって自動的に生成される。分析器は、関数を分析 する際にその関数が何を行うかを記憶し、その関数の分析が完了するときに、そ の関数のモデル118を構築する。 分析器は、付録Gに記載する特殊なモデル化言語でモデル118を読み取り、 これに書き込む。ユーザがその言語でモデル118に書き込むこともできるが、 これは、ソースのない、したがって分析し、自動的にモデル化することができな い関数について行われる。モデル化の概念 エクスターン、制約、結果、アウトカム、および保護の5つの基本的なモデル 化の概念がある。 エクスターンは、単なる外側から見ることのできる関数中の変数である。具体 的に言うと、これらはパラメータ変数、大域変数、および静的変数である。モデ ル118は外部から可視の動作しかカプセル化しないので、これらはモデル11 8中に現れることができる変数のみとなる。 制約は、関数が入力されたときに真とならなければならない条件である。例え ばそのパラメータの1つが有効ポインタであると関数が想定している場合には、 関数のモデル118はそれを必要とする制約を含むことになる。制約は、関数が 呼び出され、モデル118が評価されるときに試験されることになり、その制約 が当てはまらない場合には、分析器202がエラーを報告することになる。 制約とは対照的に、結果は、関数が戻したときに真となる条件である。例えば 関数がゼロを戻した場合には、それが結果になることになる。次いで結果は、分 析器202で後続の分析に使用される。例えば、呼び出された関数の戻し値がそ の後で変数に割り当てられた場合には、呼び出された関数のモデル118が戻す 結果は分析中の変数に割り当てられることになる。 アウトカムは、関数が分割されたケースである。ほとんどの関数は条件(if −then、switch、for loopなど)を含み、この条件付き実行 はモデル118の中で表されなければならず、そうでなければ、モデル化された あらゆる関数は呼び出されるたびに同じことを行うことになる。これに対して、 モデル118はそれらがモデル化した関数より単純になる必要があり、そうでな ければ、それらは関数自体より速く評価することができないことになる。関数は 、それが戻す値に基づいてケースに分割され、これらの各ケースがアウトカムと なる。例えば関数mallocは、それが成功した場合にはポインタを、失敗し た場合には0(ヌル)を、割り振られたメモリに戻す。mallocのモデルは 2つのアウトカムを有する。より一般的には、分析器202は戻し値を以下のケ ースに分割する。 ・関数が0を戻す ・関数が1を戻す ・関数が−1を戻す ・関数が上記3つのうちの1つに制限されない値を戻す ・戻し値が未知である ・関数が値を戻さない(ボイド関数の場合) ・関数がロングジャンプする ・関数が終了する これらのアウトカム・タイプは、それらが速度(いくつかのアウトカム・タイプ )と情報の完全さ(多くのアウトカム・タイプ)の間の妥当なトレードオフを表 すことから選択した。 モデルが複数のアウトカムを有するときには、分析器202は、どのアウトカ ムを使用するか選択しなければならない。この選択はしばしば入力値に基づいて 行われる。保護は、こうした選択を表すために使用される機構である。例えば、 以下の関数は、1を戻す場合と0を戻す場合の、2つのアウトカムを有する。 この関数は、パラメータが0である場合には1しか戻さず、パラメータが0でな い場合には0しか戻さない。各アウトカムは適当な条件を具体化した保護を有す ることになる。 保護は制約と全く同じ形をしているが、それらの意味は異なる。制約は「この アウトカムが選択され、その制約の条件が当てはまらない場合に、エラーを報告 する」という意味であるが、保護は、「その保護の条件が当てはまらない場合に は、このアウトカムを選択してはならない」という意味となる。条件を評価する ことができない場合(例えば上記の値1が未知である場合)には、ある条件が想 定され(ここではiの値)、あるアウトカムが選択される。自動モデラ 自動モデラは、関数を分析する際にモデル118を構築する。現在の関数を介 した各パスが終了するとき、処置1216中に、メモリ・モデル中の構造を走査 し、制約および保護を決定する各外部について実行された試験と、結果を決定す る各外部に対して行われた変更(割当てなど)とを決定する。これらの制約およ び結果はアウトカムにパッケージされる。現在の関数についての分析が終了する とき、処置1114内で、全ての個別のパスのアウトカムを操作し、無関係のオ ペレーションを除去し、重複したアウトカムを削除する。次いで個別のアウトカ ムを、エクスターンのリストと共に現在の関数のモデルにパッケージする。付録 Eは、自動モデラを実施するために使用される一実施形態の擬似コードを含む。 マイクロフィッシュの付録Aのコンピュータ・プログラムは、一実施形態では 、UNIX Solaris 2.5(R)オペレーティング・システムと、米国 カリフォルニア州、Mountain ViewのSun Microsyst emsから市販されているSun SPARCstationTM5などのワーク ステーションを備えたSPARCworksTM3.0.1コンパイラおよびリン カとを使用してコンパイルおよびリンクされた。第2の実施形態では、マイクロ フィッシュの付録Aのコンピュータ・プログラムは、米国Washington 州、RedmondのMicrosoft Corporationから市販さ れている、やはりMicrosoft Corporationから市販されて いるMicrosoft Windows NTTM3.5.1を使用してパーソ ナル・コンピュータ上で使用することができる、Microsoft Visu al C++ 4.0が統合された開発環境を使用してコンパイルおよびリンク された。このようなパーソナル・コンピュータとしては、米国サウスダコタ州、 North Sioux CityのGateway 2000 Inc.から 市販されているGateway G6−2000がある。マイクロフィッシュの 付録Aのコンピュータ・プログラムが適合する特定のコンピュータ言語、および マイ クロフィッシュの付録Aのコンピュータ・プログラムによって規定されるコンピ ュータ・プロセスが実行されるコンピュータ・システムは、本発明の重要な面で はない。本発明の開示に鑑みて、当業者なら、様々なコンピュータ言語および/ または様々なコンピュータ・システムを使用して本発明を実施することができる 。 上記の記述は単なる例示であり、制限的なものではない。例えば、開示の実施 形態ではCコンピュータ言語に従って関数を分析するが、本発明の原理は、上記 のものも含めて、ただしそれらに制限されることなく、その他のコンピュータ命 令プロトコルに適用することができる。本発明は下記の請求の範囲によってのみ 制限される。
───────────────────────────────────────────────────── フロントページの続き (81)指定国 EP(AT,BE,CH,DE, DK,ES,FI,FR,GB,GR,IE,IT,L U,MC,NL,PT,SE),OA(BF,BJ,CF ,CG,CI,CM,GA,GN,ML,MR,NE, SN,TD,TG),AP(GH,KE,LS,MW,S D,SZ,UG,ZW),EA(AM,AZ,BY,KG ,KZ,MD,RU,TJ,TM),AL,AM,AT ,AU,AZ,BA,BB,BG,BR,BY,CA, CH,CN,CU,CZ,DE,DK,EE,ES,F I,GB,GE,GH,HU,IL,IS,JP,KE ,KG,KP,KR,KZ,LC,LK,LR,LS, LT,LU,LV,MD,MG,MK,MN,MW,M X,NO,NZ,PL,PT,RO,RU,SD,SE ,SG,SI,SK,SL,TJ,TM,TR,TT, UA,UG,UZ,VN,YU,ZW (72)発明者 ウイルバー,リチャード・イー アメリカ合衆国・95008・カリフォルニア 州・キャンベル・ポップラー アヴェニ ュ・175 (72)発明者 メジャー―ディグナン,デビイ アメリカ合衆国・95118・カリフォルニア 州・サン ホゼ・パイン フォーレスト プレイス・4828 (72)発明者 シェラフ,デヴィッド・ジョン アメリカ合衆国・94602・カリフォルニア 州・オークランド・ウオーターハウス ロ ード・4007 【要約の続き】 のために、メモリ・モデルの操作を記述する情報をログ する。構造メモリ・モデル中の無効条件が検出され、報 告される。各パスの分析の後で、自動モデル化のために ログした情報を操作し、そのパスについてのアウトカム を構築する。個別のパスの分析が完了した後で、様々な アウトカムを処理し、重複を除去し、分析中のコンピュ ータ・プログラムを表す外部動作モデルを生成する。

Claims (1)

  1. 【特許請求の範囲】 1.1つまたは複数のステートメントを含む少なくとも1つの関数を含むコンピ ュータ・プログラムの実行をシミュレートして、前記コンピュータ・プログラム 中のプログラム・エラーを検出する方法であって、 前記コンピュータ・プログラムの表現を検索する段階と、 前記ステートメントの第1列を含む第1制御フロー・パスを、前記関数を通し てトラバースする段階とを含み、前記トラバース段階が、 前記第1制御フロー・パスにわたって前記関数について第1構造メモリ・モ デルを維持する段階、 前記第1構造メモリ・モデルを操作して前記ステートメントの前記第1列の 実行をシミュレートする段階、 前記第1構造メモリ・モデル中の無効条件を検出する段階、および 前記第1構造メモリ・モデル中の前記無効条件を報告する段階 を含む方法。 2.前記コンピュータ・プログラムの前記表現が内部フォーマット構造である請 求項1に記載の方法。 3.前記コンピュータ・プログラムによって規定される全ての前記関数を識別す る段階と、 前記コンピュータ・プログラムによって規定される前記関数のリストを、関数 呼出し順序に基づいて順序づける段階と、 前記コンピュータ・プログラムによって規定される前記関数のリストの前記順 序づけに基づいて、前記コンピュータ・プログラムの分析をスケジューリングす る段階と をさらに含む請求項1に記載の方法。 4.構成制御コマンドを受け入れる段階と、 前記構成制御コマンドに基づいて前記コンピュータ・プログラムの分析を修正 する段階と をさらに含む請求項1に記載の方法。 5.指定された関数用の第2構成制御コマンドを受け入れる段階と、 前記第2構成制御コマンドに基づいて前記の指定された関数の分析を修正する 段階と をさらに含む請求項4に記載の方法。 6.指定されたステートメント用の第3構成制御コマンドを受け入れる段階と、 前記第3構成制御コマンドに基づいて前記の指定されたステートメントの分析 を修正する段階と をさらに含む請求項5に記載の方法。 7.第1制御フロー・パスを前記関数を通してトラバースする前記段階が、 前記第1制御フロー・パス中で未解決な選択点を識別する段階と、 前記未解決な選択点を、前記選択点の解決の可能性のそれぞれに対するエッジ を含むツリー内のノードで表す段階と、 第1の未選択のエッジを無作為に選択して第1選択を決定することにより、前 記未解決な選択点を解決する段階と をさらに含む請求項1に記載の方法。 8.前記未解決な選択点を解決する前記段階が、 前記第1選択の履歴を維持する段階と、 第2の未選択の前記エッジを無作為に選択して第2選択を決定する段階とをさ らに含む請求項7に記載の方法。 9.第1制御フロー・パスを前記関数を通してトラバースする前記段階が、 前記第1構造メモリ・モデルを更新して、前記未解決な選択点を解決する前記 段階を反映する段階と、 をさらに含む請求項7に記載の方法。 10.前記コンピュータ・プログラムの前記表現を分析して関数呼出しを識別す る段階と、 前記関数呼出しに対応する呼び出された関数の外部動作モデルを突き止める段 階と、 前記関数呼出しに対応する呼び出された関数の前記外部動作モデルを検索する 段階とをさらに含む請求項1に記載の方法であって、前記第1構造メモリ・モデ ルを操作して前記ステートメントの前記第1列の実行をシミュレートする前記段 階が、 前記関数呼出しに対応する呼び出された関数の前記外部動作モデルの実行を介 して前記関数呼出しの実行をエミュレートする段階をさらに含む方法。 11.前記第1構造メモリ・モデル中の前記無効条件が、メモリの初期化されて いない部分を知らせる請求項1に記載の方法。 12.前記第1構造メモリ・モデル中の前記無効条件が、無効ポインタを知らせ る請求項1に記載の方法。 13.前記第1構造メモリ・モデル中の前記無効条件が、ゼロ因子を知らせる請 求項1に記載の方法。 14.前記第1構造メモリ・モデルを操作する前記段階を記述する情報をログし て、第1ログ・データを生成する段階 をさらに含む請求項1に記載の方法。 15.前記関数を自動モデル化して前記関数に対応する外部動作モデルを生成す る段階をさらに含む請求項14に記載の方法であって、前記自動モデル化段階が 、 前記第1ログ・データを走査して、前記第1制御フロー・パスについての第1 のアウトカムを生み出す段階を含む方法。 16.前記関数を自動モデル化する前記段階が、 前記第1ログ・データを操作して、前記関数のエクスターンを識別する段階を さらに含む請求項15に記載の方法。 17.前記関数を自動モデル化する前記段階が、 前記第1構造メモリ・モデルを操作する前記段階を記述する情報をログする前 記段階の前に、前記第1構造メモリ・モデルへの1つまたは複数のリンクを含む 記号表を順序づけする段階をさらに含む請求項15に記載の方法。 18.前記ステートメントの第2列を含む第2制御フロー・パスを、前記関数を 通してトラバースする段階と、 前記第2構造メモリ・モデルを操作する前記段階を記述する情報をログして、 第2ログ・データを生成する段階と をさらに含み、前記トラバース段階が、 前記第2制御フロー・パスにわたって前記関数について第2構造メモリ・モ デルを維持する段階、および 前記第2構造メモリ・モデルを操作して前記ステートメントの前記第2列の 実行をシミュレートする段階を含み、 前記関数を自動モデル化して前記関数に対応する外部動作モデルを生成する段 階が、 前記第2ログ・データを走査して、前記第2制御フロー・パスについての第 2のアウトカムを生み出す段階と、 前記第1のアウトカムおよび前記第2のアウトカムの間の重複を解消して、 1つまたは複数の残りのアウトカムを生成する段階と、 前記残りのアウトカムおよび前記エクスターンを、前記関数に対応する前記 外部動作モデルにパッケージする段階と を含む請求項16記載の方法。 19.前記コンピュータ・プログラムが第1関数である請求項18に記載の方法 。 20.前記第1関数が第2コンピュータ・プログラムの一部分であり、前記関数 を自動モデル化する前記段階で生成された前記外部動作モデルが、前記第2コン ピュータ・プログラムの分析において前記第1関数をエミュレートするために使 用される請求項19に記載の方法。 21.前記第1構造メモリ・モデル中の前記無効条件を報告する前記段階が、 前記無効条件が重複であると決定する段階と、 前記無効条件の報告を抑制する段階と をさらに含む請求項1に記載の方法。 22.前記第1構造メモリ・モデル中の前記無効条件を報告する前記段階が、 前記構成制御コマンド、前記第2構成制御コマンド、および前記第3構成制御 コマンドのうち1つが前記無効条件の抑制をオーダーすると決定する段階と、 前記無効条件の報告を抑制する段階と をさらに含む請求項6に記載の方法。 23.ゼロ個のステートメントを含む少なくとも1つの関数を含むコンピュータ ・プログラムの実行をシミュレートして、前記コンピュータ・プログラム中のプ ログラム・エラーを検出する方法であって、 前記コンピュータ・プログラムの表現を検索する段階と、 ゼロ個のステートメントを含む制御フロー・パスを前記関数を通してトラバー スする段階と、 前記関数を記述する情報をログしてログ・データを生成する段階と、 前記関数を自動モデル化して前記関数に対応する外部動作モデルを生成する段 階と を含み、前記トラバース段階が、 前記制御フロー・パスにわたって前記関数について構造メモリ・モデルを維 持する段階を含み、 前記自動モデル化段階が、 前記ログ・データを走査して前記制御フロー・パスについてのアウトカムを 生み出す段階を含む方法。 24.前記関数を自動モデル化する前記段階が、 前記ログ・データを走査して前記関数のエクスターンを識別する段階 をさらに含む請求項24に記載の方法。 25.1つまたは複数のステートメントを含むコンピュータ・プログラムの実行 をシミュレートして、前記コンピュータ・プログラム中のプログラム・エラーを 検出する方法であって、 前記コンピュータ・プログラムの表現を検索する段階と、 前記ステートメントの第1列を含む第1制御フロー・パスを、前記コンピュー タ・プログラムを通してトラバースする段階とを含み、前記トラバース段階が、 前記第1制御フロー・パスにわたって前記コンピュータ・プログラムについ て第1構造メモリ・モデルを維持する段階、 前記第1構造メモリ・モデルを操作して前記ステートメントの前記第1列の 実行をシミュレートする段階、 前記第1構造メモリ・モデル中の無効条件を検出する段階、および 前記第1構造メモリ・モデル中の前記無効条件を報告する段階 を含む方法。 26.前記コンピュータ・プログラムの前記表現が内部フォーマット構造である 請求項25に記載の方法。 27.第1制御フロー・パスを前記コンピュータ・プログラムを介してトラバー スする前記段階が、 前記第1制御フロー・パス中で未解決な選択点を識別する段階と、 前記未解決な選択点を、前記選択点の解決の可能性のそれぞれに対するエッジ を含むツリー中のノードで表す段階と、 第1の未選択のエッジを無作為に選択して第1選択を決定することにより、前 記未解決な選択点を解決する段階と をさらに含む請求項25に記載の方法。 28.前記未解決な選択点を解決する前記段階が、 前記第1選択の履歴を維持する段階と、 第2の未選択の前記エッジを無作為に選択して第2選択を決定する段階と をさらに含む請求項27に記載の方法。 29.第1制御フロー・パスを前記コンピュータ・プログラムを介してトラバー スする前記段階が、 前記第1構造メモリ・モデルを更新して、前記未解決な選択点を解決する前記 段階を反映する段階と、 をさらに含む請求項27に記載の方法。 30.前記コンピュータ・プログラムの前記表現を分析して関数呼出しを識別す る段階と、 前記関数呼出しに対応する呼び出された関数の外部動作モデルを突き止める段 階と、 前記関数呼出しに対応する呼び出された関数の前記外部動作モデルを検索する 段階とをさらに含む請求項25に記載の方法であって、前記第1構造メモリ・モ デルを操作して前記ステートメントの前記第1列の実行をシミュレートする前記 段階が、 前記関数呼出しに対応する呼び出された関数の前記外部動作モデルの実行を介 して前記関数呼出しの実行をエミュレートする段階をさらに含む方法。 31.前記第1構造メモリ・モデル中の前記無効条件が、メモリの初期化されて いない部分を知らせる請求項25に記載の方法。 32.前記第1構造メモリ・モデル中の前記無効条件が、無効ポインタを知らせ る請求項25に記載の方法。 33.前記第1構造メモリ・モデル中の前記無効条件が、ゼロ因子を知らせる請 求項25に記載の方法。 34.前記第1構造メモリ・モデルを操作する前記段階を記述する情報をログし て、第1ログ・データを生成する段階 をさらに含む請求項25に記載の方法。 35.前記コンピュータ・プログラムを自動モデル化して前記コンピュータ・プ ログラムに対応する外部動作モデルを生成する段階をさらに含む請求項34に記 載の方法であって、前記自動モデル化段階が、 前記第1ログ・データを走査して、前記第1制御フロー・パスについての第1 のアウトカムを生み出す段階を含む方法。 36.前記コンピュータ・プログラムを自動モデル化する前記段階が、 前記第1構造メモリ・モデルを操作する前記段階を記述する情報をログする前 記段階の前に、前記第1構造メモリ・モデルへの1つまたは複数のリンタを含む 記号表を順序づけする段階をさらに含む請求項35に記載の方法。 37.前記コンピュータ・プログラムを自動モデル化する前記段階が、 前記第1ログ・データを操作して、前記コンピュータ・プログラムのエクスタ ーンを識別する段階 をさらに含む請求項35に記載の方法。 38.ステートメントの第2列を含む第2制御フロー・パスを、コンピュータ・ プログラムを介してトラバースする段階と、 第2構造メモリ・モデルを操作する前記段階を記述する情報をログして、第2 ログ・データを生成する段階と を含み、前記トラバース段階が、 第2制御フロー・パスにわたってコンピュータ・プログラムについて第2構 造メモリ・モデルを維持する段階、および 第2構造メモリ・モデルを操作してステートメントの第2列の実行をシミュ レートする段階を含む請求項37に記載の方法であって、前記コンピュータ・プ ログラムを自動モデル化して前記コンピュータ・プログラムに対応する外部動作 モデルを生成する段階が、 前記第2ログ・データを走査して、前記第2制御フロー・パスについての第 2のアウトカムを生み出す段階と、 前記第1のアウトカムおよび前記第2のアウトカムの間の重複を解消して、 1つまたは複数の残りのアウトカムを生成する段階と、 前記残りのアウトカムおよび前記エクスターンを、前記コンピュータ・プロ グラムに対応する前記外部動作モデルにパッケージする段階と を含む方法。 39.前記第1コンピュータ・プログラムが第2コンピュータ・プログラムの一 部分であり、前記コンピュータ・プログラムを自動モデル化する前記段階で生成 された前記外部動作モデルが、前記第2コンピュータ・プログラムの分析におい て前記第1コンピュータ・プログラムをエミュレートするために使用される請求 項25に記載の方法。 40.1つまたは複数のステートメントを含むコンピュータ・プログラム中のエ ラーを検出するためのエラー検出プロセッサであって、 シミュレーション時の前記コンピュータ・プログラムの動作を表す構造メモリ ・モデルと、 前記ステートメントの列から構成される制御フロー・パスを、前記コンピュー タ・プログラムを介してトラバースする分析エンジンと、 前記制御フロー・パス中の前記ステートメントの結果をシミュレートするステ ートメント・ユニットと、 前記シミュレーション後に前記構造メモリ・モデル内で検出された無効条件を 報告するエラー生成ユニットと を含むエラー検出プロセッサ。 41.外部動作モデルを生成して、前記コンピュータ・プログラムの可視の動作 を表す自動モデラ をさらに含む請求項40に記載のエラー検出プロセッサ。
JP50825598A 1996-08-07 1997-08-06 シミュレートされたプログラムの実行エラーの検出方法および装置 Expired - Lifetime JP4633203B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US69477096A 1996-08-07 1996-08-07
US08/694,770 1996-08-07
PCT/US1997/014051 WO1998006019A2 (en) 1996-08-07 1997-08-06 Simulated program execution error detection method and apparatus

Publications (3)

Publication Number Publication Date
JP2002515996A true JP2002515996A (ja) 2002-05-28
JP2002515996A5 JP2002515996A5 (ja) 2005-04-07
JP4633203B2 JP4633203B2 (ja) 2011-02-16

Family

ID=24790203

Family Applications (1)

Application Number Title Priority Date Filing Date
JP50825598A Expired - Lifetime JP4633203B2 (ja) 1996-08-07 1997-08-06 シミュレートされたプログラムの実行エラーの検出方法および装置

Country Status (3)

Country Link
JP (1) JP4633203B2 (ja)
AU (1) AU4058997A (ja)
WO (1) WO1998006019A2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20230018128A (ko) * 2021-07-29 2023-02-07 국방과학연구소 전자 장치의 소프트웨어 검증 방법

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
AU3867500A (en) * 1999-03-04 2000-09-21 Origins Software Company Automatic consistency checking of computer programs
US9280406B2 (en) 2009-10-05 2016-03-08 International Business Machines Corporation Automatic correction of application based on runtime behavior
US8448139B2 (en) 2009-10-05 2013-05-21 International Business Machines Corporation Automatic correction of application based on runtime behavior
CN110489314B (zh) * 2019-07-05 2022-07-12 中国平安人寿保险股份有限公司 模型异常检测方法、装置、计算机设备和存储介质
KR102491925B1 (ko) * 2021-02-26 2023-01-26 고려대학교 산학협력단 프로그램 분석 장치 및 방법

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2922723B2 (ja) * 1992-06-29 1999-07-26 キヤノン株式会社 情報処理装置
US5446900A (en) * 1992-07-24 1995-08-29 Microtec Research, Inc. Method and apparatus for statement level debugging of a computer program
US5325533A (en) * 1993-06-28 1994-06-28 Taligent, Inc. Engineering system for modeling computer programs
DE69415593T2 (de) * 1993-06-30 1999-05-20 Microsoft Corp., Redmond, Wash. Verfahren zur Überprüfung eines nachrichtengesteuerten Betriebssystems
US5590329A (en) * 1994-02-04 1996-12-31 Lucent Technologies Inc. Method and apparatus for detecting memory access errors
US5583988A (en) * 1994-03-09 1996-12-10 National Instruments Corporation Method and apparatus for providing runtime checking features in a compiled programming development environment
US5687375A (en) * 1994-10-14 1997-11-11 International Business Machines Corporation Debugging of High Performance Fortran programs with backup breakpoints
US5581696A (en) * 1995-05-09 1996-12-03 Parasoft Corporation Method using a computer for automatically instrumenting a computer program for dynamic debugging

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20230018128A (ko) * 2021-07-29 2023-02-07 국방과학연구소 전자 장치의 소프트웨어 검증 방법
KR102543663B1 (ko) * 2021-07-29 2023-06-15 국방과학연구소 전자 장치의 소프트웨어 검증 방법

Also Published As

Publication number Publication date
WO1998006019A2 (en) 1998-02-12
JP4633203B2 (ja) 2011-02-16
WO1998006019A3 (en) 1998-03-26
AU4058997A (en) 1998-02-25

Similar Documents

Publication Publication Date Title
US5790778A (en) Simulated program execution error detection method and apparatus
US6154876A (en) Analysis of the effect of program execution of calling components with data variable checkpointing and resource allocation analysis
Bush et al. A static analyzer for finding dynamic programming errors
Sridharan et al. Thin slicing
Hackett et al. Fast and precise hybrid type inference for JavaScript
US20060253739A1 (en) Method and apparatus for performing unit testing of software modules with use of directed automated random testing
Binkley et al. Tool-supported refactoring of existing object-oriented code into aspects
Kirby Reflection and hyper-programming in persistent programming systems
Sotirov Automatic vulnerability detection using static source code analysis
Van Binsbergen et al. A principled approach to REPL interpreters
Lie et al. A simple method for extracting models for protocol code
Kotik et al. Automating software analysis and testing using a program transformation system
US5764883A (en) System and method for checking for dynamic resource misuse in a computer program
Di Nardo et al. Generating complex and faulty test data through model-based mutation analysis
Cheon Automated random testing to detect specification-code inconsistencies
Hoeflich et al. Highly illogical, Kirk: spotting type mismatches in the large despite broken contracts, unsound types, and too many linters
Liuying et al. Test selection from UML statecharts
Soueidi et al. Efficient and expressive bytecode-level instrumentation for Java programs
Mayer et al. Model-based debugging using multiple abstract models
JP2002515996A (ja) シミュレートされたプログラムの実行エラーの検出方法および装置
CN115098355A (zh) 基于历史数据驱动的jvm测试程序生成方法
Eilertsen Making software refactorings safer
Patil Regression Testing in Era of Internet of Things and Machine Learning
González Finding error-propagation bugs in large software systems using static analysis
Horváth Static analyses for C++ in the presence of separate compilation

Legal Events

Date Code Title Description
A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A712

Effective date: 20040706

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040806

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20040806

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20070515

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20070814

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20071001

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20071012

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20071119

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20071115

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20080415

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20080715

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20080715

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080813

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20080904

A912 Re-examination (zenchi) completed and case transferred to appeal board

Free format text: JAPANESE INTERMEDIATE CODE: A912

Effective date: 20081106

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20100526

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20100526

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20101015

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20101117

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

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

Free format text: PAYMENT UNTIL: 20131126

Year of fee payment: 3

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

EXPY Cancellation because of completion of term