JPH10509258A - コンピュータプロセスのリソースのモデル化方法及び装置 - Google Patents

コンピュータプロセスのリソースのモデル化方法及び装置

Info

Publication number
JPH10509258A
JPH10509258A JP8507384A JP50738496A JPH10509258A JP H10509258 A JPH10509258 A JP H10509258A JP 8507384 A JP8507384 A JP 8507384A JP 50738496 A JP50738496 A JP 50738496A JP H10509258 A JPH10509258 A JP H10509258A
Authority
JP
Japan
Prior art keywords
resource
state
statement
predicate
component
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
JP8507384A
Other languages
English (en)
Other versions
JP4213203B2 (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 JPH10509258A publication Critical patent/JPH10509258A/ja
Application granted granted Critical
Publication of JP4213203B2 publication Critical patent/JP4213203B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING OR CALCULATING; COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Prevention of errors by analysis, debugging or testing of software
    • G06F11/362Debugging of software
    • G06F11/366Debugging of software using diagnostics

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (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)
  • Injection Moulding Of Plastics Or The Like (AREA)
  • Devices For Executing Special Programs (AREA)
  • Multi-Process Working Machines And Systems (AREA)

Abstract

(57)【要約】 コンピュータプログラム中のプログラミングエラーを検出するためのエラー検出機構。コンピュータプログラムのコンポーネント(例えばコンピュータプログラムの手続きまたは関数)を解析して、そのコンポーネントがコンピュータプログラムによって使用されるリソースに与える影響を決定する。コンポーネントの解析は、そのコンポーネントのコンピュータ命令、即ちステートメントをトラバースし、そのコンポーネントの影響を受けるコンポーネントによって使用されるリソースの状態を追跡することによりなされる。各リソースは複数の状態とそれらの状態間遷移とによって表される所定の挙動を有する。コンポーネントのステートメントのエミュレートされた実行の結果生じるリソースの所定の挙動に対する違反を検知し、プログラミングエラーとして通知する。2以上のコンポーネントによって使用されるリソースは、コンポーネントのエクスターナル(external)をモデル化することによってモデル化される。コンポーネントの実行がそのコンポーネントのリソース及びエクスターナルに与える影響は、そのコンポーネントの1または複数の可能な制御流れ経路をトラバースし、各制御流れ経路の各ステートメントによる各エクスターナル及びリソースの使用を追跡することによって決定される。コンポーネントの実行がそのコンポーネントのリソース及びエタスターナルに与える影響が決定されると、そのコンポーネントのモデルが生成され、そのモデル化されたコンポーネントによって呼び出される他のコンポーネントのリソース及びエクスターナルをモデル化するのに使用される。

Description

【発明の詳細な説明】 コンピュータプロセスのリソースのモデル化方法及び装置付録Aについて 本開示の一部である付録Aは、以下により詳しく説明する本発明の一実施例に おけるコンピュータプログラム及び関連するデータのリストである。 本特許文献の開示の一部には著作権保護に従う題材が含まれている。本著作権 所有者は、特許商標庁の特許ファイルまたは記録に掲載される場合は、本特許文 献または特許開示が誰によって複製されてもそれに異議を唱えるものではないが 、それ以外の場合は全ての著作権を保留するものである。発明の背景 発明の技術分野 本発明はコンピュータプログラムの解析に関する。特に、コンピュータプログ ラムによって定められたリソースの使用の解析を通して、コンピュータプログラ ム内のプログラミングエラーを検出することに関する。関連する技術分野の説明 既存のプログラミングエラー検出方法には、特定のプログラムが従うべきコン ピュータ命令プロトコル(computer instructionprotocol)における違反を検出 するものがある。そのようなプログラムエラー検出方法は“スタティックチェッ ク法(static checking)”と呼ばれているが、それはコンピュータプログラム のコンピュータ命令(または“ステートメント”)の文法が、それらのステート メントの実行から生じる挙動の文脈(context)の外で解析されるからである。 “ステートメント”という用語は、本明細書中では、Herbert Schildtによる“注釈版ANSI Cスタンダード (Osborne McGraw-Hill 1990)”(以下、Cスタンダ ードと呼 ぶ)として再版された“American National Standard for ProgrammingLanguage s--C (American National Standards Institute/International Organization fo r Standardization ANSI/ISO 9899-1990)”のセクション6.6において定義さ れている意味で使用される。簡単に説明すると、C言語の文脈において、ステー トメントとは宣言ではないコンピュータ命令である。言い換えると、ステートメ ントとは、コンピュータに指示を与えて1または複数の処理過程を実行させる任 意の式または命令である。C言語の文脈におけるスタティックチェック法には、 (i)コンピュータプログラム中に同じ名前が付けられた2つの変数がないこと を確認すること、(ii)各“break”ステートメントが先行する“whi le”、“for”または“switch”ステートメントに対応していること を確認すること、及び(iii)演算子が適切なオペランドに対して施されてい ることをベリフィケーションすることなどが含まれる。スタティックチェック法 については、例えば、Alfred V.Aho らによる“Compilers(Addison Wesley 198 8)”に記載されている。 一般に“データ流れ解析”技法と呼ばれている、既存のスタティックチェック 法のあるものは、プログラミングエラーを検出するため、プログラム中のデータ の流れを解析する。このような解析は、例えば、ある変数に値が代入される前に その変数を使用するといった不適切なデータオブジェクトの使用を検出するため 、ステートメント及びループステートメントを順に並べるなどして、制御流れ情 報を活用する。あるコンピュータプログラムにおける制御流れとは、そのコンピ ュータプログラムによって定義されるコンピュータプロセスにおいてそのコンピ ュータプログラムのコンピュータ命令が実行されていく特定の順序のことである 。コンピュータプログラム及びプロセス、及びそれらの関係については、後によ り詳しく説明する。データ流れ技法については、Beizerによる “Software Testing Techniques,(1990)pp.145-172”に記載されている。 既存のスタティックチェック法には、まとまってコンピュータプログラムを形 成する関数のようなコンピュータプログラムの幾つかの個々のコンポーネントを 通じたリソースの使用の追跡が不可能であるという欠点がある。例えば、ある変 数が第1の関数において初期化され、第2のそれに続いて実行される関数におけ る計算において使用されるということがあり得る。第2の関数のコンピュータ命 令を解析するだけでは、その変数は初期化される前に使用されるようにみえ、こ れは誤ってエラーとして通知される可能性がある。更に、既存のスタティックチ ェック法は本質的に静的(static)であり、特定のデータオブジェクトに関連付 けられる特定のデータ値を考慮することはない。静的な解析は、プログラムの実 行の動的な効果を考慮することなく決定することができることに限定される。Be izerは、静的な解析が不適当である幾つかの領域について述べている。それらに は、配列、特に動的に計算される指標及び動的に割り当てられる配列;レコード 及びポインタ;ファイル;及び交互状態テーブル(alternate state tables)が 含まれる。これらは同じプログラムにおいて異なる型の異なる意味(semantics )を表す。 スタティックチェッカ(static checker)は、動的に割り当てられるメモリ( dynamically allocated memory)に対応して計算されるアドレスまたは配列をな すように計算される指標を含むエラーを検出しない。計算されるアドレス及び指 標は、それぞれコンピュータプロセスの実行中に計算されるアドレス及び指標で ある。スタティックチェッカがそのようなエラーをコンピュータプログラム中で 検出しないのは、そのようなエラーの調査には、通常、計算されるアドレス及び 指標の正確な値を決定することが含まれ、それには実行時のコンピュータプログ ラムの挙 動を考慮すること即ちコンピュータプロセスとして考慮することが含まれるから である。 またスタティックチェッカは、正常に割り当てられるか疑わしいリソースの使 用や、変数または他のデータオブジェクトの値によって状態を決定されるリソー スの使用を含むエラーを検出しない。C言語では、リソース(例えば、動的に割 り当てられるメモリまたはファイル)が正常に割り当てられるかどうか疑わしい 。言い換えると、リソースを割り当てる関数は、リソースの割り当てに失敗して も正常に終了する。割り当てが成功したかどうかは、関数の戻り値項目(割り当 てられたリソースを指すポインタ)を無効値(例えばNULL)と比較すること によって判定されるのだが、スタティックチェッカは呼び出される関数の挙動を 考慮することはせず、被呼び出し関数に対する呼び出しの文法が、特定のコンピ ュータ言語において定められた文法に従っているかどうかのみをベリフィケーシ ョンする。従って、スタティックチェッカは正常に割り当てられるかどうか疑わ しいリソースの使用を含むエラーを検出しない。 上述したように、スタティックチェッカは呼び出される関数の挙動を考慮しな い。従って、複数の関数にまたがったリソースの使用をベリフィケーションする ことは不可能である。例えば、第1の関数がリソースを割り当てを行い(alloca te)、第2の関数がそのリソースを使用し、第3の関数がそのリソースを開放( deallocate)する場合、第1、第2、及び第3の関数のいずれかを単独で、また は3つの関数の全ての呼び出しをする一つの関数を静的に調べることによっては 、リソースの適切な使用をベリフィケーションすることはできない。 実行時のコンピュータプログラムの挙動に関する情報を十分に使用しないエラ ー検出技法が用いられる場合、そのような技法によって検出さ れるエラーは過小に検出されるかあるいは過大に検出されるかのいずれかとなる 。例えば、ある関数が、割り当てられるリソース(例えば、ファイル)を指定す るポインタをパラメータとして受け取り、そのパラメータを無効ポインタと比較 することなく使用するような場合、その関数はエラーを含む可能性を有する。そ の関数がエラーを含むかどうかは、その関数の文脈内ではわからない様々な状況 に依存する。例えば、そのポインタが関数が呼び出される前に有効なポインタで あるとベリフィケーションされる場合、その関数はエラーを含まない。そのポイ ンタの使用をエラーとして通知することは、誤ったエラー通知でその関数の解析 を混乱させ、エラーを過大にすることとなる。大きなプログラムの解析において 誤ってエラーを通知することは、よくてもプログラム開発者をわずらわせ、悪け ればコンピュータプログラムの解析を役に立たないものとしてしまう。関数を呼 び出す前にポインタが有効であるかチェックされない場合に、エラーの通知をし ないと、実行時にコンピュータプログラムを突然アボートさせ、データ構造の破 壊や有効なデータの損失といった結果を生じさせ得るエラーの検出がなされない こととなる。 コンピュータプログラムの動的な挙動を考慮しないスタティックチェック法の 欠点の1つは、明白な、しかし“虚偽の”エラーの通知をすることである。即ち 、制御が流れ得ないコンピュータ命令から生じるエラーを通知することである。 制御流れ経路(control flowpath)が特定のデータ構造及びプログラム変数に関 連付けられる特定の値に依存するような関数では、制御流れはこれらのデータ構 造及び変数に関連付けられる値を考慮することなくして決定することはできない 。また、これらのデータ構造及び変数に関連付けられる値は、一般に、実行時の 関数の挙動を考慮することなくして決定することはできない。その結果、実行さ れない命令または特定の状態の下でしか実行されない命令は一般にスタ ティックチェッカでは常に実行されるものと仮定される。 既存のプログラミングエラー検出技法の別のタイプに、プログラムベリフィケ ーション(program verification)と呼ばれるものがある。プログラムベリフィ ケーションでは、コンピュータプログラムは形式的な数学的対象として扱われる 。コンピュータプログラム中のエラーは理論数学を用いてコンピュータプログラ ムの所定の特性を立証すること、または立証するのに失敗することによって検出 される。一般に立証が試みられる特性の1つは、所定の入力が与えられたとき、 コンピュータプログラムによって定義されたコンピュータプロセスが所定の出力 を生成するということである。その立証が失敗に終わる場合、コンピュータプロ グラムはプログラミングエラーを含む。このようなプログラムベリフィケーショ ン技法は、例えば、Eric C.R.Hehnerらによる“A PracticalTheory of Progra mming ,(Verlag 1993)”及び Ole-Johan Dahlによる“Verifiable Programming ,(Prentice Hall 1992)”に記載されている。 プログラムベリフィケーション技法は少なくとも2つの意味で制約を受ける。 即ち、(i)形式的論理を用いて表現し自動的に立証することができるコンピュ ータプログラムの特性のみがベリフィケーション可能である、(ii)コンピュ ータプログラムの開発者は、コンピュータプログラムの特性を形式的に明確に表 さなければならない。コンピュータプログラムの特性を形式的に表すことは、ど んな場合にも極めて困難なことであり、大きなプログラムでは殆ど不可能である 。そのため、プログラムベリフィケーション技法を用いた商業的に成功した商品 は極めて希である。 プログラミングエラー検出技法の別のタイプでは、コンピュータプログラムが 実行され、従ってコンピュータプロセスが形成され、コンピュータプロセスの挙 動が監視される。コンピュータプログラムの解析がプ ログラムの実行中になされるため、そのようなプログラムエラー検出技法は“ラ ンタイムチェック法(runtime checking)”と呼ばれる。ランタイムチェック技 法の中には、コンピュータ命令をコンピュータプログラム中に自動的に挿入して 、コンピュータプログラムの実行時に、挿入されたコンピュータ命令が実行され ることによって、コンピュータプログラムの変数及びリソースの状態が示される ようにするものがある。そのようなエラー検出技法は、Hastingsに付与された米 国特許第5,193,180号明細書に記載されている。 ランタイムチェックでは、通常、メモリリーク(memory leaks)や禁止領域に 入った配列の指標のようなエラーを検出することができる。ランタイムチェック の例として、カリフォルニア州サニーベイル(Sunnyvale,California)“Pure Software Inc.”から入手可能な“Purify”や、カリフォルニア州パサデナ(Pas adena,California)の“Parasoft Corporation”から入手可能な“Insight”な どがある。“Purify”は、コンピュータがコンパイルされてオブジェクトコード 形式になった後にコンピュータプログラムをモニタリングするためのコンピュー タ命令を挿入する。“Insight”は、コンピュータプログラムがコンパイルされ る前に、即ちコンピュータプログラムがまだソースコード形式のときに、コンピ ュータプログラムをモニタリングするためのコンピュータ命令を挿入する。 ランタイムチェックは、一般に、実際の特定の入力を使ってコンピュータプロ グラムのコンピュータ命令を実際に実行することによって判定可能なものに限定 される。ランタイムチェッタ法はコンピュータプログラムの制御の流れの全経路 を考慮することはせず、実行時にコンピュータプログラムに与えられる特定の入 力に対応した経路しか考慮しない。一般に、コンピュータプログラムのコンピュ ータ命令の実行によって形 成されるコンピュータプロセスを、全ての可能な制御流れ経路を通るようにする ことは実際的ではない。そのようにするには、プログラマーが、コンピュータプ ログラムのコンピュータ命令の実行時に発生し得る全ての事象を予期し、そのよ うな事象発生の全ての組み合わせを生じさせるまたはエミュレートすることが必 要であるからである。 更に、ランタイムチェックは、コンピュータプログラムが完成しているときし か使用することができない。ランタイムチェッタでは、ある1つの関数が完成し たプログラムに組み込まれる前に、その関数を解析することは不可能である。な ぜなら、解析するにはその関数を実行しなければならないからである。従って、 ランタイムチェックを用いて関数を解析するには、(i)コンピュータプログラ ムの全ての関数が、それらの関数のどれかを解析するよりも前に、開発され、組 み合わされてコンピュータプログラムを形成していること、または(ii)関数 をテストするために、その関数を組み込んだ特別なテストプログラムが開発され ていることが必要である。従って、完成したコンピュータプログラムへの組み込 み前に個々の関数の設計、制作及びテストを行う、複雑なコンピュータプログラ ムを開発する好適な方法であり広く知られているトップダウン式のプログラミン グは、ランタイム解析にはなじまない。 必要とされているのは、コンピュータプログラムの動的な挙動を考慮し、自動 的にコンピュータプログラムの概ね全ての制御流れ経路を考慮し、コンピュータ プログラムのプログラマーがコンピュータプログラムを別の形式、例えば数学的 形式、で表すことを必要としないプログラミングエラー検出技術である。更に必 要とされているのは、プログラムの個々のコンポーネントを、実行時のそのコン ポーネントの挙動を考慮して解析するプログラミングエラー検出技術である。更 に必要とされているのは、解析中のコンピュータプログラムコンポーネントによ って実行 を喚起されるコンポーネントの挙動を考慮するプログラミングエラー検出技術で ある。発明の要約 本発明によると、コンピュータプログラムによって使用されるリソースの挙動 をモデル化し、それらのリソースにおいて発生する可能性のある状態違反を検出 することによって、コンピュータプログラムの解析がなされコンピュータプログ ラム中のプログラミングエラーが検出される。リソースは、リソース状態とリソ ースの挙動を表すリソース状態遷移とに基づいてモデル化される。コンピュータ プログラムのコンピュータ命令は動的に検査される。即ち、コンピュータ命令の 動的挙動が決定され、コンピュータ命令の動的挙動に従ってリソースの状態が変 化させられる。 コンピュータプログラムの各コンポーネントは個々に解析される。使用が複数 のコンポーネントに渡るリソース、例えば第1コンポーネントによって割り当て られ、第2コンポーネントによって使用され、第3コンポーネントによって開放 されるリソースの使用は、各コンポーネントのエクスターナル(external)をモ デル化することによって解析される。コンピュータプログラムの2つのコンポー ネントは、各コンポーネントのエクスターナルを通じて互いにコミュニケートす る。例えば、第1コンポーネントによって割り当てられるリソースに関する情報 が、そのリソースを使用する第2コンポーネントに、第1及び第2コンポーネン トのエクスターナルを通して伝達される。各コンポーネントの挙動をそのコンポ ーネントのエクスターナルに関して解析することによって、使用が複数のコンポ ーネントに渡るリソースの適切なモデル化がなされる。 各コンポーネントが解析されると、コンポーネントの実行がそのコンポーネン トの各エクスターナルに与える影響が決定される。コンポーネントの解析から、 コンポーネントのモデルが生成される。コンポーネン トのモデルは、そのコンポーネントの実行がそのコンポーネントの各エクスター ナルに対して与える影響を、エクスターナルのそれぞれの状態の変化とそのコン ポーネントのいずれかのエクスターナルに関連付けられる新たなリソースの導入 とに関して記述するものである。モデル化されるコンポーネントの実行が与える 影響の数及び影響されるエクスターナルは任意であり、これらの影響はエクスタ ーナルの複合状態(composite state)に表される。生成されたコンポーネント のモデルは、モデル化されたコンポーネントの実行を喚起する他のコンポーネン トの解析に用いることができる。図面の簡単な説明 第1図はコンピュータのブロック図である。 第2図は、コンピュータプロセスコンポーネント、そのコンポーネントのリソ ース、及び他のコンポーネントのブロック図である。 第3A図及び第3B図は、本発明の一実施例に基づくリソースのモデル化を表 した状態図である。 第4A図、第4B図、第5A図及び第5B図は、本発明の一実施例に基づくエ クスターナルのモデル化を表した状態図である。 第6図及び第7図は、本発明に基づくリソースチェッカ(resource checker) のブロック図である。 第8図は、本発明に基づく動的検査エンジンのブロック図である。 第9図は、本発明に基づくコンピュータプログラムの解析の論理流れ図である 。 第10図は、第9図の論理流れ図におけるモデルの初期化の論理流れ図である 。 第11図は、本発明の実施例に基づく関数モデル構造体(function model str ucture)のブロック図である。 第12図は、本発明の実施例に基づくエクスターナルモデル構造体(external model structure)のブロック図である。 第13図は、関数モデル構造体及びその関数モデル構造体に関連付けられた2 つのエクスターナルモデル構造体のブロック図である。 第14図は、本発明の実施例に基づく関数構造体(function structure)のブ ロック図である。 第15図は、本発明の実施例に基づくエクスターナルリスト構造体(external list structure)のブロック図である。 第16図は、本発明の実施例に基づく宣言構造体(declaration structure) のブロック図である。 第17図は、本発明の実施例に基づく型構造体(type structure)のブロック 図である。 第18図は、本発明の実施例に基づくフィールド構造体(field structure) のブロック図である。 第19図は、2フィールドのデータオブジェクトのブロック図である。 第20図は、型構造体及び第19図のデータオブジェクトを表す2つのフィー ルド構造体のブロック図である。 第21図は、本発明の実施例に基づくステートメント構造体(statement stru cture)のブロック図である。 第22図は、本発明の実施例に基づく式構造体(expression structure)のブ ロック図である。 第23図は、本発明の実施例に基づく式構造体、関連付けられた宣言構造体及 び関連付けられた項目構造体(item structure)のブロック図である。 第24図は、本発明の実施例に基づく個々のコンピュータプログラムコンポー ネントの解析の論理流れ図である。 第25図は、第24図の論理流れ図中の一過程の論理流れ図である。 第26図は、第24図の論理流れ図に基づくコンピュータプログラムコンポー ネントの繰返し評価の一回分の論理流れ図である。 第27図は、本発明の実施例に基づく項目構造体(item structure)のブロッ ク図である。 第28図は、本発明の実施例に基づくステートメントの解析の論理流れ図であ る。 第29図は、本発明の実施例に基づく式の評価の論理流れ図である。 第30図は、本発明の実施例に基づくエクスターナル構造体のブロック図であ る。 第31図は、本発明の実施例に基づくリソース構造体(resource structure) のブロック図である。 第32図は、本発明の実施例に基づく項目への演算の適用の論理流れ図である 。 第33A図、第33B図、及び第33C図は、本発明の実施例に基づく演算子 の処理の論理流れ図である。 第34図は、本発明の実施例に基づく宣言の処理の論理流れ図である。 第35図は、本発明の実施例に基づく“if”ステートメントの処理の論理流 れ図である。 第36図は、本発明に基づく論理演算子の処理の論理流れ図である。 第37図は、第36図の論理流れ図の一過程の処理の論理流れ図である。 第38図は、第36図の論理流れ図の別の過程の処理の論理流れ図である。 第39図は、本発明の実施例に基づく“return”ステートメントの処理 の論理流れ図である。 第40図は、本発明の実施例に基づく“block”ステートメントの処理の 論理流れ図である。 第41図は、本発明の一実施例に基づくリソースリークの検出の論理流れ図で ある。 第42図は、本発明の実施例に基づくエクスターナルの複合状態の合成の論理 流れ図である。 第43図は、本発明の実施例に基づく関数の解析からの関数モデルの生成の論 理流れ図である。 第44図は、第43図の論理流れ図の一過程の処理の論理流れ図である。 第45図は、本発明の実施例に基づくある項目の値の別の項目への代入の論理 流れ図である。 第46図は、本発明の一実施例に基づく被呼び出しルーチンのエミュレーショ ンの論理流れ図である。詳細な説明 本発明によると、コンピュータプログラム中のエラーは、そのコンピュータプ ログラムによって使用されるリソースをモデル化し、それらのリソースに於いて 発生し得る状態違反(state violation)を検出することによって検出される。 まず、リソースの挙動をリソースの状態と状態遷移とに関して模擬することによ ってリソースをモデル化する。コンピュータプログラムの各コンピュータ命令を 解析し、コンピュータ命令の実行がリソースに及ぼす影響に基づいてリソースの 状態を変化させる。状態違反、即ちリソースの状態に於ける無効な状態及び無効 な状態遷移を検出し、プログラムエラーとして通知する。このようにして、本発 明によるエラー検出はコンピュータプログラムによって定義されたコンピュータ プロセスの挙動を考慮し、それによって従来技術のスタティック チェック法の制約の多くを克服するものである。 各リソースは所定の挙動を有し、それは有効な状態とそれらの状態間の有効な 遷移とに関して記述することができる。コンピュータプログラムに於けるエラー 発生の源は、しばしばコンピュータプログラムの開発者がリソースの所定の挙動 を把握していないことにある。コンピュータプログラム中のコンピュータ命令に よって、リソースの所定の挙動に違反したリソースの使用がコンピュータに指示 されると状態違反が発生する。状態違反の例として、例えば、ファイルの所定の 挙動によれば読み出しをするにはファイルが開かれていなければならない場合に おいて、ファイルを閉じた後のファイルからのレコードの読み出しがある。 コンピュータ100(第1図)には、中央演算装置(CPU)102、メモリ 104、及び入力/出力回路(I/O回路)106が含まれており、これらは全 てバス108を介して互いに接続されている。メモリ104は、磁気ディスクの ような二次記憶装置、ランダムアクセスメモリ(RAM)、読み出し専用メモリ (ROM)を含む任意のタイプのメモリを含み得る。CPU102は、メモリ1 04からコンピュータプロセス110を読み出して実行する。コンピュータプロ セス110は、ライブラリ関数112、動的に割り当てられるメモリ114、及 び第2コンピュータプロセス116に対するアクセスを有する。I/O回路10 6は、ドライバ106A、106B、106C、106D、及び106Eを含ん でおり、これらのドライバはそれぞれビデオモニタ118、二次記憶装置120 、ネットワーク126、ポインティングデバイス(マウス122など)、キーボ ード124を駆動・制御する。 本明細書中では、リソースはコンピュータプロセスによって使用されるコンピ ュータシステムの一部であり、一般に、使用前に割り当てられ、使用後に開放、 即ちフリーにされなければならない。リソースの例とし て、グローバルメモリ、ファイル、ウインドウ、メニュー、及びダイアログ(di alog)がある。コンピュータプロセス110のリソースには、例えば、動的に割 り当てられるメモリ114、コンピュータプロセス116、磁気ディスク120 が含まれる。 また本明細書中において、コンピュータプロセスとはコンピュータによって実 行される一連の過程(step)である。コンピュータプログラムはコンピュータに よって実行されうる一連の命令である。コンピュータプログラムの命令によって 過程が定義され、それらがコンピュータにより実行されると、コンピュータプロ セスが形成される。従って、コンピュータプロセス110の挙動をモデル化する ため、コンピュータプロセス110を定義するコンピュータプログラムの解析が なされる。関数レベルでの解析 コンピュータプログラムは、通常、既に開発されているコンポーネントと新た に開発されるコードとを組合せたものである。本明細書中において、“コード” はソースコード、即ち人間に理解可能な形式の一連のコンピュータ命令、及び/ またはオブジェクトコード、即ちコンピュータに理解可能な形式の一連のコンピ ュータ命令を表す。コンピュータプログラムのコンポーネントとは、特定の部分 プロセスを実行するように既に開発され、通常、その部分プロセスが忠実に実行 されることが試験済みであるコンピュータ命令及び/またはデータ構造の集まり である。部分プロセスとは、コンピュータプロセス中の1または複数の過程であ り、即ちコンピュータプロセスの一部である。コンピュータプログラムの開発者 は、特定の部分プロセスを実行するためこのようなコンポーネントを使用し、通 常、そのコンポーネントを信頼しており、実行時には定められた通りに機能する ものと思っている。そのようなコンポーネントは、開発者が既に開発したコンポ ーネントまたは商業的に入手可能な コンポーネントの実行の要求、即ち呼び出し(call)を含むことができる。その ようにして、コンピュータプログラムの開発に於ける作業の重複が避けられてい る。 新たなコンピュータプログラムは、通常、開発済みのコンポーネントを組み合 わせ、新たに書かれたコンピュータ命令を用いてこれらのコンポーネントを互い に接続することによって開発される。そのような組合せ及び相互接続の結果、他 のコンポーネントまたはコンピュータプログラムによって使用可能な新たなコン ポーネント、または新たなコンピュータプログラムが生成される。あるコンピュ ータプログラムのコンポーネントは、そのコンピュータプログラムによって定義 されるコンピュータプロセスの部分プロセスを定義する。コンピュータプロセス の各部分プロセスは、そのコンピュータプロセスによって用いられるリソースの 状態を変化させ得る。従って、あるコンピュータプロセスによって用いられるリ ソースの状態及び状態遷移を適切に解析するには、コンピュータプログラムのコ ンポーネントによって定義される部分プロセスの実行がリソースの状態に与える 影響を確かめなければならない。例えば、第1コンポーネントによって定義され る第1部分プロセスに於いて割り当てられ、第2コンポーネントによって定義さ れる第2部分プロセスに於いて使用され、第3コンポーネントによって定義され る第3部分プロセスに於いて開放されるリソースの使用を適切に解析するには、 第1、第2、及び第3部分プロセスのリソースに対する影響を解析することが必 要である。 コンピュータプログラムは、様々なコンピュータ言語の何れで書かれていても 良い。典型的なコンピュータ言語は手続き型である。手続き型言語において、コ ンピュータプログラムのコンピュータ命令は編成されてコンポーネントを形成し 、これらのコンポーネントは、しばしば手続 き、または“関数”と呼ばれる。それらは各々実行されたとき特定の部分プロセ スを実行するように設計される。手続き型言語の例として、C、Ada、Pascal、F ortran及びBasicがある。手続き型言語にはオブジェクト指向のものがあり、そ のようなものとして例えばC++やSmallTalkがある。オブジェクト指向コンピュ ータ言語では、関数及びデータ構造が結合されてオブジェクトが形成され、それ らのオブジェクトが更に編成されて“クラス(class)”として知られるコンポ ーネントが形成される。 コンピュータ言語にはグラフィックベースのものがあり、そのようなコンピュ ータ言語では、命令はコンピュータスクリーン上に表示されるグラフィックイメ ージとして表される。プログラマーはそれらのグラフィックイメージをリンクし てコンピュータプログラムを形成する。例えば、ワシントン州レッドモンド(Re dmond,Washington)のマイクロソフト社(Microsoft Corporation)から入手可能 な“Microsoft Visual Basic”は、そのようなグラフィックベースのコンピュー タ言語である。コンピュータ言語には、マイクロソフト社から入手可能な“Micr osoft Word”ワープロソフト用の“Microsoft Word Basic”というコンピュータ 言語や、マサチューセッツ州ケンブリッジ(Cambridge,Massachusetts)のロー タスディベロップメント社(Lotus Development Corporation)から入手可能な “Lotus 1-2-3”表計算ソフト用の“Lotus 1-2-3”マクロ言語のように、特定の ソフトウエア製品を対象としたものもある。本発明は、任意のコンピュータ言語 、即ちリソースが使用される任意のコンピュータ命令プロトコルに適用可能であ る。ソースコードのコンピュータ命令プロトコルについて上記で述べたが、本明 細書中に開示することは、オブジェクトコード形式のコンピュータ命令にも同じ ように適用可能であることを理解されたい。以下に示す例示的な実施形態では、 解析されるコンピュータ言語はCスタンダードに説明されている良く知られたC 言語である。 C言語で書かれたコンピュータプログラムは、通常、いくつかの関数に分割さ れる。関数は、実行されると、入力として0または1以上のパラメータを受け取 り、出力として1つの戻り値項目(returned item)を生成することもあるが、 戻り値項目を生成しないこともある。これらのパラメータ及び戻り値項目はデー タ構造であり、その関数によってアクセス可能なデータを含み、例えばメモリ1 04のようなメモリに格納される。C言語で定義された関数の例を、後にコンピ ュータコードの抜粋(1)に示す。 本明細書中で述べる例示的な実施形態では、コンピュータプログラム内の各関 数は個々に解析される。関数は、その関数のコンピュータ命令によって影響され るその関数のリソース、エスクターナル及び項目の使用及び変化をモデル化する ことによって解析される。関数の項目(item)は、その関数によってアクセス可能 なメモリ(例えばメモリ104)中の位置を表す。項目は型(type)と値(valu e)とを有する。本発明の一実施例においてサポートされる項目の型には、整数 、浮動小数点、及びポインタ(pointer)データが含まれる。項目の値とは、そ の項目によって表されるメモリ内の位置に格納された特定のデータによって表さ れる値である。エクスターナル及びリソースは、関数の各項目に関連付けられ得 る。項目については後により詳細に説明する。変数(variable)が、識別子(id entifier)と1または複数の項目との間を関連付ける。 関数のエクスターナルは、その関数の文脈の外、即ち、その関数の実行の始ま る前またはその関数の実行が終了した後に存在するコンピュータプログラムの一 部を表す。関数のエクスターナルの例には、関数のパラメータ及び戻り値項目、 グローバル定義変数、及びスタティック変数が含まれる。用語(i)“グローバ ル定義変数”及び(ii)“スタテ ィック変数”は、本明細書中では、それぞれ(i)リンケージが“外部的(exte rn)”な変数、及び(ii)リンケージが“内部的(intern)”で格納期間が“ 静的”な変数を表すのに使用される。“ローカル定義変数”はリンケージが“内 部的”で格納期間が“自動的(automatic)”な変数である。リンケージ(linka ge)については、Cスタンダードのセクション6.1.2.2に説明されており 、格納期間(storage duration)についてはCスタンダードのセクション6.1 .2.4に説明されている。簡単に説明すれば、グローバル定義変数は、コンピ ュータプロセスの全部分プロセスに対し定義され、スタティック変数は幾つかの 部分プロセスに対し定義されるが、コンピュータプロセスの全部分プロセスに対 して定義されるとは限らない。 各部分プロセスは幾つかのリソースを使用する。例えば、プロセス110(第 1図)の関数202(第2図)は、動的に割り当てられるメモリ114、及びコ ンピュータプロセス116を使用する。また関数202(第2図)は、(i)関 数202A及び202B及び他の関数によってもアクセス可能なグローバル定義 メモリ204と、(ii)ローカルメモリと、(iii)パラメータ208A〜 208Cと、(iv)戻り値項目210も使用する。関数202は、これらのリ ソースの1または複数をモデル化することによって解析される。 各リソース及びエクスターナルは状態(state)を有する。関数の各コンピュ ータ命令の実行は、コンピュータ命令の実際の実行によって生じるであろうその 関数のリソースまたはエクスターナルの状態の変化をモデル化することによって エミュレートされる。エクスターナルまたはリソースの状態が変化する場合、そ の状態変化はそれぞれ対応するエクスターナル挙動モデルまたはリソース挙動モ デルと比較され、その状態変化がエクスターナルまたはリソースの適切な使用を 反映しているかどう かが判定される。状態変化が不適切である場合は、状態違反が発生し、エラーが 通知される。エラーのユーザへの通知は、(i)エラーメッセージをビデオモニ タ118(第1図)または同様の出力装置に表示することによって、(ii)エ ラーメッセージをメモリ104または二次記憶装置120のエラーログファイル に記録することによって、または(iii)エラーメッセージの表示とエラーメ ッセージの記録を両方とも行うことによって可能である。挙動モデル 関数モデルは、関数をその関数が割り当てる新たなリソース及びその関数のエ クスターナルにその関数が施す演算に関して、抽象して表したものである。 上述したように、リソースは状態を有する。リソースの有効な状態及び有効な 状態間遷移は、リソース挙動モデルによって表される。リソースの挙動のモデル 化は、そのリソースの実際の挙動よりも大幅に簡略化され得る。例えば、リソー スの状態は、状態図300(第3A図)によって表されるリソース挙動モデルに 基づいてモデル化される。状態図300に基づくと、リソースは次の状態の何れ かを取り得る。 状態UとXは似ているが別のものである。未割り当てのリソースに関連付けら れた項目は不定値を有し、無効なリソースに関連付けられた項目は既知の無効値 (invalid value)を有する。リソース挙動モデルは挙動がモデル化されるリソ ースの実際の挙動と同程度に複雑になり得る。しかしながら、状態図300に表 されたような大幅に簡略されたリソース挙動モデルでも、そのようなリソースの 使用に於いて発生し得る全エラーのほとんどを検出する上で有効である。 リソースは最初は割り当てられていないため、状態Uにある。各コンピュータ 命令のエミュレートされた実行(それらを実際に実行するとリソースの状態変化 を引き起こす)によって、リソースに演算(operation)が施される。リソース に演算を施すことによって、リソースの状態は状態図300に従って変化する。 以下にリソースに施すことのできる演算を示す。 このように、状態図300に従うと、未割り当てのリソース、即ち状態Uにあ るリソースに対し、ある関数内の命令によって適確な割り当てがなされる場合、 即ち演算aが施される場合、そのリソースは状態A、即ち割り当てられた状態と なる。しかしながら、未割り当てのリソース、即ち状態Uにあるリソースが計算 に於いて使用される(従って演算cを施される)と、そのリソースは状態Eとな る。状態Eは、プログラミングエラーの結果、状態違反が起こったことを示す。 状態Eはリソースの予め定められた挙動を表すものではなくオプション的なもの であるが、開示する実施例に於いては、状態違反を表す便利な方法として使用さ れる。別の実施例では状態Eは省略され、状態違反は上記の例に於いてリソース が状態Uにあるとき、演算cが定義されないことに注目することによって検出さ れる。 状態図300(第3A図)は表Cのようにまとめられる。 状態図300中の演算識別子に対応している上付の数字、及び表Cに於いて新 たな状態識別子に付されている上付の数字は、特定のエラーを示している。これ らのエラーは、次の表Dに示す通りである。 上述の例では、演算cを状態Uにあるリソースに施すことによって、状態図3 00に於いて状態Uから状態Eへと向かう“c2”によって識別される矢印によ って示されているように、リソースは状態Eに置かれる。このように、この例に 於けるエラーは表Dに示したエラー番号2、即ち未割り当てのリソースの使用で ある。 各関数モデルは、対応する関数の各エクスターナルにどの演算が施されるかを 規定する。例えば、Cスタンダードのセクション7.9.5.3に説明されてい るC言語用に定義された関数fopen () は、2つのパラメータを定め、その うち第1のパラメータは入力として受け取られ、開かれるべきファイルを特定す る。また、開かれたファイルに対応するファイルポインタである戻り値項目を定 める。ファイルポインタ、即ち、型“FILE”の項目を指定するポインタは、 Cスタンダードのセクション7.9.1に説明されておりよく知られている。フ ァイルポインタは関数fopen () のエクスターナルであり、このパラメータ によって特定されるファイルは、このエクスターナルに関連付けられるリソース である。関数fopen () に対する関数モデルは、初期状態が状態Qの新たな リソースが生成されることを定める。このリソースの初期状態は状態Aではなく 状態Qであるが、それは関数fopen () はファイルが正常に開かれることを 保証するものではないからである。 Cスタンダードのセクション7.9.5.1に説明されているC言語用に定義 された関数fclose () は、ファイルポインタであるパラメータを定める。 関数fclose () を実行することによって、そのパラメータが指定するファ イル記述子(file descriptor)を有するファイルが閉じられる。関数fclo se () に対する関数モデルは、関連するファイルが閉じられること、従って開 放されることが反映されるように、そのパラメータに演算kが施されることを定 める。同様に、ファイルに対する読み出し及び書き込み演算を定義するC言語の 関数に対する関数モデルは、ファイルが使用されたことが反映されるように、そ のファイルを表すリソースに演算cが施されることを規定する。 あるリソースに対応する項目(例えば関数fopen () の戻り値項目である ファイルポインタなど)が、決定命令(decision instruction)中で述語(pred icate)として使用される場合、演算pがそのリソースに施され、リソースの状 態は状態図300に基づいて変化される。項目が関係式(例えば演算子の>、< 、<=、>=、及び!=の何れかを含む演算)またはブール式(例えば演算子& &、||、及び!の何れかを含む演算)中にオペランドとして現れる場合、また は項目が“switch”ステートメントに於いて制御式(control expression )として用いられる場合、項目は述語中で用いられることとなる。“switc h”ステートメントはC言語用に定義されており、制御式の値に応じて関数の流 れを制御する。“switch”ステートメントについては、Cスタンダードの セクション6.6.4.2に詳細に説明されている。 あるリソースに対応する項目が計算中で用いられる場合、演算cがリソースに 施され、それにより状態図300に基づいてそのリソースの状態が変わる。項目 が計算中で使用されるのは、(i)数学的演算(例えば+、/、*、または−) に対するオペランドとして現れる場合、また は(ii)リソースがポインタのデリファレンス(dereference)または配列へ のアクセスとして現れる場合、または(iii)リソースが配列指標として現れ る場合である。 ポインタ及び配列については良く知られており、Cスタンダードにも記載され ているが、念のためにポインタ及び配列について以下に簡単に説明する。C言語 の文脈に於いて、ポインタはその値が他の項目のメモリ中のアドレスであるよう な項目である。従って、ポインタは他の項目を“指定(point)”する。ポイン タをデリファレンスすることは、ポインタが指定する項目を検索することである 。 開示される本発明の実施例を具現するべく用いられる以下により詳細に説明さ れるデータ構造は、他のデータ構造を指定するポインタを含むものとして説明さ れる。データ構造を一意に特定するためのポインタ以外の機構も知られているが 、これらの機構は本発明の原理を逸脱することなくポインタの代わりとなり得る ものであることを理解されたい。 配列は、同様の構造の1または複数の項目の集合である。配列の項目はエレメ ントと呼ばれ、順番に番号付けされる。配列へのアクセスは、エレメントの番号 、即ちエレメントの指標を参照することによる配列のエレメントへのアクセスで ある。 演算xは、NULLであるとされる項目に対応するリソースに施される。NU LLは一般に無効値であり、ある項目が有効な値を有していないことを示すため にその項目に代入される。例えば、値がNULLであるポインタは項目の指定を しない。C言語の文脈では、NULLは“false(偽)”を表すブール値で もある。ある項目がNULLと比較されてその比較の結果がtrue(真)であ るとされる場合、その項目はNULLである、即ちNULLの値を有するとされ る。後により詳細に説明するように、関数を解析するには、実行時の関数の特定 の挙動に 関して様々な仮定を設定することが必要である。例えば、関数fopen () は 、正常にファイルを開くか、またはファイルを開くのに失敗するか何れかである 。戻り値項目、即ちファイルポインタがNULLと比較されその結果がtrue であるとされる場合、即ち関数fopen () がファイルを開くのに失敗したと される場合、そのファイルを表すリソースに演算xが施される。これについては 、後により詳細に説明する。本発明の基本的原理を説明するための例 リソースのモデル化の有用性について以下に例を用いて説明する。以下のソー スコード抜粋(1)はプログラミングエラーを含んでおり、開示される本発明の 実施例ではそのプログラミングエラーを検出する。このソースコード抜粋(1) は公知のC言語に適合するものであり、関数example 1 () を定義して いる。ライン番号はC言語の一部ではないが、以下の説明をよりわかりやすくす るために付け加えたものである。 関数example 1 () を解析するとき、エクスターナルを含む 各項目の状態が追跡される。変数“str”はローカルに定義された、即ち関数 example 1 () の文脈内でのみ定義されたものである。変数“str” はライン10で定義されているように、型が“char”であるデータを指定す るポインタである。しかし最初、変数“str”は初期化されておらず特定のデ ータを指定しない。従って、変数“str”はリソースに関連付けられていない 。 Cスタンダードのセクション7.10.3.3に説明されているC言語用に定 義された関数malloc () の実行では、割り当てられるメモリ(例えばメモ リ104(第1図))に対するリクエストを受け付け、そのメモリを割り当てる かまたはその割り当てに失敗する。関数malloc () は、戻り値項目として 、メモリの割り当てに成功した場合は割り当てられたメモリを指定するポインタ を、そうでない場合はNULLポインタをリターンする。このように、関数ma lloc () は初期状態がQである新たなリソースを生成し、その新たなリソー スを関数malloc () の戻り値項目に関連付ける。ライン23で関数mal loc () の戻り値項目の値が代入された後において、変数“str”は、メモ リが割り当てられた場合は新たに割り当てられたメモリを指定し、そうでない場 合はNULLポインタである。 ソースコード抜粋(1)のライン25において、変数“str”は関数fge ts () 内でパラメータとして用いられている。この関数fgets () もCス タンダードのセクション7.9.7.2に説明されているC言語用に定義された 関数である。関数fgets () を実行すると、ソースコード抜粋(1)のライ ン25の文脈において、第1パラメータ、即ち、変数“str”がデリファレン スされる。従って、変数“str”に関連付けられたリソースに対して演算iが 施される。状態図300(第3A図)及び表C、表Dに示されているように、状 態Qのリソ ースに演算iを施すとリソースは状態Aに置かれ、割り当てられているかどうか 不確実なデータがチェックされることなしに使用されたことを示すエラーメッセ ージが生成される。 ソースコード抜粋(1)のライン29において、変数“str”は、変数“s tr”が指定するメモリをフリーにする即ち開放する関数free () にパラメ ータとして渡されている。従って、関数“str”に関連付けられたリソースに 対し演算kが施される。状態図300及び表C、表Dに示されているように、演 算kを状態Aにあるリソースに施すと、リソースは状態Uに置かれる。割り当て られているリソースを開放することは適正であるため、エラーは通知されない。 以下のテキスト(2)は、ソースコード抜粋(1)の関数example 1 () を解析する、開示される本発明の実施例によって生成されるエラーメッセー ジを示したものである。 テキスト(2)において、“example 1.c”は、上記のソースコー ド抜粋(1)を含む、従って関数example 1 () を定義しているファイ ルを表している。関数example 1 () は、ソースコード抜粋(1)のラ イン23において関数malloc () の呼び出し(即ち実行要求)において、 割り当てを要求されるメモリ量に対してメモリが足りないかもしれないというこ とを考慮していない。関数example 1 () の実行時に関数malloc () が要求されたメモリの割り当てに失敗すると、関数example 1 () の実行を含むコンピュータプロセスが突然アボートし、ユーザにはプロセスの予 期されない終了に対する理由も示されないことになる。しかしながら、例えば上 記のテキスト(2)を用いてそのような事態が考慮されていないことを検出し通 知することによって、関数example 1 () の開発者に、関数examp le 1 () 中の欠陥を修正するのに必要な情報が与えられ、そのような事態に 適切に対処することが可能となる。 本発明の有用性は、ソースコード抜粋(1)の関数example 1 () に おけるファイルポインタ“fptr”の状態の追跡について検討することによっ て更に明らかとなる。ファイルポインタ“fptr”は関数example 1 () のローカル定義変数である。ファイルポインタ“fptr”は、型“FIL E”のデータを指定するポインタである。最初、ファイルポインタ“fptr” は初期化されておらず、どのリソースにも関連付けられていない。 ライン14において、関数fopen () の戻り値項目がファイルポインタ“ fptr”に代入される。上述したように、関数fopen () は、初期状態Qの新たなリソースを生成し、その新たなリソースに関数fope n () の戻り値項目を関連付ける。ライン15の“if”ステートメントは、フ ァイルポインタ“fptr”が指定するファイルが正常に開かれたかどうかをフ ァイルポインタ“fptr”と“NULL”とを比べることによって判定する。 ファイルポインタ“fptr”がNULLである場合、ファイルは正常に開かれ ておらず、関数example 1 () は、ユーザにファイルを正常に開くこと ができなかったことを通知して終了する。逆に、ファイルポインタ“fptr” がNULLでない場合は、ファイルポインタ“fptr”が指定するファイルは 正常に開かれていることがわかり、関数example 1 () はライン22へ と進む。ライン15においてファイルポインタ“fptr”の比較をすることに よって、ファイルポインタ“fptr”に関連付けられたリソースに演算pが施 される。従って、ファイルポインタ“fptr”に関連付けられたリソースの状 態は状態Qから状態Aへと変化する。従って、状態図300及び表Cに示されて いるように、計算(演算cの適用)または述語(演算pの適用)のどちらでファ イルポインタ“fptr”を使用しても、エラーメッセージは生成されない。従 って、ファイルポインタ“fptr”の処理に関してエラーは検出されない。 上述したように、関数fopen () 及びmalloc () は、実行時、パラ メータ及び戻り値項目のリソースに対して特定の処理を実行する。関数fope n () やmalloc () のような関数は、コンピュータプロセス110によっ てアクセス可能なライブラリ関数112(第1図)内に含まれる。そのような関 数の呼び出しは、関数202(第2図)に含まれる。本明細書中において、関数 に対する“呼び出し(call)”とは、実行時にCPU102(第1図)のよ うなプロセッサに次のような処理をさせるステートメントである。即ち、(i) 関数に0 または1以上の項目をパラメータとして与え、(ii)関数を実行し、(iii )関数の評価により生じる値を表す戻り値項目(戻り値項目が関数によって定め られる場合)を生成する。第1の関数が第2の関数に対する呼び出しを含んでい る場合、第1の関数は“呼び出し関数(calling function)”と呼ばれる。また、 第2の関数は“被呼び出し関数(called function)”と呼ばれる。 関数202のステートメントによって呼び出される関数の実行によって影響さ れる関数202のリソース(第2図)を適切に解析するため、そのような被呼び 出し関数の挙動を記述する関数モデルがサポートされる。一実施例では、そのよ うな関数モデルは、例えばCスタンダードにあるこのような関数の挙動を定める 公知のテキスト形式の記述から生成され、コンピュータ100のメモリ104内 に格納される。これらの関数モデルはその後コンピュータプログラムの解析に先 立ってメモリ104から検索され取り出される。これについては以下により詳細 に説明する。 以下に、上記のソースコード抜粋(1)の関数example 1 () によっ て呼び出される関数の関数モデルの例を示す。これらの被呼び出関数は全てCス タンダードのライブラリの“stdio”(入力/出力)ヘッダファイルからの ものである。このヘッダファイルはC言語で使用される広く知られたファイルで あり、Cスタンダードのセクション7.9以下に示されている。 開示される本発明の実施例に基づく関数モデルをメモリ104(第1図)にお いて表す関数モデル構造体については、後に詳述する。関数モデル(3)は、関 数malloc () の実行が関数malloc () のエクスターナルの状態に与 える効果について定めている。関数モデル(3)によると、新たなリソースが生 成され、状態Qに初期化され、関数malloc () の戻り値項目に関連付けら れる。また関数モデル(3)は、関数malloc () の第1パラメータ、即ち 、パラメータ0(parameter O)に演算Cが施されることも規定している。 関数モデル(4)は、関数free () の実行が関数free () のエクスタ ーナルに及ぼす効果について規定しており、演算kが引数リスト(argument lis t)の第1パラメータ即ちパラメータ0に施されることを示している。 関数モデル(5)は、関数fgeps () を呼び出すことによって、(i)演 算iがパラメータ0、即ち第1パラメータに施され、(ii)演算cがパラメー タ1、即ち第2パラメータに施され、(iii)演算iがパラメータ2、即ち第 3パラメータに施されることを示している。リソースリークの検出 リソースをモデル化しリソースと関数のエクスターナルとの関連を追跡するこ とによって、開示するエラー検出機構は、リソースリークを検出する有用な機構 を提供する。リソースは、ある関数がそのリソースを割り当てられた状態にした まま終了するとき、即ち、その関数のどのエクスターナルによってもそのリソー スがアクセスできなくなったとき、その関数によって“リーク”される。リーク されると、そのリソースはリークを発生させた関数の実行が終了した後にはその リソースを指定するポインタが保持されないため、使用することができなくなる 。リソースが再使用可能な場合、例えば、動的に割り当てられるメモリ114( 第1図)のような場合、関数の実行の終了前にリソースをフリーにしないと、他 の関数がそのリソースを再使用することができなくなる。ある部分プロセスが動 的に割り当てられるメモリを繰り返しリークさせると、 遂にはその部分プロセス含むコンピュータプロセスに使用可能な全メモリが消耗 される結果となり得る。 リソースリークの検出の例として、ソースコード抜粋(6)の関数examp le 2 () について考えてみる。 変数“str”は関数example 2 () のローカル変数であり、従って 関数example 2 () 以外の関数にはアクセス可能でない。変数“str ”が指定するメモリは、ソースコード抜粋(6)のライン25の“return ”命令の前にフリーにされていないため、このメモリは関数example 2 () をその一部として含むコンピュータプロセス110が終了するまで使用する ことができず、開放または再割り当てをすることもできない。従って、このリソ ースはコンピュータプ ロセス110から“リーク”する。 関数のエクスターナルは関数の実行の終了後も存在する項目であるため、エク スターナルを通じて到達可能(reachable)な割り当てられたリソースはリークさ れない。特定のエクスターナルに関連付けられていないリソースも、ある場合に は、エクスターナルを通じて到達可能である。例えば、項目の配列の特定のエレ メントに関連付けられたリソースは、その項目の配列の別のエレメントであるエ クスターナルを通じて到達可能である。これは、C言語によると、ある配列のエ レメントのメモリ中の位置は、その配列の他のエレメントの位置から計算可能で あるからである。 リークは、関数のトラバース(traversal)の終了時にチェックされる。リーク の検出については後により詳細に説明するので、ここでは簡単に要約する。エク スターナルを通じて到達可能な全てのリソースをマーク(印し付け)する。マー クされず且つ割り当てられているリソースはリークされたものとして通知する。 ライン25において変数“str”はリターンされないため、変数“str”は エクスターナルではない。従って、変数“str”によって指定されるメモリは 、割り当てられており且つ関数example 2 () のトラバースの終了時に マークされていない。よって、変数“str”によって示されるメモリはリーク される。 関数example 2 () の解析によって、次のエラーメッセージが生成さ れる。 従来技術のスタティックチェッカは、リソースリークを検出することができな い。従来技術のランタイムチェッカ(runtime checker)は、関数にリソースリ ークを発生させ得る全ての起こり得るイベントを考慮しないことがしばしばあり 、一般に大きなコンピュータプログラムの文脈の外で単一の関数を解析してその 単一の関数内のリソースリークを検出することはできない。対照的に、開示され る本発明の実施例では、大きなコンピュータプログラムの単一の関数を解析する ことによって、リソースリークが効果的に検出される。以下により詳細に説明す るように、開示するエラー検出機構は、関数がリソースリークを発生させるよう な起こり得るイベントを全て考慮する。従って、本発明は、従来技術に対して大 幅に向上している。エクスターナルの複合状態 以下に詳細に説明するように、関数の解析は、その関数の制御の流れを追い、 その関数の個々のステートメントの実行をエミュレートし、エクスターナル及び リソースの状態を追跡することによってなされる。関数の制御の流れとは、その 関数の特定の実行時に実行されるその関数のコンピュータ命令の特定の順番であ る。制御が第1コンピュータ命令から第2コンピュータ命令へと移るとき、第2 コンピュータ命令は第1コンピュータ命令の実行に続いて実行される。関数の制 御の流れは、しばしば本明細書中では、関数の制御流れ経路と呼ばれる。関数の 制御の流れは、しばしば、コンピュータプロセスに於いてその関数によって定義 される部分プロセスの実行中に発生する特定のイベントに依存する。 関数の解析においては、関数の全ての可能な制御流れ経路を考慮する ことが望ましい。従って、関数の制御流れ経路に影響を与えうる全てのイベント を考慮することが望ましい。従来技術のスタティックチェッカは、しばしば、制 御流れ経路を全く考慮しない。ランタイムチェッカは、関数の制御流れ経路に影 響を与えるイベントを操作することによって、コンピュータプロセスの実行中に そのコンピュータプロセスが各制御流れ経路をたどるようにユーザが強制し得る 範囲に於いて、特定の関数の制御流れ経路を考慮するのみである。一方、開示さ れるエラー検出機構は、ユーザが介入することなく、自動的に関数の各制御流れ 経路の解析を行う。更に、開示するエラー検出機構は、関数の解析をその関数を 含むコンピュータプロセスまたはコンピュータプログラムの文脈の外で行うこと ができる。従って、個々の関数を、より大きな関数またはコンピュータプログラ ムまたはプロセス中に組み込む前にエラーに対してより完全にチェックすること ができる。 例として、ソースコード抜粋(6)の関数example 2 () について考 えてみる。関数example 2 () の正確な制御流れ経路は、関数exam ple 2 () をコンピュータプロセス内で実行するまでは未知である。例えば 、ライン14に於いて呼び出される関数malloc () がリクエストされた通 りにメモリを割り当てるのに成功した場合、制御は、ライン16の“if”ステ ートメントからライン19の関数fopen () の呼び出しへと流れる。言い換 えると、ライン14で呼び出されたとき関数malloc () がリクエストされ た通りに正常にメモリを割り当てる場合、ライン19の関数fopen () の呼 び出しは、ライン16の“if”ステートメントの実行の後に続く。逆に、メモ リの割り当てが失敗した場合、制御はライン16の“if”ステートメントから ライン17の“return”ステートメントへと流れる。ライン14に於いて 呼び出されたとき関数malloc () によ るメモリの割り当てが正常になされるかどうかは、通常、コンピュータプロセス に於いて関数example 2 () が実行されるまでわからない。 関数example 2 () の解析に於いて、関数example2 () の全 ての制御流れ経路が考慮されることが望ましい。様々に仮定を変えて関数を何度 もトラバースすることによって、複数の制御流れ経路が考慮される。例えば、関 数example 2 () は、一度はライン14で呼び出される関数mallo c () がリクエストされたメモリを正常に割り当てるという仮定の下で、一度は 関数malloc () がリクエストされたメモリの割り当てに失敗するという仮 定のもとでトラバースされる。 後に詳細に説明する本発明の一実施例では、一つの関数に対し繰り返しトラバ ースがなされ、各トラバースに於いて、ランダムに仮定が設定される。関数ex ample 2 () の各トラバースは、関数example 2 () のエクスタ ーナルの状態を追跡する。各エクスターナルは、関数example 2 () の 複数回のトラバースの結果得られる各エクスターナルの幾つかの状態を反映する 複合状態(composite state)を有する。 エクスターナルは、複合RS、CP及びDK状態を有する。これらの複合状態 は、2つの目的に用いられる。即ち、(i)関数の様々な制御流れ経路を考慮し たとき不整合を生じるエクスターナルの使用を検出するため、(ii)関数の実 行がその関数のエクスターナルに与える影響を記述する関数モデルを構築するた め、に用いられる。構築された関数モデルは、その後、モデル化された関数を呼 び出す他の関数を解析するのに用いることができる。 ある特定の関数の文脈内で、各エクスターナルはCP状態、DK状態、 及びRS状態を有する。エスクターナルのCP状態は、使用される前にエクスタ ーナルがチェックされるかどうかを判定するのに用いられる。“CP”という用 語は、主として関心のある演算、即ち、演算p(エクスターナルのチェックを表 す)の前の演算c(エスクターナルの使用を表す)、からきている。エクスター ナルのDK状態は、関数によってエスクターナルの割り当て及び/または開放が なされるかどうかを判定するのに用いられる。“DK”という用語は、DK状態 の目的、即ち、リソースがキル(“K”)される、即ち開放される前に定義(“ D”)されるかどうかを判定するという目的から使用されている。エスクターナ ルのRS状態は、そのエクスターナルにリソースが関連付けられている場合に、 関連付けられているリソースの状態である。“RS”という用語は、リソース( “R”)状態(“S”)からきている。 ある関数の各エクスターナルは、その関数の複数回のトラバースの結果生じる 複数のCP、DK、及びRS状態をそれぞれ反映する複合CP状態、複合DK状 態、及び複合RS状態を有する。繰り返しなされる関数の各トラバースの後にお いて、エクスターナルの新たな複合RS状態が求められるが、以下により詳細に 述べるように、エクスターナルの新たな複合RS状態は、そのエクスターナルの 前の複合RS状態と、その関数の最も新しいトラバースの結果生じるそのエクス ターナルに関連付けられたリソースのRS状態とから求められる。同様に、以下 により詳細に述べるように、新たな複合CP及びDK状態は、前の複合CP及び DK状態と、関数の最も新しいトラバースの結果生じるCP及びDK状態とから それぞれ求められる。 状態図350(第3B図)は、複合RS状態に対する状態及び状態遷移を表し ている。状態図350に於いて矢印は、関数のトラバースの結果生じるRS状態 に基づく、前の複合RS状態からの複合RS状態遷移 を表す。状態図350は表Eのようにまとめられる。 状態図400(第4A図)は、エスクターナルのCP状態に対する状態及び状 態遷移を表す。状態図400に於いて矢印は、演算を施した結果生じるCP状態 遷移を表す。エクスターナルは次のCPまたは複合CP状態を有し得る。 エスクターナルに施すことのできる演算は、表Bを参照して上記に示した通り である。状態図400は、以下の表Hにまとめられる。 状態図450(第4B図)は、エクスターナルの複合CP状態に対する状態及 び状態遷移を表している。状態図450で使用されている矢印は、関数のトラバ ースの結果生じるCP状態に基づく、前の複合CP状態からの複合CP状態の遷 移を表す。状態図450は以下の表Iにまとめられる。 状態図500(第5A図)は、エスクターナルのDK状態に対する状態及び状 態遷移を表している。状態図500に於いて矢印は、演算を施した結果生じるD K状態遷移を表すのに使用されている。エスクターナルは、エスクターナルに関 連付けられるリソースに関数の実行が与える効果を反映する、以下のDKまたは 合成DK状態を有し得る。 エクスターナルに施すことのできる演算は、表Bを参照して上述した通りであ る。状態図500は以下の表Kにまとめられる。 状態図550(第5B図)はエクスターナルの複合DK状態に対する状態及び 状態遷移を表す。状態図550に於いて矢印は、関数のトラバースから生じるD K状態に基づく、前の複合DK状態からの複合DK状態遷移を表すのに使用され ている。状態図550は以下の表Lにまとめられる。 上記のソースコード抜粋(6)の関数example 2 () は、エクスター ナルの複合状態の有用性を示す例となる。 上述したように、関数example 2 () の制御の流れは、エミュレーシ ョンによる関数の実行時のイベントに関連して設定される仮定に依存して複数の 経路の内の何れかを通る。例えば、変数“str”がNULLでない場合は、ラ イン16の“if”ステートメントの後に、ライン17の“return”ステ ートメントが続き、そうでない場合はライン19の式が続く。関数exampl e 2 () の戻り値項目は、関数example 2 () のエクスターナルであ る。関数example 2 () の戻り値項目への代入は、関数example 2 () の特定のトラバースに於いて設定される特定の仮定にのみ基づいて、ソ ースコード抜粋(6)のライン17、ライン25またはライン29に於いてなさ れる。 ライン17またはライン25では、戻り値項目にリソースは関連付けられない 。従って、ソースコード抜粋(6)のライン17またはライン25の何れかを通 って制御が流れるような関数example 2 () のトラバースの後において 、戻り値項目を表すエスクターナルの複合RS状態は状態Uとなる。続いて、制 御がライン29を通るように関数e xample−2 () をトラバースすると、戻り値項目を表すエクスターナルは 、関数example 2 () 内で生成されたリソースに関連づけられ、適確に 割り当てられる。即ち、状態Aとなる。ソースコード抜粋(6)のライン16乃 至17により、関数malloc () の実行によってメモリが正常に割り当てら れないというイベントに対して取られるべき動作が適切に記述されているため、 リソースの適確な割り当てがなされるのである。 状態図350(第3B図)に示されているように、前の複合RS状態が状態U で次のRS状態が状態Aであるようなエクスターナルは、状態Qの新たな複合R S状態を有する。これは、関数example 2の実行によって、その戻り値 項目が指定するメモリの割り当てがなされ得るが、必ずしも割り当てがなされる というわけではないということを反映している。従って、関数example 2の挙動を記述する関数モデルを形成するとき、関数example 2の戻り 値項目は、初期状態が状態Qである新たに生成されるリソースに関連付けられる ものとして記述される。 また、複合状態を用いて、関数によるエクスターナルのつじつまのあわない使 用を検出することができる。例えば、ある関数が、エクスターナルが割り当てら れた状態、即ち状態AのRS状態で終了し、その関数のその後のトラバースに於 いて、その関数が同じエクスターナルを開放した状態で、即ち状態KのRS状態 で終了する場合、そのエスクターナルの複合RS状態は状態Eとなる。これはエ ラーとみなすことができる。なぜなら、一般に、呼び出し関数がある場合の実行 においてはあるエクスターナルに関連付けられたリソースの割り当てをすること を求め、別の場合の実行においては同じエクスターナルに関連付けられたリソー スを開放することを求めるということは考えられないからである。コンピュータプログラムの解析 コンピュータプログラム610(第6図)の解析は、本発明に基づいて、本明 細書中に説明するように、コンピュータプログラム610によって定められたリ ソースの使用を解析するリソースチェッカ(resourcechecker)602によって なされる。開示する実施例では、リソースチェッカ602は、バス108を介し てCPU102に接続されたメモリ104から読み出されてCPU102におい て実行されるコンピュータプロセスである。 コンピュータプログラム610の本発明に基づく解析を、論理流れ図900( 第9図)に示す。プロセスはステップ902において開始される。例えばキーボ ード124(第1図)やマウス122を用いてユーザが入力するコマンドによっ て、コンピュータプログラム610が解析される環境特性が特定され、コンピュ ータプログラム610(第6図)の解析が開始される。ユーザによって変更可能 な環境特性には、(i)検出するべきエラーのタイプ、(ii)通知するべきエ ラーの最大数、(iii)解析するべき関数の最大数、(iv)各関数のトラバ ースの繰り返しの最大回数、及び(v)関数の全ての可能な制御流れ経路をトラ バースするための特定の方法などがある。 プロセスは、ステップ902(第9図)からステップ904に進み、そこでリ ソースチェッカ602(第6図)は、コンピュータプログラムによって使用され る様々な関数の実行がリソースに与える影響を記述する関数モデルを初期化する 。リソースチェッカ602はモデルパーザ702(第7図)を含んでおり、モデ ルパーザ702は、モデル記述ファイル604(第6図)からモデルを読み出し 、読み出したモデルから後述する関数モデル構造体を構築する。リソースチェッ カ602において関数モデル構造体を生成することによって、関数モデルが初期 化される。 ステップ904(第9図)については、後に論理流れ図904(第10図)を参 照してより詳細に説明する。 プロセスはステップ904(第9図)からステップ906に進み、そこでリソ ースチェッカ602の一部であるプログラムパーザ704(第7図)は、コンピ ュータプログラム610(第6図)を読み出してきて、従来の技術を用いて、コ ンピュータプログラム610が従う言語に基づきパージング(parsing)を行う 。プログラムパーザ704(第7図)はコンピュータプログラム610(第6図 )をパージングして、より小さなプログラムコンポーネント、例えば関数、に分 解する。ステップ906(第9図)では、1つの関数がコンピュータプログラム 610(第6図)からパージングにより抽出され、抽出されたその関数を表す関 数構造体が、後に詳述する動的検査エンジン(dynamic inspection engine)7 06に送られる。別の実施例では、後述するプリプロセッサがコンピュータプロ グラム610をパージングし、パージングにより抽出されたコンピュータプログ ラム610内の複数の関数を表現する複数の関数構造体が格納される。この別の 実施例では、プログラムパーザ704は関数構造体を一つ取り出しては、取り出 した関数構造体を動的検査エンジン706に送る働きをする。プロセスはステッ プ906(第9図)からステップ908に進む。 ステップ908において、リソースチェッカ602の一部である動的検査エン ジン706(第7図)によって、“サブジェクト関数(subjectfunction)”、 即ちステップ906(第9図)においてプログラムパーザ704によって動的検 査エンジン706に送られた関数構造体によって表される関数、の解析がなされ る。言い換えると、サブジェクト関数の実行の結果コンピュータプログラム61 0によって使用されるリソースに生じる効果が求められ、サブジェクト関数の実 行によって影響され る各リソースの状態遷移が解析される。これについては後により詳細に説明する 。ステップ904において初期化された関数モデルが、サブジェクト関数のエク スターナル、リソースの状態及び状態遷移を解析するのに用いられる。検出され た状態違反はプログミングエラーとして通知される。 サブジェクト関数の挙動が、そのエクスターナル及びリソースに関して定めら れると、モデルパーザ702はモデル記述ファイル604内にサブジェクト関数 の挙動を記述する関数モデルを形成し格納する。ステップ908(第9図)につ いては、論理流れ図908(第24図)を参照して後により詳細に説明する。 プロセスは、ステップ908(第9図)からテストステップ910に進み、そ こでプログラムパーザ704(第7図)は更にコンピュータプログラム610( 第6図)をパージングして、コンピュータプログラム610に、ステップ908 (第9図)に基づいて動的検査エンジン706(第7図)によって解析されるべ き関数がまだ含まれているかどうか判定する。上述した別の実施例では、プログ ラムパーザ704(第6図)は、ステップ908(第9図)に基づいて動的検査 エンジン706(第7図)によって解析されなければならないコンピュータプロ グラム610の関数を表す関数構造体がまだあるかどうか判定する。動的検査エ ンジン706(第7図)がまだ処理していないコンピュータプログラム610の 関数を表す関数構造体がある場合、プロセスはステップ906(第9図)に進み 、そこでプログラムパーザ704(第6図)は、その関数構造体を上述したよう に動的検査エンジン706(第7図)に送る。動的検査エンジン706(第7図 )がコンピュータプログラム610の関数を表す関数構造体を全て処理し終わっ ている場合は、プロセスは論理流れ図900に従って終了する(第9図)。モデルの初期化 論理流れ図900のステップ904(第9図)を参照して上述したように、関 数の挙動を記述する関数モデルは初期化される。ステップ904を、論理流れ図 904(第10図)に詳細に示す。プロセスはステップ1002において開始さ れ、上述したような関数モデルを含むモデル記述ファイル604(第6図)が開 かれる。 一実施例では、関数モデルはテキスト形式で格納され、読み込まれ、そしてメ モリ104(第1図)内の後に詳述するデータ構造内に格納される。関数モデル は、関数を識別する情報と、関数のエクスターナルに対するエクスターナルモデ ルのシングルリンクトリスト(singly-linkedlist)とを含む。関数を識別する 情報には(i)関数名、(ii)関数が定義されているソースコードファイルの 名前、(iii)関数の定義が始まるソースコードファイル中のテキストライン の番号、及び(iv)関数の簡単な説明が含まれる。ソースコードファイルは、 メモリ104(第1図)(通常、磁気ディスクのような二次記憶装置)に格納さ れた、コンピュータプログラム610のようなコンピュータプログラムを格納す るファイルである。シングルリンクトリストの形態で格納されたエクスターナル モデルは、関数の実行が関数のエクスターナルに与える影響を、これらのエクス ターナルに施される演算と、それらのエクスターナルに関連して生成されるリソ ースとに関して定めるものである。 エクスターナルモデルは、エクスターナルの型を特定する情報、エクスターナ ルを識別する情報、及び関数の実行がエクスターナルに与える影響を定める情報 を含む。エクスターナルを識別する情報は、エクスターナルがパラメータの場合 はパラメータ番号(parameter number)、エクスターナルがグローバルまたはス タティック変数の場合は変数名、エクスターナルが戻り値項目である場合はNU LLである。関数の実行が エクスターナルに与える影響を定める情報には、(i)エクスターナルに施され る演算のリスト、(ii)エクスターナルに関連して新たなリソースが生成され るかどうかを示すフラグ、及び(iii)新たなリソースが生成される場合、そ の新たなリソースの初期状態が含まれる。 モデル記述ファイル604(第6図)に格納されているモデルのテキスト書式 は、以下の“Backus-Naur Form(BNF)”定義(8)に従う。“Backus-Naur Form”は形式的言語を記述するためのよく知られた書式である。 関数モデルは、テキスト書式においては、BNF定義(8)のノンターミナル <function−spec>によって表される。BNFにおいて、ターミナ ル(terminal)とは、ある特定のBNF定義においてそれ以上拡張されない項目 であり、一方ノンターミナル(non-terminal)とは更に拡張される項目である。タ ーミナル<function−name>は、関数に割り当てられる識別予、即 ち関数モデルによって表された関数を他の関数が呼び出すとき使用する識別子で ある。ターミナル<function−name>は、関数の定義に使われるコ ンピュータ言語において有効な関数識別子であればどのようなものでもよい。タ ーミナル<defining−file>は、関数の定義がなされるソースコー ドファイルを英数字で識別するものである。このような英数字による識別として 、例えばソースコードファイルのパスを記述してもよい。ターミナル<defi ning−line>は、負でない数字、即ち0乃至9の数字を用いたテキスト 表現によって、ターミナル<def ining−file>によって識別されるソースコードファイルのどのテキス トラインにおいてモデル化される関数の定義が始まるのかを特定するものである 。 BNFでは、オプション項目は、角型括弧(“[]”)で囲って表される。従っ て、ターミナル<function−prefix>、ターミナル<defin ing−file>、<defining−line>、及び<descrip tion>は、オプションである。また、連続したスラッシュ記号(“//”) はコメント文の開始を表すものであり、これらのスラッシュ、及びこれらのスラ ッシュの後にそのテキストラインの最後まで続くテキスト文は、BNF定義の一 部とはみなされないことに注意されたい。 BNF定義(8)のターミナル<description>は、1または複数 のキャラクタ(即ち、文字、数字、及び/またはシンボル)の並びである。ター ミナル<description>はリソースチェッカ602(第6図)によっ ては使用されないが、テキスト書式で表されたモデルを読むユーザの便宜及び理 解のために提供されるものである。BNF定義(8)のターミナル<param −number>は、0乃至9の数字を用いた負でない整数のテキスト表現であ り、パラメータリスト中の特定のパラメータを指定するものである。パラメータ ゼロが、関数の呼び出しにおけるパラメータリストの中の最初の、即ち最も左側 のパラメータである。後続のパラメータには順番に番号が付される。BNF定義 (8)のターミナル<var−name>は、変数の識別子である。 モデル記述ファイル604(第6図)から抽出される関数モデルは、それぞれ 、各関数の実行がその関数のエクスターナルに及ぼす影響を記述する。プロセス はステップ1002(第10図)からループステップ 1004に進み、モデル記述ファイル604(第6図)に格納されている各関数 モデルは、ループステップ1004(第10図)とNEXTステップ1004と によって定められるループに従って取り出され処理される。ループの各繰り返し において、処理されている関数モデルは、現関数モデル(current function mod el)と呼ばれる。ループステップ1004とNEXTステップ1014とによっ て定められるループに従って、モデル記述ファイル中に格納された全ての関数モ デルの処理が完了すると、プロセスはループステップ1004からステップ10 06に進み、モデル記述ファイル604(第6図)は閉じられ、論理流れ図90 4(第10図)に基づくプロセスは終了する。 モデル記述ファイルから取り出される各関数モデルに対し、プロセスはループ ステップ1004からステップ1008に進み、そこで上述したBNF定義(8 )のノンターミナル<function−prefix>に対応する現関数モデ ルの一部が、現関数モデルから分離される。プロセスはステップ1010に進み 、そこで関数モデル構造体が初期化されて、ステップ1008において現関数モ デルから分離された情報が関数モデル構造体に格納される。 関数モデル構造体1100(第11図)は、フィールド“name”1102 、フィールド“file”1110、フィールド“line”1112、及びフ ィールド“description”1108を含んでいる。BNF定義(8) のターミナル<function−name>、<defining−file >、<defining−line>、及び<description>(これ らは全てノンターミナル<function−prefix>の部分である)に 対応する関数モデルの部分が関数モデルから抽出され、関数モデル構造体110 0のフィールド“name”1102、フィールド“file”1110、フィ ールド“line”1112、及びフィールド“description”11 08にそれぞれ格納される。プロセスはステップ1010(第10図)からルー プステップ1012に進む。 ループステップ1012とNEXTステップ1028とによってループが定め られており、その各繰返しにおいて、上述したBNF定義(8)のノンターミナ ル<extern−list>に対応する関数モデルの部分に示されたエクスタ ーナルの処理がなされる。ループステップ1012とNEXTステップ1028 とによって定められたループの各繰返しにおいて処理されているエクスターナル は、サブジェクトエクスターナルと呼ばれる。現関数モデル中に定められた全エ クスターナルの処理がループステップ1012とNEXTステップ1028とに よって定められたループに従って終了すると、プロセスはループステップ101 2からNEXTステップ1014へ進む。プロセスはNEXTステップ1014 からループステップ1004へと進み、モデル記述ファイル604(第6図)か ら取り出された別の関数モデルが更に処理されるか、あるいは全ての関数モデル が処理されている場合は、上述したように、プロセスはステップ1006(第1 0図)へと進む。 BNF定義(8)のノンターミナル<extern−Iist>に対応する現 関数モデルの部分に示された各エクスターナルに対し、プロセスはループステッ プ1012からステップ1016へと進む。ステップ1016では、例えばエク スターナルモデル構造体1200(第12図)のような、新たなエクスターナル モデル構造体が生成される。 エクスターナルモデル構造体1200は、フィールド“equivalent ”1202、フィールド“type”1204、フィールド“paramete r number”1206、フィールド“name”1208、フィールド“ next”1210、フィールド“numbe r of operations”1212、フィールド“operation s”1214、フィールド“new resource”1218、フィールド “initial state”1220、及びフィールド“descript ion”1222を含んでいる。ステップ1016(第10図)では、BNF定 義(8)のノンターミナル<external>の定義内のターミナル<par am−number>に対応するサブジェクトエクスターナルモデルの部分が、 サブジェクトエクスターナルモデルから取り出され、エクスターナルモデル構造 体1200のフィールド“parameter number”1206(第1 2図)に格納される。 一実施例では、フィールド“equivalent”1202が用いられて、 第2のエクスターナルモデル構造体が特定される。そうすることによって、エク スターナルモデル構造体1200が、第2のエクスターナルモデル構造体に関係 付けられる。例えば、関数の戻り値項目が第1パラメータである場合、そのよう にすることが適切であろう。本明細書中に開示する実施例では、フィールド“e quivalent”1202は使用されず、従ってこのフィールドはNULL 値に初期化される。ステップ1016(第10図)から、プロセスはステップ1 018へと進む。 ステップ1018では、サブジェクトエクスターナルモデルによって表された エクスターナルの型を定める、BNF定義(8)のノンターミナル<exter n−type>に対応するサブジェクトエクスターナルモデルの部分が、サブジ ェクトエクスターナルモデルから抽出される。上記のBNF定義(8)に示され ているように、エクスターナルモデルによって表されるエクスターナルは、戻り 値項目、パラメータ、あるいはグローバル定義/スタティック変数であり得る。 サブジェクトエクス ターナルモデルによって表されたエクスターナルの型を示すデータは、エクスタ ーナルモデル構造体1200のフィールド“type”1204(第12図)に 格納される。プロセスはステップ1018(第10図)からループステップ10 20へと進む。 上記のBNF定義(8)に示されているように、関数の実行は、その関数の各 エクスターナルに1または複数の影響または“結果(result)”を与え得る。各結 果はBNF定義(8)においてノンターミナル<result>として表される 。1または複数の結果がノンターミナル<result−list>に含まれる 。ループステップ1020とNEXTステップ1024とによって定められるル ープにおいて、サブジェクトエクスターナルモデルのノンターミナル<resu lt−list>のリスト内の各結果の処理がなされる。ループステップ102 0とNEXTステップ1024とによって定められるループの繰返しにおいて、 処理されている結果を、処理対象結果(subject result)と呼ぶ。以下に述べる ように、サブジェクトエクスターナルモデルの全ての結果をループステップ10 20とNEXTステップ1024とによって定められるループに基づいて処理す ると、プロセスはループステップ1020からステップ1026へ進む。 サブジェクトエクスターナルモデルに対する各結果に対し、プロセスはループ ステップ1020からステップ1022に進む。ステップ1022において、処 理対象結果がサブジェクトエクスターナルモデルから抽出される。この結果は、 エクスターナルモデル構造体1200(第12図)のようなエクスターナルモデ ル構造体に格納される。例えば、上記で定義した関数モデル(3)は、第1エク スターナル、即ち戻り値項目に対し1つの結果を、第2エクスターナル、即ちパ ラメータ0に対し1つの結果を定めている。戻り値項目の結果は‘(new Q “me mory”)’と定められており、戻り値項目に対し新たなリソースが生成され ること、そのリソースの初期状態は状態Qであることが示され、更に、そのリソ ースの簡単な説明として“memory(メモリ)”が与えられている。従って 、この戻り値項目に対するエクスターナルモデルをエクスターナルモデル構造体 1200が表現する場合、(i)フィールド“new resource”12 18が“true”のブール値に設定され、新たなリソースが生成されることが 示され、(ii)新たなリソースの初期状態が状態Qであることを示すようにフ ィールド“initial state”1220がセットされ、(iii)テ キスト“memory“がフィールド“despription”1222に格 納される。 第2の例として、上記の関数モデル(3)は、第2エクスターナル、即ちパラ メータ0に対して結果“(op c)”を定めている。結果“(op c)”は、エ クスターナルに演算Cが施されることを表す。従って、エクスターナルモデル構 造体1200がパラメータ0に対するエクスターナルモデルを表す場合、初期値 として0を有するフィールド“number of operations”1 212がインクリメント(1増加)され、演算識別子“c”が、フィールド“n umber of operations”1212によって示される位置に対 応するフィールド“operations”1214に格納される。この例では 、フィールド“number of operations”1212は値1を 格納し、フィールド“operations”1214内の最初の演算識別子は 演算cの識別子となる。もし、第2の演算が第2のエクスターナルに施されると すると、フィールド“number of operations”1212は もう一度インクリメントされ値2となり、フィールド“operations” 1214内の第2の演算識別 子が第2の演算の識別子となる。 プロセスはステップ1022(第10図)からNEXTステップ1024を介 して上述したループステップ1020へ戻る。上述したようにプロセスは、サブ ジェクトエクスターナルモデルに対する全ての結果の処理が終了すると、ループ ステップ1020からステップ1026に進む。 ステップ1026では、サブジェクトエクスターナルモデルを表すエクスター ナルモデル構造体が、現関数モデル構造体内のエクスターナルのシングルリンク トリストに加えられる。上記の関数モデル(3)の文脈において説明する。まず 、関数モデル構造体1100Aのフィールド“first external” 1004A及び“last external”1106Aにエクスターナルモ デル構造体1200Aを指定するポインタを格納することによって、エクスター ナルモデル構造体1200A(第13図)が関数モデル構造体1100Aに付け 加えられる。続いて、エクスターナルモデル構造体1200Aのフィールド“n ext”1210A及び関数モデル構造体1100Aのフィールド“last external”1106Aに、第13図に示すようにエクスターナルモデル 構造体1200Bを指すポインタを格納する(フィールド“last exte rnal”1106Aに前に格納されたポインタは取って代わられる)ことによ って、第2エクスターナルモデル構造体1200Bが関数モデル構造体1100 Aに加えられる。 プロセスはステップ1026(第10図)からNEXTステップ1028を介 してループステップ1012へと進む。上述したように、全エクスターナルモデ ルが処理されていると、プロセスはループステップ1012からNEXTステッ プ1014を介してループステップ1004へ進む。上述したように、全関数モ デルの処理が終了していると、プロ セスはループステップ1004からステップ1006へ進み、上述したようにテ キストフォーマットで記載された関数モデルを含むファイルが閉じられる。論理 流れ図904に基づくプロセスは、ステップ1006の後終了する。関数の内部表現 プログラムパーザ704(第7図)によってコンピュータプログラム610( 第6図)のパージングがなされると、コンピュータプログラム610はメモリ1 04において一連の関数構造体によって表される。上述した別の実施例では、プ ログラムパーザ704は、コンピュータプログラム610から、例えばC言語の ような特定のコンピュータ言語に従うソースコンピュータプログラムを予めパー ジングすることによって形成された関数構造体を取り出す働きをする。ソースコ ンピュータプログラムはソースコードプリプロセッサによってパージングされる が、このソースコードプリプロセッサは、ソースコンピュータプログラムが従う コンピュータ言語に基づいてソースコンピュータプログラムのパージングを行い 、コンピュータプログラム610中にソースコンピュータプログラム内に定義さ れた関数を表す関数構造体を形成し格納するものである。このソースコードプリ プロセッサ(図示せず)はリソースチェッカ602とは別個のコンピュータプロ セスである。 この別の実施例では、ソースコードプリプロセッサはマサチューセッツ州、ケ ンブリッジ(Cambridge,Massachusetts)の“Free Software Foundation,Inc ”から入手可能な“GNU C Compiler”に基づくものである。本明細書の一部であ り、全体が本出願に引証として含まれる付録Bとして示されているコンピュータ 命令のリストは、抽出されたコンピュータプログラムの関数を、ソースコードプ ロセッサから、抽出された関数を表すための後に詳述するデータ構造へと移すた めのデータ構造及 び関数を定義したものである。一実施例では、公知の上記した“GNU C Compiler ”のような従来のコンパイラが用いられてコンピュータプログラムのパージング がなされ、パージングされたプログラムは、付録Bに定義されているようなデー タ構造中に表される。 以下に、関数構造体について説明する。関数構造体内のフィールド及び関係に ついて理解を深めることによって、以下の動的検査エンジン706(第7図)の 処理に対する説明がより容易となる。 関数構造体1400(第14図)は、コンピュータプログラム610、または 上述したような別の実施例ではソースコードプログラム、によって定められた関 数を表すものであり、(i)フィールド“name“1402、(ii)フィー ルド“line”1404、(iii)フィールド“file”1406、(i v)フィールド“result”1408、(v)フィールド“externa ls”1410及び(vi)フィールド“statement”を含んでいる。 関数構造体1400のフィールド“name”1402は、関数構造体1400 によって表される関数の識別予を特定する。例えば、上記のソースコード抜粋( 1)の関数example 1 () の識別子は“example 1”である。 フィールド“file”1406及びフィールド“line”1404は、そ れぞれ、関数構造体1400によって表される関数が定義されるソースコードフ ァイル及びそのファイル内のライン番号を示す。例えば、上記のソースコード抜 粋(1)が、ファイル名“example 1.c”のソースコードファイルの 全内容であるとした場合、関数example 1 () を表す関数構造体のフィ ールド“file”1406及びフィールド“line”1404は、それぞれ 、テキスト“example 1.c”及び整数値7のデータを格納する。 フィールド“result”1408は、宣言構造体1418を指定する。こ の宣言構造体1418は、以下に述べる宣言構造体1506と同様であり、関数 構造体1400によって表される関数がリターンする結果(result)の型 を規定する。例えば、上記のソースコード抜粋(1)の関数example 1 () は、ソースコード抜粋(1)のライン7に示されているように、整数型の結 果をリターンする。即ち、型“int”のデータをリターンする。従って、関数 構造体1400が関数example 1 () を表す場合、フィールド“res ult”1408は、整数データを規定する宣言構造体1418を指定する。 関数構造体1400のフィールド“externals”1410は、後によ り詳細に説明するエクスターナルリスト構造体1414を指定するポインタであ る。後に詳述するように、エクスターナルリスト構造体1414のようなエクス ターナルリスト構造体は、複数のエクスターナルリスト構造体をシングルリンク トリスト(singly-linked list)を形成するようにリンクするのに用いられるポ インタを含んでいる。従って、リストの長さが1の場合も含み、一つのエクスタ ーナルリスト構造体を指定することは、エクスターナルリスト構造体のシングル リンクトリストを指定することである。関数構造体1400のフィールド“ex ternals”1410によって指定されるこのようなシングルリンクトリス トは、関数構造体1400によって表される関数のエクスターナルを表すエクス ターナルリスト構造体を含む。 関数構造体1400のフィールド“first stmt”1412は、後に より詳細に説明するステートメント構造体1416を指定するポインタである。 後により詳細に説明するように、ステートメント構造体1416のようなステー トメント構造体は、複数のステートメント構造体をシングルリンクトリストを形 成するようにリンクするのに用いら れるポインタを含んでいる。従って、リストの長さが1の場合も含み、一つのス テートメント構造体を指定することは、ステートメント構造体のシングルリンク トリストを指定することである。関数構造体1400のフィールド“first stmt”1412によって指定されるこのようなシングルリンクトリストは 、関数構造体1400によって表される関数のステートメントを表すステートメ ント構造体を含む。エクスターナルリスト構造体 エクスターナルリスト構造体1414を第15図に詳細に示す。エクスターナ ルリスト構造体1414は、関数構造体1400(第14図)によって表される 関数のエクスターナルを表すものであり、フィールド“first decl” 1502(第15図)、フィールド“next”1504、及びフィールド“f irst external”1510を含んでいる。フィールド“first decl”1502は、後により詳細に説明するように、エクスターナルリス ト構造体1414によって表されるエクスターナルのデータ型を規定する宣言構 造体1506を指定するポインタである。フィールド“next”1504は、 エクスターナルのシングルリンクトリストにおいてエクスターナルリスト構造体 1414のすぐ後にエクスターナルリスト構造体1508が続く場合、エクスタ ーナルリスト構造体1508を指定するポインタである。エクスターナルリスト 構造体のシングルリンクトリストにおいてエクスターナルリスト構造体1414 に続くエクスターナルリスト構造体がない場合、エクスターナルリスト構造体1 414のフィールド“next”1504はNULLとなる。即ち、NULLデ ータを含む。フィールド“first external”1510は、後によ り詳細に説明するように、エクスターナルリスト構造体1414によって表され るエクスターナルの状態を示すエクスターナル状態構造体(図示せず) を指定するポインタである。宣言構造体 宣言構造体1506を第16図に詳細に示す。宣言構造体は、宣言される変数 または関数、即ち宣言において規定される変数または関数を規定する構造体であ る。C言語の文脈中の宣言については周知であり、Cスタンダードにも示されて いる。宣言構造体1506は、フィールド“kind”1602、フィールド“ name”1604、フィールド“type”1606、フィールド“item ”1608、及びフィールド“model”1610を含んでいる。 フィールド“kind”1602は、宣言される項目または関数が、グローバ ルに定義されるものであるか、スタティックなものであるか、あるいはローカル に定義されるものであるかを示すデータを含む。フィールド“name”160 4は、項目または関数の識別子を特定するテキストデータを含む。上述したよう に、C言語の文脈において、項目または関数はテキスト形式の識別子によって識 別され、識別子はCスタンダードのセクション6.1.2に述べられているよう な所定の書式に従わなければならない。 宣言構造体1506のフィールド“type”1606は、宣言される項目ま たは関数によって表されるデータの特定の型を定める型構造体1612を指定す るポインタである。型構造体1612については、後で説明する。フィールド“ item”1608は、宣言される項目を表す項目構造体2700を指定するポ インタである。宣言構造体1506が宣言される関数を表現する場合、フィール ド“item”1608はNULLであり、従って項目構造体は指定されない。 宣言構造体1506のフィールド“model”1610は、宣言構造体15 06が関数の宣言を表し、その関数のモデルが関数モデル構造 体1100によって表される場合、関数モデル構造体1100を指定するポイン タである。宣言構造体1506が関数の宣言を表さない場合、フィールド“mo del”1610はNULLであり、即ち、NULLデータを含む。従って関数 モデル構造体は指定されない。また、宣言構造体1506が関数の宣言を表すが 、その関数の関数モデル構造体が存在しない場合も、フィールド“model” 1610はNULLとなる。型構造体 第17図に型構造体1612を詳細に示す。型構造体1612のような型構造 体は、整数、浮動小数点、英数文字、及び構造体のようなユーザ定義による型、 のような特定のデータ型を規定する。型構造体1612は、フィールド“kin d”702、フィールド“name”1704、フィールド“size”170 6、フィールド“points to”1708、及びフィールド“field s”1710を含んでいる。フィールド“kind”1702は、型構造体16 12によって表される型が、整数、実数(即ち浮動小数点数値データ)、ポイン タ、配列、構造体(即ち、C言語に対しデータ型“struct”で定義された もの)、あるいはユニオン(union)のいずれであるか特定するデータを含む。 これらの各型は公知であり、Cスタンダードのセクション6.1.2.5及び6 .5以降に述べられている。 型構造体1612のフィールド“name”1704は、型構造体1612に よって表される型がユーザ定義されるものである場合、その型の識別子を特定す る英数字データを含む。型構造体1612によって表される型がC言語によって 予め定められたものである場合、フィールド“name”1704はNULLで ある。 フィールド“size”1706は、型構造体1612によって表される型の サイズを規定する。型が配列でない場合、フィールド“siz e”1706は、型構造体1612によって表される型の項目に含まれるデータ のビット数を示す。例えば、型が32ビット整数の場合、型構造体1612のフ ィールド“size”1706は値32を示す。型が配列の場合、フィールド“ size”1706は配列全体に含まれるデータのビット数、即ちその配列のエ レメントによって表されるその型の項目に含まれるデータのビット数にその配列 全体に含まれるエレメントの数を掛けたものを表す。例えば、宣言“int a rray[10];”によって、10個のエレメントからなる配列が宣言されると する。型“int”が32ビット整数の場合、宣言された配列のサイズは、10 エレメント×32ビットとなる。従って、その配列のサイズは320ビットとな る。 構造体1612によって表される型が別のデータ型を指定するポインタの場合 、フィールド“points to”1708は別のデータ型を表す型構造体、 即ち型構造体1712を指定するポインタである。型構造体1712は型構造体 1612と同様である。逆に、型構造体1612によって表される型がポインタ でない場合、フィールド“points to”1708はNULLとなる。 型構造体1612によって表される型が構造体型(即ちC言語の型“stru ct”)またはユニオン型の場合、フィールド“fields”1710は、そ れぞれ、その構造体型またはユニオン型の第1フィールドを表すフィールド構造 体1714を指定するポインタとなる。後により詳細に説明するように、ある特 定の構造体型またはユニオン型のフィールドに対応するフィールド構造体は、シ ングルリンクトリストを形成するようにリンクされる。型構造体1612によっ て表される型が構造体型でもユニオン型でもない場合、型構造体1612のフィ ールド“fields”1710はNULLとなる。フィールド構造体 フィールド構造体1714を第18図に詳細に示す。フィールド構造体171 4は、フィールド“name”1802、フィールド“size”1804、フ ィールド“offset”1806、及びフィールド“next”1808を含 んでいる。フィールド構造体1714について、C言語に基づく以下の型定義の 例の文脈において説明する。 ソースコード抜粋(9)の型定義は、識別子が“point”であり2つのフ ィールドを有する構造体型を定義している。型“point”は従って構造体型 である。各フィールドは型“int”であり、これは通常32ビット整数である 。また、各フィールドは、識別子“x”または“y”を有している。 フィールド構造体1714のフィールド“name”1802は、フィールド 構造体1714によって表されるフィールドの識別子を特定する英数字データを 含む。例えば、ソースコード抜粋(9)に定義されている構造体の第1フィール ドを表すフィールド構造体のフィールド“name”はテキスト“x”を含む。 フィールド構造体1714のフィールド“size”1804は、フィールド 構造体1714によって表されるフィールドに含まれるデータのビット数を示す 。例えば、カリフォルニア州、マウンテンビュー(Mountain View)のサンマイ クロシステムズ社(Sun Microsystems,Inc.)から販売されている“SunOS C com piler”によってコンパイルされるようなC言語の典型的な例では、型“int ”の項目は32ビット長さである。ソースコード抜粋(9)の例では、各フィー ルドは32ビット整数であり、従って32ビットのデータを含む。従って、個々 のフィールドを表す各フィールド構造体のフィールド“size”は整数値32 を示す。 フィールド構造体1714のフィールド“offset”は、フィー ルド構造体1714によって表されるフィールドのデータまでの構造体の開始か らのオフセットを表す。例えば、ソースコード抜粋(9)におけるフィールド“ x”は型“point”の第1フィールドであるため、オフセットは0である。 型“point”を第19図に図式的に示す。型“point”のフィールド“ x”は32ビット長さであり、オフセット0で始まる。型“point”のフィ ールド“y”は32ビット長さであり、オフセット32で始まる。従って、フィ ールド構造体1714X(これはフィールド構造体1714(第18図)と全く 同様であり、型“point”のフィールド“x”を表すものである。)のフィ ールド“offset“1806X(第20図)は、整数値0を示す。同様に、 フィールド構造体1714(第18図)と全く同様な、型“point”のフィ ールド“y”を表すフィールド構造体1714Yのフィールド“offset” 1806Y(第20図)は、整数値32を示す。 フィールド構造体1714のフィールド“next”1808(第18図)は 、所与の構造体型のフィールド構造体のシングルリンクトリストにおける次のフ ィールド構造体を指定するポインタである。例えば、型“point”を表す型 構造体1612Pのフィールド“fields”1710P(第20図)は、型 “point”の第1フィールドであるフィールド“X”を表すフィールド構造 体1710Xを指定する。型“point”の次のフィールドはフィールド“Y ”である。従って、フィールド構造体1714Xのフィールド“next”18 08Xは、型“point”のフィールド“y”を表すフィールド構造体171 4Yを指定する。型“point”のフィールド“y”は、型“point”の 最後のフィールドであり、その後に型“point”の他のフィールドはない。 従って、フィールド構造体1714Yのフィールド“next”1810YはN ULLである。ステートメント構造体 上述したように、関数構造体1400のフィールド“first stmt” 1412(第14図)は、ステートメント構造体1416を指定する。ステート メント構造体1416は第21図に詳細に示されている。ステートメント構造体 1416のようなステートメント構造体は、C言語に基づきまとまってある関数 を形成する複数のステートメントを表す。ステートメント1416は次のフィー ルドを含んでる:(i)フィールド“kind”2102、(ii)フィールド “line”2104、(iii)フィールド“next”2106、(iv) フィールド“flags”2108、及び(v)フィールド“pointers ”2110。 ステートメント構造体1416のフィールド“kind”2102は、ステー トメント構造体1416によって表されるステートメントの種類を表す。フィー ルド“kind”2102は、以下のステートメント種類のうちの1つを特定す る:エラー、宣言、式、ブロック、“if”、“else”、“return” 、ループ、“switch”、“break”、“continue”、及び“ goto”。ステートメント構造体によるこれらのステートメント種類の各々の 表現について、以下により詳細に説明する。 ステートメント構造体1416のフィールド“line”2104は、関数構 造体1400(第14図)によって表される関数を定義するソースコードファイ ル内において、ステートメント構造体1416によって表されるステートメント が現れる、即ち、ステートメント構造体1416によって表されるステートメン トを含むテキストラインを表す。ステートメントが現れるラインは、エラーを生 じさせる特定のステートメントが、検出されたエラーの通知によってユーザに特 定されるようにする ため、ステートメント構造体1416内に保持される。 ステートメント構造体1416のフィールド“next”2106(第21図 )は、ステートメントのブロックにおいてステートメント構造体1416によっ て表されるステートメントのすぐ後に続くステートメントを表す別のステートメ ント構造体2112を指定するポインタである。このようにして、ステートメン トブロックの全ステートメントが、シングルリンクトリストを形成するようにリ ンクされたステートメント構造体によって表される。ステートメント構造体14 16(第21図)によって表されるステートメントがステートメントブロックの 最後のステートメントの場合、フィールド“next”2106はNULLとな り、他のステートメント構造体を指定しない。 ステートメント構造体1416のフィールド“flags”2108は符号な し32ビット整数であり、その個々のビットはステートメント構造体1416に よって表されるステートメントに関連するエラーがユーザに通知されたかどうか を示すフラグとして用いられる。エラーが通知されるときにはいつも、通知され るべきエラーに対応するフィールド“flags”2108のフラグがチェック される。フラグがセットされている場合、そのフラグはステートメント構造体1 416によって表されるステートメントの文脈において既にそのエラーの通知が なされていることを表すため、エラーは通知されない。フラグがセットされてい ない場合は、エラーは通知され、エラーの通知を反映するようにフラグがセット される。このようにして、各タイプのエラーは、ある特定のステートメントに対 して1回だけ通知される。 ステートメント構造体1416のフィールド“pointers”2110は 、ステートメント構造体1416によって表されるステートメントの各部分を表 す構造体を指定する1または複数のポインタの配列で ある。この配列中のポインタの数は、ステートメント構造体1416によって表 されるステートメントの特定の種類に依存する。 エラー、“break”、及び“continue”ステートメントは部分を 有さず、従ってステートメント構造体1416がエラー、“break”、ある いは“continue”ステートメントを表す場合、フィールド“point ers”2110はNULLである。エラーステートメントとは、C言語に従わ ないステートメントである。“break”及び“continue”ステート メントは周知であり、それぞれCスタンダードのセクション6.6.6.3及び 6.6.6.2に説明されている。 宣言ステートメントには、特定の型のデータを有する宣言される変数が含まれ 、更に恐らくはその変数に対する初期値も含まれる。従って、ステートメント構 造体1416が宣言ステートメントを表す場合、フィールド“pointers ”2110は2つのポインタからなる配列となる。第1のポインタは宣言される 変数を表す宣言構造体を指定する。初期値が定められる場合、第2のポインタは 、宣言される変数の初期値を与えるべく評価される式を表す式構造体を指定する 。宣言される変数に対し初期値が定められない場合は、第2のポインタはNUL Lである。 式ステートメント(expression statement)とは、それ自身が式であるステー トメントである。式(expression)はC言語の公知のコンポーネントであり、1 または複数の項目、関数に対する呼び出し、及び演算子の集まりである。C言語 では、全ての式は値(value)を有する。式の評価の結果は、値がその式の値で あるような項目となり、この項目はしばしば式の項目と呼ばれる。本明細書中で は、しばしば、式の項目の値を式の値と言う。式の評価については、以下により 詳細に説明される。 ステートメント構造体1416が式ステートメントを表す場合、フィ ールド“pointers”2110は、式構造体2200(第22図)のよう な式構造体を指定する1つのポインタからなる配列となる。式構造体2200は 、フィールド“kind”2202、フィールド“type”2204、フィー ルド“item”2206、フィールド“num operands”2208 、及びフィールド“operands”2210を含んでいる。フィールド“k ind”2202は、式構造体2200によって表される式の種類を特定する。 式が演算子を含む場合、フィールド“kind”2202はその演算子を示す。 フィールド“type”2204は、式のデータ型、即ち、その式の評価の結 果を示す項目の型を表す型構造体2212を指定するポインタである。型構造体 2212は、上述した型構造体1612と同様である。式構造体2200のフィ ールド“item”2206は、式の評価の結果を示す項目を表す項目構造体2 214を指定するポインタである。項目構造体2214は上述した項目構造体2 700(第27図)と同様である。式構造体2200によって表された式の評価 の前においては、フィールド“item”2206はNULLである。 式構造体2200によって表される式の中のオペランドの数はフィールド“n um operands”2208によって示される。フィールド“opera nds”2210は式構造体の配列であり、その各々は式構造体2200によっ て表される式の一つのオペランドを表す。この配列の長さは、フィールド“nu m operands”2208に示されたオペランドの数に等しい。C言語に おいて定義される式の様々な型、及び各型の式のオペランドの数及び型について は周知であり、Cスタンダードにも記載されている。 ブロックステートメントとは、1または複数のステートメントをグループにま とめたステートメントである。ブロックステートメントの実行 は、1または複数のステートメントの実行である。ブロックステートメントは部 分、即ち、1または複数のステートメントを有する。ステートメント構造体14 16(第21図)がブロックステートメントを表す場合、フィールド“poin ters”2110はシングルポインタであり、このポインタは1または複数の ステートメントの最初のステートメントを表すステートメント構造体を指定する 。1または複数のステートメントを表すステートメント構造体は、上述したよう にフィールド“next”2106を用いることによってシングルリンクトリス トを形成するようにリンクされる。 “if”ステートメントは、“if”ステートメントの述語としばしば呼ばれ る式を評価して、その評価の結果が“true”のブール値になる場合は、第2 のステートメントを実行させるものである。ステートメント構造体1416が“ if”ステートメントを表す場合、フィールド“pointers”2110は 2つのポインタからなる配列となる。第1のポインタは、その値によって第2ス テートメントが実行されるか否かが判定される式を表す式構造体を指定する。第 2ポインタは、第2ステートメントを表すステートメント構造体を指定する。 “else”ステートメントは、“if”ステートメントのすぐ後に置かれ、 “if”ステートメントの述語の評価が“false”のブール値なる場合、第 3ステートメントを実行させる。ステートメント構造体1416が“else” ステートメントを表す場合、フィールド“pointers”2110は2つの ポインタからなる配列となる。第1ポインタは、第3ステートメントを表すステ ートメント構造体を指定する。第2ポインタは、ある式構造体を指定するかまた はNULLである。この式構造体によって表される式は、しばしば、“else ”ステートメントの述語と呼ばれる。第2ポインタが式構造体を指定する場合、 第 3ステートメントは、“if”ステートメントの述語の評価が“false”の ブール値となり、“else”ステートメントの述語の評価が“true”のブ ール値となる場合にのみ実行される。Cスタンダードにも記載され広く知られて いるように、これは“else if”ステートメントを表す。第2ポインタが NULLの場合、第3ステートメントは、“if”ステートメントの述語の評価 が“false”のブール値となる場合にのみ実行される。 “return”ステートメントは、被呼び出し関数の実行を終了させ、制御 を呼び出し関数に移すとともに、場合によっては呼び出し関数に戻り値項目を与 える。呼び出し関数に制御を移すとともに、呼び出し関数に戻り値項目を与える ことは、呼び出し関数に戻り値項目をリターンすると言われる。ステートメント 構造体1416が“return”ステートメントを表す場合、フィールド“p ointers”2110はシングルポインタであり、このポインタは式構造体 を指定するかまたはNULLである。このポインタが式構造体を指定する場合、 その式構造体によって表される式の評価の結果を示す項目が呼び出し関数にリタ ーンされる。 ループステートメントは、0回または1回以上実行される第2ステートメント を生成するものである。C言語におけるループステートメントの例として、“f or”ステートメント、“do”ステートメント、及び“while”ステート メントがあるが、それらはCスタンダードのセクション6.6.5に記載されて おり広く知られている。ステートメント構造体1416がループステートメント を表す場合、フィールド“pointers”2110はシングルポインタであ り、第2ステートメントを表すステートメント構造体を指定する。 “switch”ステートメントは、式を評価し、式の評価の結果を 示す値に応じてブロックステートメント内の制御をそのブロックステートメント 内の特定のステートメントへ移す。式は、しばしば“switch”ステートメ ントの述語と呼ばれる。ステートメント構造体1416が“switch”ステ ートメントを表す場合、フィールド“pointers”2110は2つのポイ ンタからなる配列となる。第1のポインタは、その値に応じて制御が移行する式 を表す式構造体を指定する。第2のポインタは、ブロックステートメントを表す ステートメント構造体を指定する。 “goto”ステートメントは第2ステートメントへの制御の移行を発生させ る。一実施例では、ステートメント構造体1416が“goto”ステートメン トを表す場合、フィールド“pointers”2110は、第2ステートメン トを表すステートメント構造体を指定するシングルポインタからなる配列である 。より簡略化された実施例では、“goto”ステートメントは被呼び出しルー チンの実行を終了させるものとして取り扱われる。この実施例では“goto” ステートメントは部分を有さず、フィールド“pointers”2110はポ インタを含まない配列である。 このようにして、関数構造体1400(第14図)は動的検査エンジン706 によって解析されるべき関数を表現する。関数の解析 上述したように、動的検査エンジン706(第7図)は、ステップ908(第 9図)においてコンピュータプログラム610(第6図)のパージングの結果得 られた各関数構造体を解析する。ステップ908は論理流れ図908(第24図 )に、より詳細に示されている。ステップ908の実行において、処理されてい る関数構造体はサブジェクト関数構造体と呼ばれる。同様に、サブジェクト関数 構造体によって表される関 数は、サブジェクト関数と呼ばれる。論理流れ図908のステップ2404及び 2408において、サブジェクト関数は様々な仮定のもとで解析される。 上記において詳しく説明したように、ある特定の関数の制御流れ経路は、しば しばその関数が実行されるまでは未知であるイベントに依存する。実行後でも、 その関数のある実行時に生じたイベントがその関数の全ての実行においても常に 発生するとは限らない。そのため、制御の流れが未知のイベントに依存するよう な関数の解析は、それらの未知のイベントについての様々な仮定の下で繰り返し なされる。 一実施例では、関数の全ての可能な制御流れが決定され解析される。例えば、 制御は、関数内の全ての“if”ステートメントに対して2つの可能な経路の一 方に沿って流れ得るし、また、関数内の全ての“switch”ステートメント に対して複数の可能な経路の内の1つに沿って流れ得る。“switch”ステ ートメントの場合、可能な経路の数は、その“switch”ステートメントに 関連する“case”ステートメントの数に等しい。これには、存在する場合に は、“default”ステートメントも含まれる。いったん関数の全ての可能 な制御流れ経路が決定されると、その関数の各制御流れ経路が1回ずつ用いられ るようにして、その関数は繰り返し解析される。このようにして、その関数の制 御の流れに影響を与え得る全ての可能なイベントを考慮して関数の解析がなされ る。 より簡略化された実施例では、関数の特定の制御流れ経路がその関数内の各“ if”ステートメント及び各“switch”ステートメントにおけるイベント に関してランダムな仮定を設定することによってランダムに選択される。関数は 様々な制御流れ経路がランダムに選択されるようにして繰り返し解析される。関 数を解析する回数は、関数の全ての 可能な制御流れ経路が解析される可能性が十分高くなるように選択されるか、あ るいは別の方法として1つのルーチンを解析するのに費やされる労力を制限する ように選択することもできる。 ステップ2404及び2408(第24図)は、後者のより簡略化された方の 実施例を例示したものである。ステップ2404において、サブジェクト関数が 解析される回数が決定される。ステップ2404は、論理流れ図2404(第2 5図)としてより詳細に示されている。ステップ2502において、サブジェク ト関数内で“if”ステートメントが使用される回数が決定される。詳述すると 、実行エンジン802(第8図)によって、関数構造体1400のフィールド“ first−statement”1412(第14図)により直接的または間 接的に指定されたステートメント構造体のシングルリンクトリスト内の各ステー トメント構造体のフィールド“kind”2102(第21図)が、“if”ス テートメントを示すデータと比較される。ステートメント構造体のフィールド“ kind”と“if”ステートメントを示すデータとが整合する回数が、“if ”ステートメントがそのサブジェクト関数内で使用される回数として記録される 。 ステップ2502から、プロセスはステップ2504に進み、そこでサブジェ クト関数が解析される回数が決定される。一実施例では、サブジェクト関数が解 析される回数は、“if”ステートメントがサブジェクト関数内で使用される回 数に対応する。その例を表Mに示す。 ステップ2504の後、論理流れ図2404に基づくプロセス、従ってステッ プ2404(第24図)は、終了する。プロセスはステップ2404からステッ プ2408へ進み、サブジェクト関数は上述したステップ2404で決定された 数だけ繰り返し解析される。ステップ2408の一回の繰返し、即ち、サブジェ クト関数の1回の解析は、論理流れ図2600(第26図)に示される。 サブジェクト関数の1回の繰返しの解析は、ステップ2602で開始され、そ こで、各エクスターナルに対するエクスターナル状態構造体が初期化される。エ クスターナル状態構造体は、まずそのエクスターナル状態構造体に対応する、即 ちそのエクスターナル状態構造体によって表される状態を有するエクスターナル に対応する項目構造体を生成し、続いてそのエクスターナルのDK及びCP状態 を状態Oに設定することによって初期化される。項目構造体は、項目を表すメモ リ104(第1図)内の構造体である。 項目構造体2700(第27図)は、以下のフィールドを含んでいる。 即ち、フィールド“resource”2702、フィールド“externa l”2704、フィールド“value”2706、フィールドfirst i n bunch2708、フィールド“size of bunch”2710 、フィールド“type code”2712、フィールド“initiali zed”2714、フィールド“head in bunch”2716、フィ ールド“known bunch size”2718、及びフィールド“in valid pointer”2720を含んでいる。 各項目は、リソース及び/若しくはエクスターナルに関連付けられ得る。項目 構造体2700により表現される項目がリソースの1つと関連している場合、項 目構造体2700のフィールド“resource”2702が、そのリソース を表現するリソース状態構造体を指定する。逆に、その項目がリソースと関連し ていない場合、フィールド“resource”2702は、そのことを示すべ くNULLにされる。項目構造体2700により表現される項目がエクスターナ ルの1つと関連している場合、項目構造体2700のフィールド“extern al”2704が、そのエクスターナルを表現するエクスターナル状態構造体を 指定する。逆に、その項目がエクスターナルと関連していない場合、フィールド “external”2704は、そのことを示すべくNULLにされる。 項目構造体2700のフィールド“value”2706は、項目構造体27 00によって表現される項目の実際の値を定めるデータを含んでいる。つまり、 フィールド“value”2706に格納されたデータは、メモリ104(第1 図)における、項目構造体2700(第27図)によって表現された項目によっ て指定された位置に格納された実際のデータを表現する。項目構造体2700の フィールド“type c ode”2712は、その項目のメモリ位置に格納されたデータの型を指定する 。ここに開示する実施例において支援されているデータの型には、long、p ointer、及びdoubleがある。最近のC言語の実装においては、“l ong”は32ビットの符号付き整数、“pointer”はメモリ104のよ うなメモリにおけるアドレスを指定する値、また、“double”は64ビッ トの浮動小数点である。フィールド“value”2706内には各データの型 に対応するサブフィールドがある。使用されるのはただ1つのサブフィールドで ある。即ちフィールド“type code”2712で指定されたデータの型 に対応するサブフィールドのみが使用される。 項目構造体2700のフィールド“initialized”2714は、項 目構造体2700により表現されたその項目が初期化されているか否か、即ち項 目構造体2700によって表現される項目が既知の値を有するか否かを示す。項 目構造体2700のフィールド“invalid pointer”2720は 、項目構造体2700によって表現される項目が無効ポインタであるか否かを示 す。C言語においては、ポインタがメモリ104(第1図)における有効な位置 を指定している場合、そのポインタは有効である。そうでない場合、そのポイン タは無効である。NULLポインタは、C言語の多くの実装において0に選択さ れる特定の無効ポインタである。一実施例においては、フィールド“initi alized”2714及び“invalid pointer”2720は、 それぞれ1つのビットよりなる。 フィールド“first in bunch”2708、“size of bunch”2710、“head in bunch”2712、及び“kn own bunch size”2718は、メモリの集群(bunch)を解析す るのに用いられる。メモリの集群については、 後に詳しく説明する。 ステップ2602(第26図)において、ひとたびこのサブジェクト関数のエ クスターナルが初期化されると、処理はステップ2604に進む。ステップ26 04において、サブジェクト関数の各ステートメントが評価される。ステートメ ントの評価は、そのステートメントの実行をエミュレートすることによって行わ れる。ステートメントの評価により、エクスターナル及び/若しくはリソースに 対して施した演算の結果が得られ、エクスターナル及び/若しくはリソースのそ れぞれの状態の変化が生ずる。後に詳しく説明するが、各ステートメントの評価 は論理流れ図2800(第28図)に従って個別に行われる。 ひとたびサブジェクト関数の各ステートメントが評価されると、処理はステッ プ2604(第26図)からステップ2606に進む。ステップ2606におい てはサブジェクト関数の様々なリソースの状態のリーク(leak)がチェックされ る。ステップ2606の詳細は論理流れ図2606(第41図)に示されており 、これについては後に説明する。ステップ2606から処理はステップ2608 に進み、ここでサブジェクト関数の各エクスターナルが更新される。エクスター ナルの更新は、エクスターナルのDK及びCP状態、及びそのエクスターナルに 関連付けられたリソースのRS状態に基づいて、エクスターナルの複合DK、C P、及びRS状態を更新することによって行われる。これらの状態はサブジェク ト関数の現反復的解析(current iterative analysis)から得られる。1つのエ クスターナルの更新は、論理流れ図4200(第42図)に示されており、後に 完全に説明する。 ステップ2608(第26図)が終了すると、論理流れ図2600に従った処 理、即ちサブジェクト関数の反復的解析の1回分が終了する。ステートメントの評価 上述のように、サブジェクト関数の各ステートメントは論理流れ図2800( 第28図)に従って個別に評価される。処理はテストステップ2802から開始 されるが、このステップでは実行エンジン802(第8図)が、そのステートメ ント、すなわちサブジェクトステートメントの構造体を表すステートメント構造 体のフィールド“kind”2102(第21図)を検索することによって、そ のステートメントが式であるか否かを判定する。そのステートメントはサブジェ クトステートメント構造体によって表されるサブジェクトステートメントである 。即ち、その時点で論理流れ図2800(第28図)に従って評価されているス テートメントをサブジェクトステートメントと称する。 サブジェクトステートメントが式である場合、すなわちフィールド“kind ”2102が、サブジェクトステートメントが式であることを示している場合に は、処理はテストステップ2802(第28図)からステップ2804に進み、 そこで実行エンジン802(第8図)が式、すなわちサブジェクトステートメン トの評価を行う。実行エンジン802は、その式に含まれる項目上の関数及び演 算子の実行をエミュレートすることによって式の評価を行う。ステップ2804 (第28図)は論理流れ図2900(第29図)に従って実行されるが、これに ついては後に詳述する。 後に詳しく述べるように、論理流れ図2900に従う処理は、式の評価の結果 得られた項目に対して演算を施し得る。ステップ2804の文脈に於いては、式 の項目に対して施される演算は無い。テストステップ2802(第28図)に於 いて、サブジェクトステートメントが式でない場合は、処理はテストステップ2 806に進む。 テストステップ2806に於いては、実行エンジン802(第8図)がサブジ ェクトステートメント構造体のフィールド“kind”210 2とそのサブジェクトステートメントが宣言であることを示すデータとを比較す る。defining宣言は、項目を生成させるC言語に従ったステートメント である。declaring宣言は、その項目があたかも特定の型であるかのよ うにその項目を取り扱うようCPU102(第1図)に指示するC言語に従った ステートメントである。ここで述べたもの以外の場合には、宣言はdefini ng宣言となる。 サブジェクトステートメントが宣言である場合、処理はテストステップ280 6(第28図)からステップ2808に進み、ここでその宣言が処理される。こ れについては後に詳しく述べる。逆に、サブジェクトステートメントが宣言でな い場合は、処理はテストステップ2806からテストステップ2810に進む。 テストステップ2810に於いては、実行エンジン802(第8図)が、サブ ジェクトステートメント構造体のフィールド“kind”2102(第21図) と、サブジェクトステートメントが“if”ステートメントであることを示すデ ータとを比較する。そのステートメントが“if”ステートメントである場合は 、処理はテストステップ2810(第28図)からステップ2812に進み、こ こでそのサブジェクトステートメントが処理される。ステップ2812は後に説 明する論理流れ図2812(第35図)により詳細に示されている。逆に、サブ ジェクトステートメントが“if”ステートメントでない場合は、処理はテスト ステップ2810(第28図)からテストステップ2814に進む。 テストステップ2814に於いては、実行エンジン802(第8図)が、サブ ジェクトステートメント構造体のフィールド“kind”2102(第21図) と、そのサブジェクトステートメントが“return”ステートメントである ことを示すデータとを比較する。サブジェクトステートメントが“return ”ステートメントである場合は、処 理はテストステップ2814(第28図)からステップ2816に進み、ここで そのステートメントが処理される。ステップ2816は後に説明する論理流れ図 2816(第39図)により詳細に示されている。逆に、そのサブジェクトステ ートメントが“return”ステートメントでない場合は、処理はテストステ ップ2814(第28図)からテストステップ2818に進む。 テストステップ2818に於いては、実行エンジン802(第8図)が、その サブジェクトステートメントのフィールド“kind”2102(第21図)と 、そのサブジェクトステートメントがループ若しくはブロックステートメントで あることを示すデータとを比較する。サブジェクトステートメントがループ若し くはブロックステートメントである場合には、処理はテストステップ2818( 第28図)からステップ2820に進み、そのステートメントが処理される。ス テップ2820は後に説明する論理流れ図2820(第40図)により詳細に示 されている。逆に、そのサブジェクトステートメントはループステートメントで もブロックステートメントでもない場合には、処理はテストステップ2818( 第28図)からテストステップ2822に進む。 テストステップ2822に於いては、実行エンジン802(第8図)が、サブ ジェクトステートメントのフィールド“kind”2102(第21図)と、そ のサブジェクトステートメントが“goto”ステートメントであることを示す データとを比較する。そのサブジェクトステートメントが“goto”ステート メントである場合には、処理はテストステップ2822(第28図)からステッ プ2824に進み、そこで実行エンジン802(第8図)が、後に詳述するよう に“return”条件を示すデータを制御レコード内に格納する。この制御レ コードは、後に詳述するようにそのサブジェクト関数の実行のエミュレーション 時 に適切な制御の流れを与えるために用いられる。“return”条件は、サブ ジェクト関数の反復的解析を終了させる。 サブジェクトステートメントが“goto”ステートメントでない場合には、 処理は論理流れ図2800に従って終了する。 ステップ2804、2808、2812、2816、2820、または282 4のいずれかが実行されれた後、処理は論理流れ図2800に従って終了する。 従って、実行エンジン802(第8図)によるステートメントの評価は、そのス テートメントが式であるか、宣言であるか、“if”ステートメントであるか、 “return”ステートメントであるか、ブロックステートメントであるか、 ループステートメントであるか、若しくは“goto“ステートメントであるか によって、それぞれステップ2804(第28図)、ステップ2808、281 2、2816、2820、2824、若しくは2828において行われるのであ る。式の評価 上述のように、式は論理流れ図2900(第29図)に従って評価されるが、 この場合実行エンジン802(第8図)が、動的検査エンジン706の一部であ るステートマシン804をして、実行エンジン802によって指定された演算が ある場合にはその演算をその式の項目に施すようにする。上述のように、ステッ プ2804(第28図)の文脈に於いては、実行エンジン802(第8図)はこ のような演算の指定を行わない。ここに開示する本発明の実施例では、式を評価 することで、式であるステートメント若しくは式を含むステートメントの実行に よりその式のオペランドである項目に及ぼす効果を判断している。 論理流れ図2900(第29図)に従う処理は、ステップ2902から開始さ れるが、ここでは式の評価を行うために、その式に於ける演算 子によって指定された処理が実行される。上述のように、式は、動的検査エンジ ン706(第7図)内に於いて式構造体2200(第22図)のような式構造体 によって表現される。式構造体2200のフィールド“kind”2202はそ の式の演算子の種類を指定し、またフィールド“operands”2210は その演算子の演算が施されるオペランドを含む。 このサブジェクト関数の解析は、コンピュータプロセス内に於けるそのサブジ ェクト関数の実行の文脈内で行われるので、このサブジェクト関数のエクスター ナルの初期値は未知である。従って、このサブジェクト関数に於ける式は、既知 の値に評価しなくてもよい。従って、ステップ2902(第29図)での実行エ ンジン802(第8図)による式の評価により、式の評価により既知の若しくは 部分的に既知の値が生成される場合には項目が生成され、そうでない場合にはN ULLが生成される。後に詳述するように、項目は、「部分的に既知」の値を有 し得る。例えば、項目が0でない値を有していることは知ることはできるが、項 目の正確な値はまだ知ることができず、この場合その項目の値は「部分的に既知 」であるという。ステップ2902は論理流れ図2902(第33a図、第33 b図、及び第33c図)に詳しく示されており、後に詳細に説明する。 ステップ2902(第29図)から、処理はテストステップ2904に進み、 ここで実行エンジン802(第8図)が、式の評価によりNULLでなく項目が 生成されたか否か、及びステートマシン804によりその項目に演算が施される か否かを判定する。その式の評価により項目が生成されない場合、若しくはその 項目に演算が施されない場合には、処理はテストステップ2904(第29図) から後に説明するステップ2908に進む。逆に、その式の評価により項目が生 成されその項目に 演算が施される場合には、処理はテストステップ2904からステップ2906 に進み、そこでステートマシン804(第8図)がその項目に演算を施す。 評価された式の項目に演算を施すために、ステートマシン804は、その項目 にエクスターナル及びリソースがそれぞれ関連付けられている場合には、その項 目に関連付けられたエクスターナル及びリソースに対して演算を施す。例えば、 項目構造体2700(第27図)のフィールド“external”2704が 、項目構造体によって表現された項目に関連付けられたエクスターナルを表現す るエクスターナル状態構造体を指定する。同様に、項目構造体2700のフィー ルド“resource“2702が、そのアイテムに関連付けられたリソース を表現するリソース状態構造体を指定する。 エクスターナルに施される演算には、例えばエクスターナル状態構造体300 0のフィールド“DK”3004(第30図)及び“CP”3008の更新があ る。このエクスターナル状態構造体3000は、そのエクスターナルを表現する エクスターナル状態構造体である。フィールド“DK”3004の更新は、その エクスターナルに施される演算に従って、また上述の状態図500(第5a図) に従って行われる。例えば、フィールド“DK”3004(第30図)が状態O を示しており、そのエクスターナルに演算mが施される場合、フィールド“DK ”3004は状態Qを示すように更新される。フィールド“CP”3008の更 新は、状態図400(第4a図)に従って行われる。 リソースに施される演算には、例えば、リソース状態構造体3100のフィー ルド“state”3102(第31図)及び“modified”3108の 更新がある。このリソース状態構造体は、そのリソースを表現するリソース状態 構造体である。フィールド“state”3 102は、上述の状態図300(第3A図)に従って更新される。フィールド“ modified”3108(第31図)は、現在行を指定するデータをフィー ルド“modified”3108に格納することによって更新され、最後にリ ソースを修正したステートメントを示すようにされる。この現在行とは、コンピ ュータプログラム610(第6図)上のそのサブジェクトステートメントが存在 する行を指す。リソースに関連するプログラミングエラーを知らせると共に、最 後にリソースを修正したステートメントをユーザに対して示すことによって、サ ブジェクト関数の開発者がプログラミングエラーを除去する助けとなる。 後に詳しく説明するが、エクスターナル状態構造体3000のフィールド“D K”3004(第30図)若しくは“CP”3008の更新、またはリソース状 態構造体3100のフィールド“state”3102(第31図)の更新によ って、状態図300、400、または500(第3A図、第4図、及び第5図) に基づくエラーが生じた場合には、このエラーはユーザに通知される。式の評価 により生成された項目も、論理流れ図3200(第32図)に基づいて状態違反 を調べられる。 テストステップ3202(第32図)においては、ステートマシン804(第 7図)が項目構造体2700のフィールド“initialized”2714 (第27図)を調べて、項目構造体2700によって表現された項目が初期化さ れたか否かを判定する。その項目が初期化されていない場合には、処理はテスト ステップ3202(第32図)からステップ3204に進み、ここでエラーが報 告される。論理流れ図3200の各ステップの実行はステップ2906(第29 図)内においてのみ実行されることから、演算が施されるのは論理流れ図320 0(第32図)における項目に対してである。従って、その項目が初期化される 場合、演算の適用で示されるように、初期化される前にその項目が使用 され、これがエラーとなる。 その項目が初期化された場合には、処理はテストステップ3202からテスト ステップ3206に進む。テストステップ3206においては、ステートマシン 804(第8図)が、項目構造体2700のフィールド“invalid po inter”2720(第27図)を検査することによりその項目が無効ポイン タであるか否かを判定するとともに、施される演算と、演算i、即ち間接演算と を比較する。その項目が有効ポインタで、演算iが施される場合には、処理はス テップ3208(第32図)に進み、そこでエラーが通知される。逆に、その項 目が有効ポインタでなく、若しくは演算i以外の演算が施される場合には、処理 はステップ3206からテストステップ3210に進む。 テストステップ3210において、ステートマシン804(第7図)は、その 項目が、テストステップ3206に関して上述したのと同様に無効ポインタであ るか否かを判定し、施される演算と演算kとを比較する。C言語の文脈において は、無効ポインタを解放することは、ファイル及び動的に割振られるメモリを管 理するのに使用するデータ構造をライブラリ関数が損なうことになり得るために 、エラーとなる。NULLポインタを解放することは一般的にはエラーではない が、不手際なプログラム作成方法と一般に考えられ、エラーとして通知される。 その項目が無効ポインタであり、演算kがその項目に施される場合には、処理は ステップ3212に進み、そこでエラーの通知がなされる。逆にその項目が無効 ポインタでないか、若しくは演算k以外の演算が施される場合には、処理は論理 流れ図3200に従って終了する。また、ステップ3204、3208、及び3 212の終了後も、処理は論理流れ図3200に従って終了する。 従って、ステップ2906(第29図)において、項目及びそれに関 連するリソースまたはエクスターナルに演算が施され、何らかのエラーが検出さ れてそれがユーザに通知される。ステップ2906から、処理はステップ290 8に進む。また、式の評価により生成された項目が存在しない場合、若しくは上 述のようにその式に対して施される演算が無い場合は、処理はテストステップ2 904から直接ステップ2908に進む。ステップ2908においては、実行エ ンジン802は、式、即ち、サブジェクトステートメントを含んでおり、更に、 項目が生成された場合にはその項目を、生成されなかった場合には数値がNUL Lである項目を含んでいる。詳述すると、実行エンジン802はサブジェクトス テートメントを表現する式構造体2200のフィールド“item”2206( 第22図)に、その項目を指定するポインタを格納する。従って、後に行われる その式の評価においては、単に、その項目がフィールド“item”2206が 指定する部位に戻されるだけとなり、これによって冗長な処理が回避される。ス テップ2908(第29図)の後、処理は論理流れ図2900に従って終了する 。定数 上述のように、論理流れ図2902(第33A図〜第33C図)に詳細に示さ れているステップ2902(第29図)においては、実行エンジン802(第8 図)は、式における演算子によって規定されている通りに式を処理する。実行エ ンジン802は、演算の型に応じてその式を処理する。テストステップ3301 (第33A図)においては、論理流れ図2902に従って処理が開始されるが、 ここでは実行エンジン802(第8図)が、その式が演算子は含んでいないが、 代わりに定数を含んでいるか否かを判定する。式構造体2200(第22図)が サブジェクトステートメントの式を表現している場合は、実行エンジン802( 第8図)は、式構造体2200のフィールド“kind”2202(第2 2図)と、式が定数であることを示すデータとを比較することによってこの判定 を行う。定数は、その値がコンピュータプロセスの実行中に変化しない項目であ る。例えば、式“10”は、整数であり、その値が常に10である定数である。 その式が定数でない場合には、処理は後に述べるテストステップ3303(第 33A図)に進む。逆に、式が定数である場合には、処理はテストステップ33 01からステップ3302の進む。ステップ3302においては、実行エンジン 802(第8図)が定数を表現する項目構造体を生成し、その項目構造体を、そ の定数の値を有するように初期化する。ステップ3302の終了後、処理は論理 流れ図2902及びステップ2902(第29図)に従って終了する。変数 上述のように、その式が定数でない場合には、処理はテストステップ3301 (第33A図)からテストステップ3303に進む。テストステップ3303に おいては、実行エンジン802(第8図)が、その式を表現する式構造体のフィ ールド“kind”2202(第22図)と、その式が変数であることを示すデ ータとを比較することによって、その式が変数であるか否かを判定する。変数で ある式は、その変数の項目の現項目値に評価される。例えば、サブジェクト関数 の以前に処理されたステートメントが、識別子が“i”、即ち型が“int”、 即ち整数である変数“i”である変数を宣言する場合には、式“i”は、変数“ i”の項目の現項目値に評価される。式が変数でない場合には、処理は後に説明 するテストステップ3305(第33A図)に進む。逆に、その式が変数である 場合には、処理はテストステップ3303からステップ3304に進む。 ステップ3304においては、実行エンジン802(第8図)が変数 iの項目を検索する。式構造体2300(第23図)がその式を表現する場合、 即ち変数を表現する場合には、(i)フィールド“num operands” 2308が、1つのオペランドを指定する値1を有し、(ii)フィールド“o perands”2310が宣言構造体2310を指定する1つのポインタの配 列となる。宣言構造体2316のフィールド“item”2324は、式230 0の値として検索される。宣言構造体2316に関連付けられた項目が存在しな い場合には、フィールド“item”2324はNULLとなる。従って、存在 する項目構造体またはNULLの何れかが、ステップ3304(第33A図)に おいて取り出されるのである。ステップ3304の終了後、処理は論理流れ図2 902即ちステップ2902(第29図)に従って終了する。2項演算子 上述のように、その式が宣言でない場合には、処理はテストステップ3303 (第33A図)からテストステップ3305に進む。テストステップ3305に おいて、実行エンジン802(第8図)は、その式を表現する式構造体のフィー ルド“kind”2202(第22図)と2項演算子を示すデータとを比較する ことによって、その式の演算子が2項演算子であるか否かを判定する。2項演算 子は2つのオペランドに対して演算を施す演算子であって、関係演算子ではない 演算子である。例えば、式“a+b”には、加算を指定する2項演算子“+”が 含まれている。関係演算子については後に説明する。 論理流れ図2902(第33A図)に従って処理される式の演算子が2項演算 子でない場合には、処理はテストステップ3305からテストステップ3309 に進む。逆に、式の演算子が2項演算子である場合には、処理はテストステップ 3305からステップ3306に進む。ステップ3306においては、左側のオ ペランド、即ち“lhs”が論理流 れ図2900(第29図)に従って式として評価される。2つのオペランドを有 し、式構造体2200(第22図)によって表現される式のlhsは、フィール ド“operands”2210の第1の要素である式構造体よって表現される 。このlhsは、論理流れ図2900(第29図)に従って評価されるとともに 、演算Cが施される。論理流れ図2900に従って演算を施すことについては、 前に説明した。従って、論理流れ図2900に従った式の評価は反復的に行われ る。つまり、論理流れ図2900に従った式の評価により、論理流れ図2900 に従ったその式の部分式(subexpression)の評価も行われることになり得るの である。このような再帰的プログラミングは周知の技術である。 2項演算子は、左側のオペランドと共に、右側のオペランド、即ち“rhs” を有する。例えば、式“(a+b)*c”は、lhs“(a+b)”と、rhs “c”とを有する。というのはこの式の中で最も優先順位の高いものは、演算子 “*”、即ち乗算演算子だからである。2つのオペランドを有し、式構造体22 00(第22図)によって表現される式のrhsは、フィールド“operan ds”2210の第2要素の式構造体によって表現される。ステップ3306( 第33A図)において式のlhsが評価された後、処理はステップ3307に進 み、ここで実行エンジン802(第8図)が、論理流れ図2900(第29図) に従ってこの式のrhsの評価を行うとともに、演算cを施す。演算cは、式の lhs及びrhsの双方に施されるが、これはそれぞれが計算において使用され るからである。このような計算において、式のlhs若しくはrhsの何れかを 不適切に使用している場合は、上述のように演算を施すことによってエラーメッ セージが生成される。 ステップ3307(第33A図)から、処理はステップ3308に進み、ここ でその式の2項演算子を用いて式の評価が行われる。この式の lhs及びrhsのデータの型は演算子によって呼び出される演算の型に影響す る。C言語において、特定の演算子が特定の型のオペランドに対して実行する演 算の型は、Cスタンダードのセクション6.3他に記載されており、周知である 。 式の演算子は、Cスタンダードに記載された所定の演算子の適用方法に従って 式のオペランドに適用される。例えば、演算子が算術加算演算子(即ち“+”) である場合には、演算子を2つのオペランドに適用した結果、2つのオペランド の算術和が得られる。第2の例として、演算子が、一方の値が他方より大きいこ とを表す関係演算子(即ち、“>”)である場合には、この演算子は2つのオペ ランド、即ちlhsとrhsとに適用することにより、lhsの値がrhsの値 より大きい場合にはブール値“true(真)”が得られ、逆の場合にはブール 値“false(偽)”が得られる。 コンピュータプログラム610におけるリソースの不適切な使用を検出するリ ソースチェッカー602(第6図)のために、実行エンジン802(第8図)に よりC言語の全ての演算子が適切に適用される必要は必ずしもない。式が実行エ ンジン802(第8図)によって適用され得ない演算子を含む場合、この式はN ULLに評価され、その式の評価により値が未知の項目が生成されることが示さ れる。しかし、実行エンジン802が、できる限り多くのC言語の演算子を適用 して、リソースチェッカー602によって検出されたリソースの不適切な使用を 正しく改善し得るのは好ましいことである。 ステップ3308(第33A図)の後、処理は論理流れ図2902、即ちステ ップ2902(第29図)に従って終了する。関係演算子 上述のように、式の演算子が2項演算子でない場合には、処理はテス トステップ3305(第33A図)からテストステップ3309に進む。テスト ステップ3309においては、実行エンジン802(第8図)が、その式の演算 子が関係演算子であるか否かを判定する。関係演算子は2つのオペランド、即ち lhs及びrhsに対して演算を行い、演算結果として2つのオペランドの値を 比較したブール値に対応する数値を有する項目を生成する演算子である。ブール 値は、“true”若しくは“false”の何れかである。関係演算子の具体 例には、“==”(等しい)、“>=”(大きいか若しくは等しい)、“<=” (小さいか若しくは等しい)、及び“!=”(等しくない)がある。 この式の演算子が関係演算子でない場合は、処理はテストステップ3309( 第33A図)から、後に説明するテストステップ3313に進む。逆に式の演算 子が関係演算子である場合は、処理はテストステップ3309からステップ33 10に進む。ステップ3310においては、実行エンジン802(第8図)が、 論理流れ図2900(第29図)に従って式のlhsを式として評価するととも に、演算pを適用する。ステップ3310(第33A図)から、処理はステップ 3311へ進み、ここで実行エンジン802(第8図)が論理流れ図2900( 第29図)に従って、式のrhsの評価を行うとともに、演算pを適用する。演 算pは式のlhs及びrhsの双方に適用されるが、これはそれぞれが比較のた めに使用されるからである。このような比較処理において、式のlhs若しくは rhsの何れかが不適切に使用されている場合には、上述のように演算が適用さ れることによりエラーメッセージが生成される。 処理はステップ3311(第33A図)からステップ3312に進み、ここで 式の関係演算子が用いられて式の評価が行われる。ステップ3312は、前に説 明したステップ3302に類似している。ステップ3312の終了後、処理は論 理流れ図2902に従って、即ちステップ29 02(第29図)に従って終了する。単項演算子 上述のように、この式の演算子が関係演算子でない場合には、処理はテストス テップ3309(第33A図)からテストステップ3313に進む。テストステ ップ3313においては、実行エンジン802(第8図)が、式の演算子が単項 演算子であるか否かを、その式を表現する式構造体のフィールド“kind”2 202(第22図)と、単項演算子を示すデータとを比較することによって判定 する。単項演算子は、ただ1つのオペランドを有する演算を特定する演算子であ る。例えば、式“−a”は、ただ1つのオペランド“a”と、オペランド“a” に対して数値を負にする演算を特定する単項演算子“−”とを有する。式が1つ のオペランドを有し、かつ式構造体2200によって表現されている場合には、 その式のただ1つのオペランドが、フィールド“operands”2210の 第1の要素である式構造体によって表現される。 式の演算子が単項演算子でない場合には、処理はテストステップ3313(第 33A図)から、後に説明するテストステップ3313(第33B図)に進む。 逆に、式の演算子が単項演算子である場合には、処理はテストステップ3313 (第33A図)からステップ3314に進む。ステップ3314においては、実 行エンジン802(第8図)が、論理流れ図2900(第29図)に従って式の オペランドを式として評価するとともに、演算cを適用する。演算cは、式のオ ペランドに適用されるが、これはこのオペランドが計算において使用されるから である。このような計算において式のオペランドが不適切に使用されている場合 には、上述のように、演算を適用することによりエラーメッセージが生成される 。 処理はステップ3314(第33A図)からステップ3315に進み、 ここでは式の単項演算子が式の評価のために用いられる。ステップ3315は上 述のステップ3308に類似している。ステップ3315の終了後、処理は論理 流れ図2902、即ちステップ2902(第29図)に従って終了する。特定の演算子による処理 上述のように、式の演算子が単項演算子でない場合には、処理はテストステッ プ3313(第33A図)からテストステップ3317(第33B図)に進む。 更に上述したように、論理流れ図2902における上述のステップでは、式の演 算子の型に従って式の処理が行われる。テストステップ317及びそれに続くス テップにおいて、式の演算子の型がテストステップ3301(第33A図)、3 303、3305、3309及び3313で判定される演算子の型の中に入って いない場合に、実行エンジン802(第8図)が、式の特定の演算子に従って式 の処理を行う。インクリメント演算子またはデクリメント演算子 ステップ3317(第33B図)においては、実行エンジン802(第8図) が、式の演算子とインクリメント演算子及びデクリメント演算子とを比較する。 つまり、式構造体2200(第22図)がその式を表現している場合、実行エン ジン802は、フィールド“kind”2202(第22図)と、インクリメン ト演算子若しくはデクリメント演算子を指定するデータとを比較する。インクリ メント演算子若しくはデクリメント演算子は、1つのオペランドに対してそのオ ペランドを1づつ増減させる演算を施す。その式の演算子がインクリメント演算 子でもデクリメント演算子でもない場合には、処理は、後に説明するテストステ ップ3320(第33B図)に進む。逆に、式の演算子がインクリメント演算子 またはデクリメント演算子である場合には、処理はテストステッ プ3317からステップ3318に進む。 ステップ3318においては、実行エンジン802(第8図)が、論理流れ図 2900(第29図)に従ってそのオペランドを評価し、演算cを適用する。演 算cを適用するのは、このオペランドが計算において使用されるからである。上 述のように、演算cをそのオペランドに対して適用することにより生じた何らか のエラーは検出され通知される。 処理はステップ3318(第33B図)からステップ3319に進み、ここで は式のインクリメント演算子またはデクリメント演算子が用いられて、その式の 評価が行われる。ステップ3319は、上述のステップ3308(第33A図) に類似している。ステップ3319(第33B図)の終了後、処理は論理流れ図 2902に従って、即ちステップ2902(第29図)に従って終了する。“Not”演算子 上述のように、式の演算子がインクリメント演算子でもデクリメント演算子で もない場合には、処理はテストステップ3317(第33B図)からテストステ ップ3320に進む。テストステップ3320においては、実行エンジン802 (第8図)が、その式を表す式構造体のフィールド“kind”2202(第2 2図)と“Not”演算子を指定するデータとを比較することによって、C言語 の“Not”演算子と式の演算子とを比較する。“Not”演算子は、ただ1つ のオペランドに対して演算を施し、そのオペランド自体をブール値項目として取 り扱って、オペランドの論理的否定のブール値に対応する値を有する項目を生成 する。ブール値項目は、真若しくは偽の何れかのブール値に対応する値を有する 項目である。 その式の演算子が“Not”演算子でない場合は、処理はテストステップ33 20(第33B図)からテストステップ3323に進む。逆に 式の演算子が“Not”演算子である場合は、処理はテストステップ3320か ら3321に進む。ステップ3321においては、実行エンジン802(第8図 )が、論理流れ図2900(第29図)に従ってオペランドの評価を行うととも に、演算pを施す。演算pを施すのは、このオペランドは真理値計算を行うのに 使用されるからである。上述のように、オペランドに演算pを適用することによ って生じたエラーは全て通知される。 処理はステップ3321(第33B図)からステップ3322に進み、ここで “Not”演算子がその式を評価するのに用いられる。ステップ3322は、前 に説明したステップ3308(第33A図)に類似している。ステップ3322 (第33B図)の終了後、処理は論理流れ図2902に従って、即ちステップ2 902(第29図)に従って終了する。“And”演算子及び“Or”演算子 上述のように、式の演算子が“NOt”演算子でない場合には、処理はテスト ステップ3320(第33B図)からテストステップ3323に進む。テストス テップ3323において、実行エンジン802(第8図)は、その式を表現する 式構造体のフィールド“kind”2202(第22図)と、“And”演算子 及び“Or”演算子を指定するデータとを比較することによって、C言語の“A nd”演算子及び“Or”演算子と式の演算子との比較を行う。この“And” 演算子及び“Or”演算子は2つのオペランド、即ちlhs及びrhsに演算を 施し、そのオペランドをブール値項目として取り扱ってそのブール値の論理積及 び論理和のブール値を有する項目を生成する。 式の演算子が“And”演算子でも“Or”演算子でもない場合には、処理は テストステップ3323(第33B図)からテストステップ3327に進む。逆 に、式の演算子が“And”演算子または“Or”演算 子である場合には、処理はテストステップ3323からステップ3324に進む 。 ステップ3324においては、実行エンジン802(第8図)が論理流れ図2 900(第29図)に従って、その式のlhsをその式そのものとして評価する とともに、演算pを施す。ステップ3324(第33B図)から、処理はステッ プ3325に進み、ここでは実行エンジン802(第8図)が、論理流れ図29 00(第29図)に従って式のrhsの評価を行うと共に、演算pを適用する。 演算pは式のlhs及びrhsの双方に施されるが、これはそれぞれが真理値計 算に用いられるからである。このような真理値計算において式のlhsまたはr hsの何れかを不適切に用いた場合には、上述のように演算pを適用することに よってエラーメッセージが生成される。 処理はステップ3325(第33B図)からステップ3326に進み、ここで 式の“And”演算子または“Or”演算子が用いられて、式の評価が行われる 。ステップ3326は、前述のステップ3308(第33A図)に類似している 。ステップ3326(第33B図)の終了後、処理は論理流れ図2902に従っ て、即ちステップ2902(第29図)に従って終了する。複合演算子 上述のように、式の演算子が“And”演算子でも“Or”演算子でもない場 合には、処理はテストステップ3323(第33B図)からテストステップ33 27に進む。テストステップ3327において、実行エンジン802(第8図) は、その式の演算子が複合演算子(compound operator)であるか否かを、その 式を表現する式構造体のフィールド“kind”2202(第22図)と、複合 演算子を指定するデータとを比較することによって判定する。C言語においては 、複合演算子、即ちカ ンマ(“,”)は、2つのオペランド、即ち式のlhs及びrhsに対して演算 を施し、演算結果としてrhsを評価した値を有する項目を生成する。つまり、 2つのオペランドは個別に評価され、式のrhsを評価した値が式の値になるの である。 式の演算子が複合演算子でない場合には、処理はテストステップ3327(第 33B図)からテストステップ3330に進む。逆に、式の演算子が複合演算子 である場合には、処理はテストステップ3327からステップ3328に進む。 ステップ3328においては、実行エンジン802(第8図)が論理流れ図2 900(第29図)に従って式のlhsをその式として評価し、また演算の適用 は行わない。ステップ3328(第33B図)から処理はステップ3329に進 み、ここでは実行エンジン802(第8図)が論理流れ図2900(第29図) に従って式のrhsを評価する。論理流れ図2900に従って、複合演算子を含 む式を評価する場合に施される演算は、ステップ3329(第33B図)におい てrhsを評価するときにrhsに施される演算と類似したものである。式のr hsの評価によって生成される項目は、その式そのものの項目として戻される。 ステップ3329(第33B図)の終了後、処理は論理流れ図2902に従って 、即ちステップ2902(第29図)に従って終了する。間接演算子 上述のように、式の演算子が複合演算子でない場合には、処理はテストステッ プ3327(第33B図)からテストステップ3330に進む。テストステップ 3330においては、実行エンジン802(第8図)がその式の演算子が間接演 算子(indirection operator)であるか否かを、その式を表す式構造体のフィー ルド“kind”2202(第22図)と間接演算子を指定するデータとを比較 することによって判定する。C 言語においては、間接演算子(即ち“*”)は1つのオペランドに対して演算を 施し、演算結果としてメモリ、即ちメモリ104(第1図)内のそのオペランド によって指定されたアドレスに格納された値を有する項目を生成する。例えば、 式“*a”は、メモリ内のアドレス“a”に格納された値を有する項目に対して 評価を行う。間接演算子は、配列の要素を参照するためにも使用され得る。例え ば、宣言“int array[10]”によって規定された配列の第2要素は、 “array[1]”または“*(array+1)”の何れかによって特定され 得る。後者の式はその配列の要素のサイズのアレイの始まる点を0としたときの 相対位置(オフセット)1に格納された値、即ち配列の第2要素の値を参照する ものである。 その式の演算子が間接演算子でない場合には、処理はテストステップ3330 (第33B図)からテストステップ3335に進む。逆に、その式の演算子が間 接演算子である場合には、処理はテストステップ3330からテストステップ3 331に進む。 テストステップ3331においては、実行エンジン802(第8図)がそのオ ペランドが配列であるか否かを判定する。式構造体2220(第22図)がその オペランドを表現している場合には、フィールド“type”2204(第22 図)がそのオペランドの型を指定する型構造体を指定する。例えば、型構造体1 612(第17図)が式構造体2220のフィールド“type”2204(第 22図)によって指定されている場合には、実行エンジン802(第8図)がそ のオペランドが配列であるか否かを、フィールド“kind”1702(第17 図)と配列を指定するデータとを比較することによって判定する。 そのオペランドが配列である場合には、処理はテストステップ3331(第3 3B図)からステップ3332に進み、ここで実行エンジン8 02(第8図)が、論理流れ図2900(第29図)に従って、そのオペランド をその式として評価し、かつ演算は適用しないが、その演算子を、配列の間接ア ドレス指定手段として、即ち上述の“*(array+1)”の型式の配列の1 つの要素の参照要素として取り扱う。逆に、オペランドが配列でない場合には、 処理はテストステップ3331(第33B図)からステップ3333に進み、こ こでは実行エンジン802(第8図)が、論理流れ図2900(第29図)に従 ってその式のオペランドを評価するとともに、演算iを適用し、かつその演算子 を間接アドレスを指定するポインタ、即ち上述の式“*a”のためのものとして 取り扱う。 処理はステップ3332(第33B図)またはステップ3333の何れかから 、ステップ3334に進み、ここでは実行エンジン802(第8図)が、そのオ ペランドをデリファレンスする。オペランドのデリファレンスにおいて、その式 の評価により、オペランドが指定する項目が生成される。オペランドが項目を指 定していない場合には、式はNULLに評価される。ステップ3334(第33 B図)の終了後、論理流れ図2902に従って、即ちステップ2902(第29 図)に従って処理は終了する。コンポーネント参照演算子 上述のように、式の演算子が間接演算子でない場合には、処理はテストステッ プ3330(第33B図)からテストステップ3335に進む。テストステップ 3335においては、実行エンジン802(第8図)が、その式の演算子がコン ポーネント参照演算子であるか否かを、その式を表現する式構造体のフィールド “kind”2202(第22図)と、コンポーネント参照演算子を指定するデ ータとを比較することによって判定する。C言語においては、コンポーネント参 照演算子(即ち、“.” または“−>”)は、2つのオペランド、即ち式のlhs及びrhsに対して演 算を施し、演算結果としてrhsによって特定されたlhsのフィールド項目を 生成する。例えば、宣言“struct{int a;char *b}c,* d”が宣言しているのは、項目“c”及び第2項目に対するポインタ“d”であ って、それぞれが、データの型“int”、即ち整数の第1フィールド項目“a ”及びデータの型が“char”、即ち文字であるデータを指定する第2フィー ルド項目“b”を有することを表している。式“c.a”は、項目“c”の整数 フィールド項目に評価される。同様に、式“d−>a”は、ポインタ“d”が指 定する項目の整数フィールド項目に評価される。 式の演算子がコンポーネント参照演算子でない場合には、処理はテストステッ プ3335(第33B図)からテストステップ3338(第33C図)に進む。 逆に式の演算子がコンポーネント参照演算子である場合には、処理はテストステ ップ3335(第33B図)からステップ3336に進む。 ステップ3336においては、実行エンジン802(第8図)が論理流れ図2 900(第29図)に従って式のlhsを評価し、また演算は施されない。ステ ップ3336(第33B図)から、処理はステップ3337に進み、ここで実行 エンジン802(第8図)が、式のrhsによって指定されるフィールドを検索 する。ステップ3337の終了後、処理は論理流れ図2902に従って、即ちス テップ2902(第29図)に従って終了する。配列参照演算子 上述のように、式の演算子がコンポーネント演算子でない場合には、処理はテ ストステップ3335(第33B図)からテストステップ3338(第33C図 )に進む。テストステップ3338においては、実行 エンジン802(第8図)が式の演算子が配列参照演算子であるか否かを、その 式を表現する式構造体のフィールド“kind”2202(第22図)と、配列 参照演算子を指定するデータとの比較を行うことによって判定する。C言語にお いては、配列参照演算子(即ち、“ [] ”)は2つのオペランド、即ちその式の lhs及びrhsに対して演算を施し、演算結果として、rhsにより特定され るlhsの配列の要素を生成する。例えば、宣言“int array[10] ”が宣言するのは10個の整数の配列である。式“array[b]”は、配列 “array”の、項目“b”によって指定される位置に存在する整数の要素に 評価される。項目“b”、即ちrhsは指標(index)と称されることもある。 C言語においては、配列参照演算子は、非配列ポインタからのオフセットを参 照するためにも使用されうる。例えば、“datum”が型が“int”である 変数である場合、式“datum[2]”は、メモリ104(第1図)の、変数 “datum”を表現する項目から2メモリ位置だけオフセットした位置に格納 されたデータに評価される。2メモリ位置は、変数“datum”の型、即ちデ ータの型“int”の変数2つ分の長さに等しい。上述のように、C言語の文脈 においては、“array[i]”及び“*(array+i)”は、等価な式 である(Cスタンダードのセクション6.3、2.1参照)。 その式の演算子が配列参照演算子でない場合は、処理はテストステップ333 8(第33C図)からテストステップ3344に進む。逆に、この式の演算子が 配列参照演算子である場合には、処理はテストステップ3338からステップ3 339に進む。 ステップ3339において、実行エンジン(第8図)は、論理流れ図2900 (第29図)に従ってその式の指標を評価し、また演算cを施 す。演算cを施すのは、この指標は計算に使用されるからである。ステップ33 39(第33C図)から、処理はテストステップ3340に進み、ここで実行エ ンジン802(第8図)が、lhsが配列であるか否かを、テストステップ33 31(第33B図)に関連して前に説明した方法で判定する。lhsが配列であ る場合には、処理はテストステップ3340(第33C図)からステップ334 1に進み、ここで実行エンジン802(第8図)が、論理流れ図2900(第2 図)に従ってその式のrhsを指標として評価する。このとき演算は施されない 。逆に、lhsが配列でない場合には、処理はテストステップ3340(第33 C図)からステップ3342に進み、ここで実行エンジン802(第8図)が論 理流れ図2900(第29図)に従ってその式のrhsをポインタとして評価し 、かつ演算iを施す。 処理はステップ3341(第33C図)若しくはステップ3342の何れかか ら、ステップ3343に進み、ここで実行エンジン802(第8図)が、lhs によって特定された配列の、rhsによって指定された要素を検索する。ステッ プ3343(第33C図)の終了後、処理は論理流れ図2902に従って、即ち ステップ2902(第29図)に従って終了する。アドレス演算子 上述のように、その式の演算子が配列演算子でない場合には、処理はテストス テップ3338(第33C図)からテストステップ3344に進む。テストステ ップ3344においては、実行エンジン802(第8図)が、その式の演算子が アドレス演算子であるか否かを、その式を表現する式構造体のフィールド“ki nd”2202と、アドレス演算子を指定するデータとを比較することによって 判定する。C言語においては、アドレス演算子(即ち“&”)は、1つのオペラ ンドに対して演算 を施し、演算結果としてオペランドのアドレスがその値である項目を生成する。 例えば、式“&a”は、メモリ、即ちメモリ104内の、項目“a”が格納され ているアドレスをその値とする項目に評価される。 その式の演算子がアドレス演算子でない場合には、処理はテストステップ33 44(第33C図)からテストステップ3347に進む。逆に、その式の演算子 がアドレス演算子である場合には、処理はテストステップ3344からステップ 3345に進む。 ステップ3345においては、実行エンジン802(第8図)が、論理流れ図 2900(第29図)に従ってオペランドの評価を行い、このとき他の演算は施 されない。ステップ3345(第33C図)から、処理はテストステップ334 6に進み、ここでこのアドレス演算子はその式を評価するのに使用される。つま り、オペランドのアドレスが決定されるのである。ステップ3346は、前に説 明したステップ3308(第33A図)に類似している。ステップ3346(第 33C図)が終了した後、処理は論理流れ図2902に従って、即ちステップ2 902(第29図)に従って終了する。関数の呼出し 上述のように、式の演算子がアドレス演算子でない場合には、処理はテストス テップ3344(第33C図)からテストステップ3347に進む。テストステ ップ3347においては、実行エンジン802(第8図)が、その式の演算子が 関数の呼出しであるか否かを、その式を表現する式構造体のフィールド“kin d”2202(第22図)と、関数の呼出しを指定するデータとを比較すること によって判定する。C言語においては、関数演算子(即ち“ () ”)は、関数の 呼出しを意味する。関数の呼出しは、その関数の戻り値項目(returned item) に評価される。例えば、式“abc () ”は、識別子が“abc”である関数の 実行の 呼出しを行う。同様に、式“xyz(d,e,f)”は、その識別子が“xyz ”である、パラメータとして項目d,e,及びfが与えられている関数を呼び出 す。 式の演算子が関数の呼出しでない場合には、処理はテストステップ3347( 第33C図)からテストステップ3353に進む。逆に、式の演算子が関数の呼 出しである場合には、処理はテストステップ3347からループステップ334 8に進む。 ループステップ3348、ステップ3349、及びNEXTステップ3350 は、各パラメータの評価が行われるループを形成する。ステップ3349におい て、実行エンジン802(第8図)は、論理流れ図2900(第29図)に従っ てパラメータの評価を行い、また演算は施さない。式構造体2200(第22図 )がその式を表現している場合、即ち関数の呼出しを表現している場合には、( i)フィールド“numoperands”2208が呼び出された関数のパラ メータの数をオペランドの数として特定し、(ii)フィールド“operan ds”2210は式構造体の配列であり、この式構造体の各要素は呼び出された 関数のパラメータを表現する式構造体である。各パラメータの評価は、フィール ド“operands”2210の各要素を評価することによって行われる。呼 び出された関数のパラメータを表現する項目の配列は、ループステップ3348 、ステップ3349、及びNEXTステップ3350によって形成されたループ において構成され、後に(第46図に関連して)詳しく説明するように、ステッ プ3352において呼び出された関数の実行をエミュレートするのに用いられる 。 ひとたび呼出される関数の各パラメータが評価されると、処理はループステッ プ3348(第33C図)からステップ3351に進む。ステップ3351にお いては、実行エンジン802(第8図)が、呼び出さ れる関数のエクスターナルにおける実行の効果を表現する関数モデル構造体を抽 出する。関数モデル構造体は、第11図〜第13図に関連して以前に説明してあ る。ステップ3351(第33C図)から、処理はステップ3352に進み、こ こで実行エンジン802(第8図)が、呼び出される関数の実行のエミュレート については後に詳しく説明する。ここで簡単に説明すると呼び出される関数のエ ミュレートは、上述の関数モデル(3)、(4)、及び(5)から形成される関 数モデル構造体のような、関数モデル構造体において特定された演算を適用する ことによって行われる。この呼び出された関数に対応する関数モデル構造体は、 呼び出される関数のエクスターナルにおける実行の効果を表現する演算を特定す る。ステップ3352(第33C図)の終了後、処理は、論理流れ図2902に 従って、即ちステップ2902(第29図)に従って終了する。代入 上述のように、その式の演算子が関数の呼出しでない場合には、処理はテスト ステップ3347(第33C図)からテストステップ3353に進む。テストス テップ3353においては、実行エンジン802(第8図)が、その関数の演算 子が代入演算子であるか否かをその式を表現する式構造体のフィールド“kin d”2202(第22図)と、代入演算子を指定するデータとを比較することに よって判定する。C言語においては、代入演算子(即ち“=”)が、2つのオペ ランド、即ちlhs及びrhsに対して演算を施し、rhsの値をlhsに移す 。代入は、移された値を有する項目に評価される。例えば、式“a=b”は、項 目“b”の値を項目“a”に移し、項目“a”の新たな値を有する項目に評価さ れる。 式の演算子が代入演算子でない場合には、処理は論理流れ図2902 (第33A図〜第33C図)に従って、即ちステップ2902(第29図)に従 って終了し、論理流れ図2902に従って処理された式はNULL値に評価され る。NULL値は、有効値を持たない状態を示すために用いられる。 実行エンジン802(第8図)が、コンピュータプロセス内におけるサブジェ クト関数の実行の文脈を欠いた式を適切に評価することができない場合には、式 はNULL値に評価される。最も重要なことは、式の適切な評価ではなく、エク スターナル及びリソースのそれぞれの状態変化を追跡することである。この状態 の正確な追跡を確実に行うために、式の評価はできる限り多く行われる。 逆にテストステップ3353(第33C図)において、式の演算子が代入演算 子である場合には、処理はステップ3353に進む。ステップ3353において は、実行エンジン802(第8図)は、論理流れ図2900(第29図)に従っ て式のlhsを式そのものとして評価し、また演算は施さない。ステップ335 4(第33C図)から、処理はステップ3355に進み、ここでは実行エンジン 802(第8図)が論理流れ図2900(第29図)に従って式のrhsの評価 を行い、また演算は施さない。処理はステップ3355(第33C図)からステ ップ3356に進み、ここでは実行エンジン802(第8図)が、式のrhsの 評価によって生成された項目の値を、式のlhsの評価によって生成された項目 に代入する。ステップ3356については、後に論理流れ図3356(第45図 )に関連して詳細に説明する。ステップ3356(第33C図)の終了後、処理 は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終 了する。 従って、ステップ2804(第28図)においては、実行エンジン802(第 8図)が、論理流れ図2900(第29図)に従って式の評価 を行う。式の評価においては、実行エンジン802(第8図)が、前に詳しく説 明したように、必要な場合にはエクスターナル及びリソースのそれぞれの状態に 対して演算を施す。前に説明したように、式の評価に際しての演算の適用によっ て生ずる何らかの状態違反は、コンピュータプログラム610におけるエラーと してユーザに通知される。宣言の処理 上述のように、宣言ステートメントはステップ2808(第28図)において 処理されるが、このステップ2808は論理流れ図2808(第34図)におい て詳細に示されている。宣言ステートメントは、そのフィールド“pointe rs”が2つのポインタの配列であるステートメント構造体1416(第21図 )のようなステートメント構造体によって表現される。上述のように、宣言ステ ートメントを表現するステートメント構造体の第1ポインタは宣言構造体150 6(第16図)のような宣言構造体を指定し、第2ポインタは宣言された項目の 初期値を定める式構造体を指定する。 論理流れ図2808(第34図)に従った処理は、ステップ3402から開始 され、このステップでは、項目構造体2700(第27図)のような項目構造体 が、宣言された項目に対して生成される。生成された項目構造体を指定するポイ ンタは、宣言構造体1506のフィールド“item”1608(第16図)に 格納される。フィールド“type code”2712(第27図)は、宣言 において指定されたデータの型に従って、即ち宣言構造体1506のフィールド “type”1606(第16図)に従って設定される。フィールド“init ialized”2714(第27図)は、その項目が初期化されていないこと を示すように設定される。 処理はステップ3402(第34図)からテストステップ3404に 進み、ここでは実行エンジン802(第8図)が、その宣言ステートメントが、 宣言された項目のための初期値を特定しているか否か、即ちその宣言ステートメ ントを表現するステートメント構造体の第2ポインタが、式構造体を指定してい るか、若しくはNULL値であるか判定する。その宣言ステートメントが初期値 を特定していない場合、即ち第2ポインタがNULLである場合には、処理は論 理流れ図2808(第34図)に従って終了する。逆にその宣言ステートメント が初期値を特定する式を含んでいる場合、即ち第2ポインタが式ステートメント を指定している場合には、処理はテストステップ3404からステップ3406 に進む。ステップ3406において、実行エンジン802(第8図)が、前に詳 しく説明したように、論理流れ図2900(第29図)に従って式構造体によっ て表現された式を評価する。論理流れ図2900に従って式を評価するときに、 演算は施されない。処理はステップ3406(第34図)からステップ3408 に進み、そこでは式が評価される項目が宣言された項目に代入される。更に、宣 言された項目を表現する項目構造体のフィールド“initialized”2 714(第27図)が、その項目が初期化されたことを示すように設定される。 ステップ3408(第34図)の終了後、処理は論理流れ図2808に従って、 ステップ2808(第28図)に従って終了する。従ってステップ2808にお いては、新たな項目が生成され、初期値が指定される場合にはその新たな項目が その初期値を有するように初期化される。決定処理 上述のように、実行エンジン802(第8図)は、ステップ2812(第28 図)において決定処理、即ち“if”ステートメントの処理を行う。ここでステ ップ2812は論理流れ図2812(第35図)に詳細に示されている。処理は ステップ3502から開始されるが、ここで は実行エンジン802(第8図)が、論理流れ図2900(第29図)に従って “if”ステートメントの述語である式の評価を行い、演算pを適用する。C言 語においては、“if”ステートメントは述語及び第2ステートメントを含む。 この述語は、第2ステートメントが実行されるか否かを決定するブール値項目に 評価される式である。例えば、ステートメント“if(a==b)ci1;”は 、述語、即ち式“a==b”が、その値が“true”であるブール値項目に評 価される場合、即ち項目“a”が項目“b”と等しい場合にのみ、第2ステート メント、即ちステートメント“ci1”が実行されるという処理を特定する。項 目“a”が項目“b”と等しくない場合には、ステートメント“ci1”は実行 されない。 処理はステップ3502(第35図)からテストステップ3504に進み、こ こでは実行エンジン802(第8図)が、述語が既知の値を有する項目に評価さ れたか否かを判定する。実行エンジン802はこの判定を、述語の評価によって 生成された項目とNULLとを比較することによって行う。上述のように、実行 エンジン802が式の評価を適切に行うことができない場合には、式はNULL に評価される。述語が既知の値を有する項目に、即ちNULL以外の値に評価さ れた場合には、処理はテストステップ3504(第35図)からテストステップ 3506に進む。 テストステップ3506においては、実行エンジン802(第8図)が、述語 の評価によって生成された項目の値とブール値“true”とを比較する。述語 が、“true”のブール値を有するブール値項目に評価された場合には、処理 はステップ3508(第35図)に進み、そこで実行エンジン802(第8図) が、“if”ステートメントの第2ステートメントを実行する。第2ステートメ ントは、前に詳しく説明し たように論理流れ図2800(第28図)に従って処理される。従って、論理流 れ図2800は再帰的に実行される。 一方、述語がブール値“false”に評価された場合には、処理はテストス テップ3506(第28図)からステップ3510に進み、そこで実行エンジン 802(第8図)が、後に詳述する制御レコードに、“else”条件を示すデ ータを格納する。制御レコードは、後に詳しく述べるように、サブジェクト関数 の実行のエミュレーションにおいて適切な制御の流れを与えるために用いられる 。ステップ3508(第35図)またはステップ3510の何れかが終了した後 、処理は論理流れ図2812に従って、即ちステップ2812(第28図)に従 って終了する。 上述のように、実行エンジン802(第8図)は、テストステップ3504( 第35図)において、述語が既知の値に評価された否かを判定する。述語が既知 の値に評価されない場合、即ちNULLに評価されるか、未知の値を有する項目 に評価された場合には、処理はテストステップ3504からステップ3512に 進む。ステップ3512において、実行エンジン802(第8図)はその述語が 評価されうるブール値をシミュレートする。一実施例においては、実行エンジン 812(第8図)は、ブール値“true”またはブール値“false”から ランダムに選択を行う。ステップ3512(第35図)から、処理はステップ3 514に進む。 ステップ3514において、実行エンジン802(第8図)は、ステップ35 12(第35図)において選択されたブール値から、できる限り多くの推測を行 う。例えば、述語が式“a&&b”(即ちa AND b)であり、述語がブー ル値“true”を有するように選択された場合、実行エンジン802(第8図 )は、項目“a”と項目“b”の双方がブ ール値“true”を有するものと推測する。a及びbの双方が“true”の 場合にのみ式“a&&b”が“true”と評価されることから、この推測がな され得るのである。ステップ3514(第35図)は、論理流れ図3600(第 36図)に従った述語の処理を含んでいる。論理流れ図3600の各ステップに おいては、その式の評価により得られることが推定される推定ブール値から、式 における値を推測する。“Not”演算子 論理流れ図3600に従った処理はテストステップ3602から開始されるが 、このステップでは実行エンジン802(第8図)が、式の演算値と、“NOt ”演算子との比較を行う、即ちその式を表現する式構造体のフィールド“kin d”2202(第22図)と、“Not”演算子を特定するデータとの比較を行 う。“Not”演算子(即ち“!”)は、1つのオペランドに対して演算を施し 、演算結果としてそのオペランドの値の論理的否定をその値とする項目を生成す る。例えば、式“!a”は、オペランド、即ち式“a”の否定である。 式の演算子が“Not”演算子でない場合には、処理はテストステップ360 2(第36図)から、以下に説明するテストステップ3606に進む。逆に、式 の演算子が“Not”演算子である場合には、処理はテストステップ3602か らステップ3606に進む。ステップ3606においては、実行エンジン802 (第8図)が論理流れ図3600(第36図)に従ってオペランドを処理し、推 定値の論理的否定を推定する。例えば、式“!(a&&b)”、即ちNOT(a AND b)が、“true”と推定された場合には、式“a&&b”が“f alse”と推定される。即ち、論理流れ図3600に従った処理は再帰的に実 行される。ステップ3604の終了後、処理は論理流れ図3600に従って終了 する。“And”演算子または“Or”演算子 上述のように、式の演算子が“Not”演算子でない場合には、処理はテスト ステップ3602(第36図)からテストステップ3606に進む。テストステ ップ3606においては、実行エンジン802(第8図)が、式の演算子と“A nd”演算子及び“Or”演算子とを比較する。つまり、実行エンジン802は 、その式を表現する式構造体のフィールド“kind”2202(第22図)と “And”演算子及び“Or”演算子を指定するデータとの比較を行うのである 。上述のように、“And”演算子及び“Or”演算子(即ち“&&”及び“| |”)は、2つのオペランド、即ちlhs及びrhsに演算を施し、演算結果と して2つのオペランドの値の論理積及び論理和をその値とする項目を生成する。 式の演算子が“And”演算子でも“Or”演算子でもない場合には、処理はテ ストステップ3606(第36図)から、後に説明するテストステップ3610 に進む。逆に、式の演算子が“And”演算子、若しくは“Or”演算子の何れ かである場合には、処理はテストステップ3606からステップ3608に進む 。 ステップ3608はテストステップ3702から処理が開始される論理流れ図 3608(第37図)に詳細に示されている。テストステップ3702において は、実行エンジン802(第8図)が、式の演算子と、“And”演算子との比 較を行い、更にその式が評価されたときに推定されるブール値、即ち推定値と、 ブール値“true”とを比較する。演算子が“And”演算子でない場合、若 しくは推定値が“true”でない場合には、処理はテストステップ3702か ら、後に説明するテストステップ3706に進む。逆に演算子が“And”演算 子である場合、及び推定値が“true”である場合には、処理はテストステッ プ3702からステップ3704に進む。 ステップ3704においては、各オペランド、即ち式のlhs及びrhsのそ れぞれが、論理流れ図3600(第36図)に従って推定値“true”と共に 1つの式として処理される。このような、lhs及びrhsの双方が“true ”であるという推測は適切である。というのは、式“a&&b”が“true” である場合には、両オペランド、即ち式“a”及び“b”が共に“true”で なければならないからである。上述のように、C言語の演算子“&&”は論理積 演算を意味する。ステップ3704(第37図)の終了後、処理は論理流れ図3 608に従って、即ちステップ3608(第36図)に従って終了する。 上述のように、演算子が“And”演算子でなく、若しくは推定値が“tru e”でない場合には、処理はテストステップ3702(第37図)からテストス テップ3706に進む。テストステップ3706においては、実行エンジン80 2(第8図)が、式の演算子と“Or”演算子との比較を行い、かつ推定値とブ ール値“false”との比較を行う。式の演算子が“Or”演算子でなく、若 しくは推定値が“false”でない場合には、処理は論理流れ図3608に従 って、即ちステップ3608(第36図)に従って終了する。逆に、演算子が“ Or”演算子であり、推定値が“false”である場合には、処理はテストス テップ3706(第37図)からステップ3708に進む。 ステップ3708において、各オペランド、即ち式のlhs及びrhsのそれ ぞれが、論理流れ図3600(第36図)に従って、推定値“false”と共 に1つの式として処理される。このようなlhs及びrhsが“false”で あるという推測は適切である。というのは、表現“a||b”が“false” である場合には、両オペランド、即ち“a”及び“b”が共に“false”で なければならないからである。上述のように、C言語の演算子“||”は、論理 和演算を意味する。ス テップ3708(第37図)の終了後、処理は論理流れ図3608に従って、即 ちステップ3608(第36図)に従って終了する。 ステップ3608の終了後、処理は論理流れ図3600に従って終了する。関係演算子 上述のように、式の演算子が“And”演算子でも、“Or”演算子でもない 場合には、処理はテストステップ3606からテストステップ3610に進む。 テストステップ3610においては、実行エンジン802(第8図)が式の演算 子と、以下の関係演算子との比較を行う。その関係演算子とは即ち、より小さい (“<”)、より小さいか若しくは等しい(“<=”)、より大きい(“>”) 、より大きいか若しくは等しい(“>=”)、等しい(“==”)、及び等しく ない(“!=”)という関係を表す演算子である。詳述すると、実行エンジン8 02は、その式を表現する式構造体のフィールド“kind”2202(第22 図)と、これらの関係演算子のそれぞれを指定するデータとの比較を行うのであ る。上述のように、関係演算子は、2つのオペランド、即ち式のlhs及びrh sに演算を施し、演算結果として、lhsとrhsとの関係に対応する値を有す るブール値項目を生成する。式の演算子が関係演算子でない場合には、処理はテ ストステップ3610(第36図)から、後に説明するテストステップ3614 に進む。逆に式の演算子が関係演算子である場合には、処理はテストステップ3 610からステップ3612に進む。 ステップ3612においては、実行エンジン802(第8図)が、関係演算子 の評価を行う。ステップ3612(第36図)は、ステップ3802から処理が 開始される論理流れ図3612(第38図)に詳細が示されている。ステップ3 802においては、実行エンジン802(第 8図)が、lhs及びrhsの双方が既知であるか否か即ち既知の値を有する項 目に評価されるか否かということ、及びlhs及びrhsの双方が未知であるか 否か、即ち未知の値を有する項目に評価されるか否かということを判定する。項 目構造体2700(第27図)によって表現される項目が未知の値を有する場合 には、フィールド“type code”2712が項目の型が未知であること を表す。式のlhs及びrhsの双方が既知であるか、若しくはその双方が未知 の場合には、論理流れ図3612(第38図)に従って、即ちステップ3612 (第36図)に従って処理が終了するが、これは両オペランドが既知である場合 には推測すべきものがなく、また両オペランドが共に未知の場合には推測し得る ものがないからである。逆に、オペランドの一方が既知で他方が未知の場合には 、処理はテストステップ3802(第38図)からテストステップ3804に進 む。 テストステップ3804においては、実行エンジン802(第8図)が、何れ かのオペランドが未定義であるか否かを判定する。オペランドが項目構造体によ って表現される項目に評価されない場合、即ちオペランドがNULL値に評価さ れる場合にはそのオペランドは未定義である。このような場合においては、推測 値を代入すべき項目は存在しない。従って、一方のオペランドが未定義である場 合には、処理は論理流れ図3612(第38図)に従って、即ちステップ361 2(第36図)に従って終了する。逆に両オペランドが共に定義されている場合 には、処理はテストステップ3804(第38図)から、テストステップ380 6に進む。 テストステップ3806においては、実行エンジン802(第8図)が、式の 演算子と“=”演算子及び“not equal”演算子とを比較し、推定値と ブール値“true”及び“false”との比較を 行う。(i)式の演算子が“=”演算子であり、推定値が“true”であると いう条件、及び(ii)式の演算子が“not equal”演算子であり、推 定値が“false”であるという条件の双方が満たされていない場合には、処 理はテストステップ3806(第38図)から後に説明するテストステップ38 14に進む。逆に、(i)式の演算子が“=”演算子であり、推定値が“tru e”であるという条件、及び(ii)式の演算子が“not equal”演算 子であり、推定値が“false”であるという条件の何れか一方が満たされて いる場合には、処理はテストステップ3806からテストステップ3808に進 む。 テストステップ3808において、1つのオペランドが既知の値であり、他方 のオペランドは未知の値を有する。その値が既知であるオペランドは、“kno wn item”に評価される。その値が未知のオペランドは“unknown item”に評価される。更に、テストステップ3808においては、2つの オペランドが等しい値を有することが推定される。テストステップ3808にお いて、実行エンジン802(第8図)は、既知の項目がNULL値を有するか否 かを判定する。(i)項目の型が、フィールド“type code”で、即ち 項目構造体2700のフィールド“type code”2712(第27図) で指定されているように、“long”または“pointer”の何れかであ ることを示しているという条件、及び(ii)項目の値が、フィールド“val ue”において、即ち項目構造体2700のフィールド“value”2706 において指定されているように、0であることを示しているという条件の双方が 満たされている場合には、その項目はNULL値を有する。 既知の項目がNULL値を有する場合、処理はテストステップ380 8(第38図)からステップ3810に進み、ここでは演算xを施すことにより 、その末知の項目に関連するリソースに、無効という印付けがなされる。リソー スが関連付けられた未知の項目の値が、その値がNULLである既知の項目に等 しいと推定されることから、即ちそのリソースに対するポインタがNULLであ ると推定されることから、このリソースは無効である。 処理はステップ3810からステップ3812に進む。更に、既知の項目がN ULL値を有していない場合、処理はテストステップ3808から直接ステップ 3812に進む。ステップ3812においては、既知の項目の値が、以下に詳し く説明する方法で未知の値に代入される。従って、既知の項目の値は、その既知 の項目と未知の項目とが等しいと推定される場合には既知の項目の値から推測さ れる。ステップ3812が終了した後、処理は論理流れ図3612に従って、即 ちステップ3612(第36図)に従って終了する。 上述のように、(i)式の演算子が、“=”演算子であり、推定値が“tru e”であるという条件、及び(ii)式の演算子が“not equal”演算 子であり、推定値が“false”であるという条件の双方が満たされない場合 には、処理はテストステップ3806(第38図)からテストステップ3814 に進む。テストステップ3814においては、実行エンジン802(第8図)が 、(i)式の演算子が“not equal”演算子であり、推定値が“tru e”であるという条件を満たすか否か、または(ii)式の演算子が“=”演算 子であり、推定値が“false”であるという条件を満たすか否かということ を判定する。条件(i)も、条件(ii)も何れもが満たされない場合には、論 理流れ図3612に従って、即ちステップ3612(第36図)に従って処理が 終了する。そうでない場合、即ち条件(i)若しくは条 件(ii)の何れかが満たされる場合には、処理はテストステップ3814(第 38図)からテストステップ3816に進む。 テストステップ3816においては、実行エンジン802(第8図)が2つの オペランド、即ちlhs及びrhsが互いに等しくないことを推測する。既知の 項目がNULL値を有する場合は、未知の項目が非NULL値を有するものと推 測される。C言語の様々なインプリメンテーションの文脈においては、NULL は値ゼロである。従って、未知の項目は非ゼロ値を有するものと推測される。テ ストステップ3816(第38図)においては、実行エンジン802(第8図) が、既知の項目の値とNULLとを比較する。既知の項目の値がNULLでない 場合には、処理は論理流れ図3612(第38図)に従って終了する。逆に、既 知の項目の値がNULLである場合は、処理はテストステップ3818に進む。 テストステップ3818においては、実行エンジン802(第8図)が、状態 Qにあるリソースが既知の項目に関連付けられているか否かを判定する。上述の ように、リソースが割り当てられた状態、割り当てられていない状態、または無 効状態の何れにあるかが未知である場合には、リソースは状態Qにある。未知の 項目が状態Qにあるリソースと関連付けられている場合には、処理はステップ3 820(第38図)に進み、ここでは演算aが、その未知の項目に関連付けられ たリソースに対して施される。リソースが関連付けられている項目がNULLと 等しくないことが推定されていることから、そのリソースを明確に割り当てられ た状態におくために演算aが施されるのである。ステップ3820から、処理は ステップ3822に進む。更に、未知の項目が状態Qにあるリソースに関連付け られていない場合には、処理はテストステップ3818から直接ステップ382 2に進む。 ステップ3822において、その未知の項目を表現する項目構造体のフィール ド“type code”2712(第27図)は、その項目が非ゼロであるこ とを示すように設定され、その未知の項目を表現する項目構造体のフィールド“ invalid pointer”2720は、その未知の項目は無効ポインタ 、即ちNULL値を有していないことを示すように設定される。ステップ382 2の終了後、処理は論理流れ図3612に従って終了する。 従って、論理流れ図3612に従って、即ちステップ3612(第36図)に 従って、その式のオペランドの1つが既知であり、他のオペランドが既知ではな くかつ両オペランドが等しいと推定されるとき、若しくは等しくないと推定され ているときには推測がなされる。推測がなされるのは、式の両オペランドの値、 及び式のオペランドに関連するリソースの状態の双方についてである。ステップ 3612が終了した後、処理は論理流れ図3600に従って終了する。複合演算子 上述のように、式の演算子が関係演算子でない場合には、処理はテストステッ プ3610からテストステップ3614に進む。テストステップ3614におい て、実行エンジン802(第8図)は、式の演算子と複合演算子(“,”)とを 比較する。つまり、実行エンジン802は、その式を表現する式構造体のフィー ルド“kind”2202(第22図)と、複合演算子を指定するデータとの比 較を行うのである。複合演算子は2つのオペランド、即ちlhs及びrhsに対 して演算を施す。ここでlhs及びrhsの双方が評価され、式はrhsに評価 される。例えば、式“a,b”の評価では、オペランド“a”とオペランド“b ”の双方の評価を行った上で、その式“a,b”が“b”に評価される。 演算子が複合演算子である場合には、処理はステップ3616(第3 6図)に進み、そこでは実行エンジン802(第8図)が論理流れ図3600( 第36図)に従って処理を行い、推定値として、その式が評価されると推定され るブール値を与える。rhsの値はその式の推定値から推測されるが、これはそ の式がrhsに評価されるからである。例えば、式“a==b,c==d”が真 であると推定される場合には、rhS、即ち式“c==d”が真であると推測さ れる。従って、処理は論理流れ図3600に従って、ステップ3616において 、処理は論理流れ図3600に従って再帰的に式のrhsに施される。ステップ 3616の終了後、処理は論理流れ図3600に従って終了する。演算子が複合 演算子でない場合には、処理は論理流れ図3600に従って終了し、またステッ プ3616はスキップされる。 従って、上述のように、論理流れ図3600に従って、式及び部分式(subexp ression)を再帰的に処理することによって、実行エンジン802(第8図)は ステップ3514(第35図)において実行し得る限り、式の推定値から式の項 目及び式の項目に関連するリソースについての推測を行う。処理はステップ35 14から前に説明したテストステップ3506に進む。 従って、ステップ2812(第28図)において、論理流れ図3812に従い 、実行エンジン802(第8図)は“if”ステートメントにおける決定処理を 行うのである。戻り(return)処理 上述のように“return”ステートメントはステップ2816において処 理される。“return”ステートメントは、関数の実行を終了し、戻り値項 目が定義されている場合にはその関数の戻り値項目に値を代入する。ステップ2 816は、処理がステップ3902から開始される論理流れ図2816(第39 図)に詳細に示されている。 ステップ3902においては、実行エンジン802(第8図)が、“retu rn”ステートメントが戻り値項目を指定しているか否かを判定する。“ret urn”ステートメントは、それが式を含んでいる場合、戻り値項目を指定する 。例えば、ステートメント構造体1416(第21図)が“return”ステ ートメントを表現している場合、フィールド“pointers”2110は、 式構造体を指定する1つのポインタであるか、若しくはNULLである。“re turn”ステートメントが戻り値項目を指定する場合、即ちフィールド“po inters”2110が式構造体を指定している場合、処理はテストステップ 3902(第39図)からステップ3904に進み、ここで“return”ス テートメントの式が論理流れ図2900(第29図)に従って評価され、また、 演算は施されない。ステップ3904(第39図)において“return”ス テートメントの式の評価において演算は施されないが、前にステップ3306、 3307、及び3314(第33A図)に関連して説明したように、式のオペラ ンドに何らかの演算を施すことも可能である。ステップ3904(第39図)か ら処理はステップ3906に進み、ここでは実行エンジン802(第8図)がス テップ3904(第39図)において式の評価を行うことにより生成された項目 を、サブジェクト関数の戻り値項目を表現する項目構造体に代入する。1つの項 目の値を他の項目に代入することに関しては、後に詳しく説明する。 処理はステップ3906からステップ3908に進む。また、“return ”ステートメントが戻り値項目を指定していない場合、処理はテストステップ3 902から、直接ステップ3908に進む。ステップ3908においては、実行 エンジン802(第8図)が、後に詳述するように、サブジェクト関数の実行の エミュレーション時においてサブジェクト関数を通る制御の流れを与えるのに用 いられる“return” 条件を示すデータを、制御レコード内に格納する。ステップ3908(第39図 )の後、処理は論理流れ図2816に従って、即ちステップ2816(第28図 )に従って終了する。ブロック処理 多くの関数においては、ステートメントのブロックがその関数の挙動を規定す る。C言語の文脈においては、ステートメントのブロックは、それ自体がブロッ クステートメントである始め括弧、即ち“{”と、終わり括弧、即ち“}”との 間に囲まれている。C言語で規定される関数においては、一般的にステートメン トの第1ブロックが、ステートメントの第2ブロックを含んでいる。例えば、ソ ースコードの抜粋(1)は、第9行から第32行までのステートメントの第1ブ ロックの中に、第16行から第21行までのステートメントの第2ブロックを含 んでいる。このとき、ステートメントの第1ブロックは、ステートメントの第2 ブロックのスーパーブロックであり、ステートメントの第2ブロックはステート メントの第1ブロックのサブブロックである。 (p118b)上述のように、ブロックステートメント構造体は、ステートメ ント構造体、即ちブロックの第1ステートメントを表現しているステートメント 構造体1416(第21図)を指定するポインタを含む。ステートメント構造体 1416は上述のように、ブロックの各ステートメントを表現するステートメン ト構造体のシングルリンクトリスト(singly-linked list)を維持するために用 いられるフィールド“next”2106を含んでいる。上述のように、ブロッ クステートメントはステップ2820(第28図)において処理され、このステ ップ2820については論理流れ図2820(第40図)にその詳細が示されて おり、またこの論理流れ図は、ブロックのステートメントの実行のエミュレーシ ョンのためのステートメントのブロックのステートメント構造体 の処理について説明している。 ステップ4002においては、実行エンジン802(第8図)が、ブロックの 第1ステートメントを表現するステートメント構造体を検索する。上述のように 、そのブロックの第1ステートメントを表現するステートメント構造体は、ブロ ックステートメント構造体によって指定されている。検索されたステートメント 構造体は、現ステートメント構造体である。処理はステップ4002(第40図 )からテストステップ4004に進む。 テストステップ4004においては、実行エンジン802(第8図)が、現ス テートメント構造体が“else”ステートメントを表現し、制御レコードが“ else”条件を示しているか否かを判定する。C言語においては、“else ”ステートメントは周知のものであり、Cスタンダードのセクション6.6.4 .1に記載されている。ステートメント構造体1416(第21図)のようなス テートメント構造体は、フィールド“kind”2102がそのように示されて いる場合には、“else”ステートメントを表現する。制御レコードは、サブ ジェクト関数の実行のエミュレーション時に制御の流れを管理するために、実行 エンジン802(第8図)内部に維持されている。ステップ3510(第35図 )に関連して上述したように、制御レコードは、“if”ステートメントを処理 するときに“else”条件を示すように設定され、“if”ステートメントの 述語がブール値“false”に評価される。現ステートメント構造体が“el se”ステートメントを表現していないか、若しくは制御レコードが“else ”条件を示していない場合には、処理はテストステップ4004(第40図)か らステップ4006に進み、ここで現ステートメント構造体によって表現された ステートメントの実行が、上述のように、論理流れ図2800(第28図)に従 ってエ ミュレートされる。逆に、現ステートメント構造体が“else”ステートメン トを表現し、かつ制御レコードが“else”条件を示していない場合には、処 理はテストステップ4004(第40図)から以下に説明するステップ4014 に進み、ステップ4006はバイパスされる。 上述のように、ステートメントのブロックはサブブロックを含み得る。また、 上述のように、ステップ4006において、現ステートメント構造体は論理流れ 図2800(第28図)に従って処理される。従って、ステップ4006(第4 0図)におけるブロックステートメントの実行により、ステップ2820(第2 8図)が再帰的に実行され、従って論理流れ図2820(第40図)の各ステッ プが再帰的に実行されて、サブブロックの実行のエミュレーションが行われる。 ひとたびサブブロックのステートメントが論理流れ図2820に従って処理され ると、ステップ4006におけるブロックステートメントの処理は完了し、サブ ブロックのステートメントの論理流れ図2820に従った処理は続行される。処 理はステップ4006からテストステップ4008に進む。 テストステップ4008においては、実行エンジン802(第8図)が、論理 流れ図2800(第28図)に関連して上述したようにステートメントの実行の エミュレーションによって設定された制御レコードと、“return”条件、 “exit”条件、若しくは“long jump”条件を示すデータとの比較 を行う。ステップ3908(第39図)に関連して上述したように、ステップ4 006(第40図)において、“return”ステートメントの実行のエミュ レーション時に、制御レコードは“return”条件を示すように設定される 。“exit”条件は、実行エンジン802(第8図)がライブラリ関数exi t () の呼出しを処理するときに生起する。このライブラリ関数exit () に ついては、Cスタンダードのセクション7.10.4.3に記載され ている。“long jump”条件は、実行エンジン802が、ライブラリ関 数longjmp () の呼出しを処理するときに生起する。このライブラリ関数 longjmp () についてもCスタンダードのセクション7.6.2.1に記 載されている。制御レコードが“return”条件、“exit”条件、若し くは“long jump”条件を示している場合、処理は論理流れ図2820 (第40図)に従って終了する。逆に制御レコードが“return”条件、“ exit”条件、若しくは“long jump”条件の何れをも示していない 場合には、処理はテストステップ4008からテストステップ4010に進む。 テストステップ4010においては、実行エンジン802(第8図)が制御レ コードと、“break”条件若しくは“continue”条件を示すデータ とを比較する。ステップ4006においては、“break”ステートメント若 しくは“continue”ステートメントの実行のエミュレーション時に、制 御レコードが、“break”条件若しくは“continue”条件を示すよ うに設定される。制御レコードが“break”条件若しくは“continu e”条件の何れかを示すように設定されている場合、処理はステップ4010に 進み、ここで制御レコードが“next”条件を示すように設定され、処理は論 理流れ図2820に従って終了する。 “next”条件は、ブロックの“next”ステートメントの実行がエミュ レートされる場合の一般的な処理条件である。従って、ステートメントの現ブロ ックが“break”ステートメントを実行する場合、現ブロックの処理は終了 し、処理は現ブロックのスーパーブロック内における現ブロックのすぐ後に続く ステートメントに進む。これに対して、“return”条件は制御レコードを リセットしない。従って、ステップ4006における“return”ステート メントの実行のエミュ レーションにより、上述のテストステップ4008を通した現ブロックの処理が 終了し、同様に現ブロックの任意のスーパーブロックの処理も終了する。 一方、制御レコードが“break”条件も“continue”条件をも示 していない場合には、処理はテストステップ4010からステップ4014に進 む。更に、現ステートメント構造体が“else”ステートメントを表現し、制 御レコードが上述のように“else”条件を示していない場合には、処理はテ ストステップ4004から4014に進む。ステップ4014においては、実行 エンジン802(第8図)が現ステートメント構造体のフィールド“next” 2106(第21図)を検索し、検索されたステートメント構造体を現ステート メント構造体にして、前の現ステートメント構造体を置き換える。 処理はステップ4014(第40図)からテストステップ4016に進み、こ こで実行エンジン802(第8図)が、現ステートメント構造体を指定するポイ ンタとNULLとを比較する。現ステートメント構造体を指定するポインタがN ULLである場合には、ステートメントのブロックの最終ステートメントが論理 流れ図2820(第40図)に従って処理され、処理は論理流れ図2820に従 って終了する。逆に、現ステートメント構造体を指定するポインタがNULLで ない場合には、処理はテストステップ4016から、上述のテストステップ40 04に進む。 従って、ステートメントのブロックの実行はエミュレートされ、ステートメン トのブロックにおける制御の流れは、論理流れ図2820(第40図)の通りに 流れることになる。リークの処理 上述のように、サブジェクト関数のステートメントの実行がひとたび エミュレートされると、ステップ2606(第26図)においてリーク(leak) が検出される。ステップ2606については論理流れ図2606(第41図)に その詳細が示されている。処理は論理流れ図2606に従ってループステップ4 102から開始される。ループステップ4102及びNEXTステップ4106 はループを形成し、その中でサブジェクト関数の各エクスターナルがステップ4 104に従って処理される。ステップ4104においては、実行エンジン802 (第8図)が、エクスターナルが到達可能な全てのリソースに印付けを行う(m ark)。そのリソースがエクスターナル若しくはそのエクスターナルを含む集群 (bunch)における任意の項目に関連付けられている場合には、そのリソースは エクスターナルが到達可能なリソースである。集群については以下に詳しく説明 する。説明のための例を用いると、集群型である配列の要素が関連付けられたリ ソースは、その配列の任意の要素から到達可能である。 リソース、即ちリソース状態構造体3100(第31図)によって表現された リソースは、リソース状態構造体3100のフィールド“mark”3114を 、それを示すように設定することによって印付けされる。各エクスターナルによ って到達可能な各リソースが、ループステップ4102(第41図)及びNEX Tステップ4106によって形成されたループの中でひとたび印付けされると、 処理はループステップ4106からループステップ4108に進む。 ループステップ4108及びNEXTステップ4114はループを形成し、そ の中で各リソースが処理される。リソース状態構造体は、シングルリンクトリス トに保持されて、全てのリソース状態構造体の処理を容易にする。例えば、リソ ース状態構造体3100(第31図)は、シングルリンクトリストにおける次の リソース状態構造体を指定するフィ ールド“next”3112を含む。メモリ104(第1図)内のリソース状態 構造体によって表現される各リソースに対して、処理はループステップ4108 (第41図)からテストステップ4110に進む。 テストステップ4110においては、実行エンジン802(第8図)がリソー スが割り当てられているか否か、即ち状態A若しくは状態Qにあるか否かという ことと、印付けされていないことを判定する。割り当てられ印付けされていない リソース、即ちどのエクスターナルからのも到達可能でないリソースはリークと なっている。そのリソースが割り当てられており、かつ印付けされていない場合 には、処理はテストステップ4110(第41図)からステップ4112進み、 ここでそのリークがユーザに対して通知される。そのリソースが割り当てられて いない、即ち状態A若しくは状態Qにないか、若しくは印付けされている場合に は、処理はテストステップ4110から直接NEXTステップ4114に進む。 更に、処理はステップ4112からNEXTステップ4114へ進む。処理はN EXTステップ4114からループステップ4108に進み、そこで次のリソー スが上述のように処理されて、最終的に全てのリソースが処理される。ひとたび 各リソースが、ループステップ4108及びNEXTステップ4114が形成す るループにおいて処理されると、論理流れ図2606に従って、即ちステップ2 606(第26図)に従って処理は終了する。 従って、リークは検出され、論理流れ図2606に従って、即ちステップ26 06(第26図)に従ってそれが通知される。エクスターナルの構築 上述のように、ステップ2608において、各エクスターナルは論理流れ図4 200(第42図)に従って構築される。論理流れ図4200に従った処理はテ ストステップ4202から開始されるが、このステッ プでは実行エンジン802(第8図)が、リソースがそのエクスターナルに関連 付けられているか否かを判定する。説明のための例を用いて、エクスターナルリ スト構造体1414(第15図)によって表現されたエクスターナルにリソース が関連付けられているか否かの判定について以下説明する。フィールド“fir st decl”1502は宣言構造体1506を指定しこの宣言構造体はフィ ールド“item”1608を含む。フィールド“item”1608は項目構 造体、即ち項目構造体2700を指定する。項目構造体2700のフィールド“ resource”2702(第27図)が、リソース状態構造体を指定してい る場合、エクスターナルリスト構造体1414(第15図)によって表現された エクスターナルに、リソースは関連付けられている。そのエクスターナルが、例 えばリソース状態構造体3100(第31図)によって表現されたリソースに関 連付けられている場合、処理はテストステップ4202(第42図)からステッ プ4204に進み、ここでフィールド“state”3102(第31図)が検 索される。処理はステップ4204から後に説明するステップ4210に進む。 そのエクスターナルに関連付けられたリソースが存在しない場合には、処理は テストステップ4202からテストステップ4206に進む。テストステップ4 206においては、実行エンジン802(第8図)が、そのエクスターナルが無 効ポインタであるか否かを判定する。エクスターナルの型は、そのエクスターナ ルに関連付けられた項目を表現する項目構造体のフィールド“type cod e”2712(第27図)によって指定され、それがVALUE TYPE N ON ZEROである場合には、そのエクスターナルは無効ポインタである。型 VALUE TYPE NON ZEROは、その項目がゼロ以外の値を有する ことを示す。そのエクスターナルに関連付けられた項目を表す項目構造体 のフィールド“invalid pointer”、即ちフィールド“inva lid pointer”2720がそれを示している場合、若しくはそのエク スターナルの値が0または−1である場合には、エクスターナルは無効ポインタ である。 そのエクスターナルが無効ポインタである場合には、処理はテストステップ4 204(第42図)からステップ4208に進み、そこでそのエクスナルのリソ ースの状態が状態Xに設定される。例えば、リソース状態構造体3100(第3 1図)によって表現されるリソースが、エクスターナル状態構造体3000(第 30図)によって表現されたエクスターナルに関連付けられている場合には、状 態Xを示すデータがフィールド“state”3102(第31図)に格納され る。ステップ4208(第42図)から、処理はステップ4210に進む。更に 、処理は、上述のようにステップ4204から、またエクスターナルが無効ポイ ンタでない場合にはテストステップ4206からステップ4210に進む。 ステップ4210において、エクスターナルの複合RS,DK及びCP状態が 更新される。状態の構成は、第3B図、第4B図、及び第5B図に関連して前に 詳しく説明した。ステップ4210の終了後、処理は論理流れ図4200に従っ て終了する。関数の出力モデル 上述のように、モデルマシン808(第8図)は、ステップ2412(第24 図)においてサブジェクト関数のモデルを生成し、格納する。ステップ2412 は、論理流れ図2412(第43図)に詳細が示されている。処理はステップ4 302から開始され、ここではモデルマシン808(第8図)が関数モデル構造 体1100(第11図)のような関数モデル構造体の割り当て及び初期化を行う 。関数モデル構造体1100は、一実施例においては、フィールド“name” 1102、フィー ルド“description”1108、フィールド“file”1110、 フィールド“line”1112、及びフィールド“automated”11 06に、(i)その挙動が関数モデル構造体1100においてモデル化されてい る関数の識別子、(ii)その関数のテキスト形式の記述、(iii)ソースコ ードファイルの名称、(iv)その関数が定義されているソースコードファイル 内の行、及び(v)その関数が自動的にモデル化されたことを示すブール値を、 それぞれ格納することによって初期化される。その関数のモデルがモデルマシン 808(第8図)によって生成された場合、関数は自動的にモデル化される。逆 に、その関数のモデルが、ユーザがコンピュータ100(第1図)においてテキ ストエディタ(図示せず)を用いて生成した場合、その関数は手動でモデル化さ れる。例えば、ライブラリ関数fopen () 、malloc () 、及びfre e () は、手動でモデル化される。関数モデル構造体のフィールド“autom ated”1116(第11図)は、上述のようにステップ904(第9図)に おいてモデル記述ファイル604(第6図)から呼出しを行うが、これはその関 数が手動でモデル化されるということを示すように設定される。 ステップ4306(第43図)から、処理はステップ4304に進み、そこで エクスターナルモデル構造体1200(第12図)のようなエクスターナルモデ ル構造体が、そのサブジェクト関数の各エクスターナルに対して生成され、対応 する関数モデル構造体におけるエクスターナルモデル構造体のシングルリンクト リストに挿入される。例えば、フィールド“first external”1 104(第11図)及びフィールド“last external”1106は 、上述のように、関数モデル構造体1100をエクスターナルモデル構造体のシ ングルリンクトリストに関連付けるために用いられる。1つのエクスターナルの 処 理は、ステップ4304(第43図)に従って行われるが、この処理は論理流れ 図4400(第44図)に示されている。 論理流れ図4400に従って処理はステップ4402から開始されるが、ここ ではモデルマシン808(第8図)がエクスターナルの型、即ちそのエクスター ナルがパラメータであるか、戻り値項目であるか、若しくは項目(即ち、グロー バルに定義された項目またはスタティックな項目)であるかを判定する。そのエ クスターナルがパラメータである場合は、モデルマシン808(第8図)はサブ ジェクト関数の定義におけるパラメータの位置を判定する。第1パラメータはパ ラメータ番号ゼロであって、最終パラメータの番号は、サブジェクト関数に対し て定義されたパラメータ番号より1小さい。そのエクスターナルが項目である場 合には、モデルマシン808(第8図)がその項目の識別子を判定する。そのエ クスターナルの型は、上述のように、エクスターナルモデル構造体1200(第 12図)のフィールド“type”1204に格納される。同様に、パラメータ 番号が求められた場合には、そのパラメータ番号はフィールド“paramet er number”1206に格納され、項目が求められた場合には、その項 目の識別子がフィールド“name”1208に格納される。 処理はステップ4402からステップ4404に進み、そこではモデルマシン 808(第8図)が演算の数を判定し、サブジェクト関数の実行のエミュレーシ ョン時に、エクスターナルに施される特定の演算を判定する。ステップ4404 においては、演算及び施される演算の数が、そのエクスターナルの複合DK状態 に従って判定される。次の表Nはエクスターナルの複合DK状態から導かれる演 算及び演算の数の概要を示したものである。 従って、例えば、エクスターナルの複合DK状態が状態Aである場合には、サ ブジェクト関数の実行のエミュレーションにおいて、演算aがそのエクスターナ ルに施される。また、エクスターナルの複合DK状態が状態KQである場合には 、サブジェクト関数の実行のエミュレーションにおいて、演算kが、次いで演算 mがそのエクスターナルに施される。上述のように、エクスターナルの複合状態 は、サブジェクト関数の実行の多重エミュレーションの包括的な効果を特定する 。従って、エクスターナルの複合状態から導かれた演算は、そのエクスターナル 上でのサブジェクト関数の実行の累積的な効果のエッセンス(distillation)を 表現する。 処理は、ステップ4404からテストステップ4406に進み、このステップ ではモデルマシン808(第8図)がそのエクスターナルに施される演算の数と ゼロとの比較を行う。そのエクスターナルに施される演算の数がゼロに等しい場 合には、処理はステップ4408(第44図)に進み、そこでモデルマシン80 8(第8図)が演算の数を判定し、かつそのエクスターナルの複合CP状態に従 ったサブジェクト関数のエミュレーション時にそのエクスターナルに施される特 定の演算を求める。以下の表Oは、エクスターナルの複合CP状態から導かれる 演算及び演算の数の概要を示したものである。 従って、エクスターナルの複合DK状態による、そのエクスターナル上でサブ ジェクトルーチンの実行の累積的効果に関する情報の供給が不十分である場合に は、そのエクスターナルの複合CP状態が、サブジェクト関数の実行の累積的効 果を判定するために用いられる。説明のための例を用いると、エクスターナルの 複合CP状態が状態iである場合、サブジェクト関数のエミュレーションにより 、そのエクスターナルに演算iが施される。ステップ4404(第44図)また はステップ4408の何れかにおいて、そのエクスターナルに施される演算及び 演算の数は、エクスターナルモデル構造体120のフィールド“operati ons”1214(第12図)及び“number of operation s”1212にそれぞれ格納される。処理はステップ4408(第44図)から ステップ4410に進む。更に、モデルマシン808(第8図)が、テストステ ップ4406(第44図)において、ステップ4404において判定されたよう にそのエクスターナルに施される演算の数がゼロであると判定された場合、処理 はテストステップ4406から直接ステップ4410に進む。 ステップ4410において、モデルマシン808(第8図)は、エクスターナ ルの複合RS状態から、そのエクスターナルに関連付けられたリソースの初期状 態を判定する。つまり、そのエクスターナルの複合RS状態はエクスターナルモ デル構造体1200のフィールド“init ial state”1220(第12図)に格納される。エクスターナルの複 合RS状態は、そのエクスターナルに関連するリソースに対するサブジェクト関 数の実行の累積的効果を反映する。処理はステップ4410(第44図)からテ ストステップ4412に進み、そこではモデルマシン808(第8図)が、その エクスターナルの複合RS状態と、そのエクスターナルに関連付けられたリソー スが存在しないことを示す状態NONEとを比較する。そのエクスターナルに関 連付けられたリソースが存在しない場合、処理はテストステップ4412(第4 4図)からステップ4414に進み、そこではブール値“false”が、エク スターナルモデル構造体1200のフィールド“new resource”1 218(第12図)に格納される。逆に、リソースがそのエクスターナルに関連 付けられている場合、即ちそのエクスターナルの複合RS状態がNONE以外で ある場合には、処理はテストステップ4412(第44図)からステップ441 6に進む。ステップ4416においては、モデルマシン808(第8図)がエク スターナルモデル構造体1200のフィールド“new resource”1 218(第12図)にブール値“true”を格納し、サブジェクト関数のエミ ュレーションにより、そのエクスターナルに関連付けられた新たなリソースが生 成されることを示すようにする。 処理はステップ4414(第44図)、若しくはステップ4416の何れかか らステップ4418に進み、そこでモデルマシン808(第8図)がエクスター ナルモデル構造体1200(第12図)を、関数モデル構造体1100(第11 図)のエクスターナルモデル構造体のシングルリンクトリストに挿入する。ステ ップ4418(第44図)の終了後、処理は論理流れ図4400に従って終了す る。 サブジェクト関数の各エクスターナルが、ステップ4304(第43 図)において論理流れ図4400に従って処理された後、処理はステップ430 6に進み、そこでサブジェクト関数を表現する関数モデル構造体1100(第1 1図)が、全ての関数モデル構造体を含むデータ構造体に格納される。ステップ 4306の終了後、処理は論理流れ図2412に従って、即ちステップ2412 (第24図)に従って終了する。次いで、格納された関数モデル構造体によって 表現される関数モデルが、後に詳しく説明するようにサブジェクト関数の呼出し を行う他の関数の解析を行うときに、そのサブジェクト関数の実行をエミュレー トするために用いられ得る。1つの項目の値の他の項目への代入 上述のように、ステップ3356(第33C図)において、一方の項目、即ち rhsの値が、他の項目、即ちlhsに代入される。ステップ3356は、論理 流れ図3356(第45図)に詳細に示されており、ここでは、処理がテストス テップ4502から開始される。テストステップ4502においては、実行エン ジン802(第8図)が、lhs及びrhsが項目によって表現されるか否かを 判定する。上述のように、lhs若しくはrhs等の式は、実行エンジン802 がその式を評価するための十分な情報を有している場合には1つの項目に評価さ れ、他の場合にはNULL値に評価される。式が1つの項目に評価される場合に は、その式はその項目によって表現される。lhs若しくはrhsの何れかが1 つの項目によって表現されない場合には、処理はテストステップ4502(第4 5図)から、以下に説明するテストステップ4510に進む。逆にlhs及びr hsの双方が1つの項目によって表現される場合には、処理はテストステップ4 502からステップ4504に進む。 ステップ4504においては、lhsを表現する項目、即ちlhs項目のフィ ールドが、それに対応するrhsを表現する項目、即ちrhs 項目と等しく形成される。詳述すると、項目構造体2700フィールド“res ource”2702(第27図)、“external”2704、“val ue”2706、“type code”2712、“initialized ”2714、及び“invalid pointer”2720のそれぞれに対 応するrhs項目のフィールドに、データが格納される。処理はステップ450 4(第45図)からテストステップ450に進み、そこでは実行エンジン802 (第8図)がrhsが初期化されたか否かを判定する。実行エンジン802は、 項目構造体2700のフィールド“initialized”2714(第27 図)に対応するrhs項目のフィールドと、ブール値“false”とを比較す ることによってこのような判定を行う。 rhsが初期化されている場合、即ち項目構造体2700のフィールド“in itialized”2714(第27図)に対応するrhs項目のフィールド が、ブール値“true”を有している場合には、処理は論理流れ図3356に 従って、即ちステップ3356(第33C図)に従って終了する。逆に、rhs が初期化されていない場合、即ち項目構造体2700のフィールド“initi alized”2714(第27図)に対応するrhs項目のフィールドがブー ル値“false”を有している場合には、処理はテストステップ4506(第 45図)からステップ4508に進む。ステップ4508においては、上述のよ うにエラーメッセージがエラーログファイル及び/若しくはビデオモニタ118 上のディスプレイに対して送られて、初期化されていないデータが使用されてい ることを警告する。フィールド“initialized”2714(第27図 )に対応するrhs項目のフィールドが、上述のようにステップ4504におい て、lhs項目における対応するフィールドにコピーされることから、lhs項 目も初期化されていない旨の 印付けがなされる。ステップ4508(第45図)が終了した後、論理流れ図3 356に従って、即ちステップ3356(第33C図)に従って処理を終了する 。 上述のように、lhs若しくはrhsの何れかが項目によって表現されない場 合、処理はテストステップ4502(第45図)からテストステップ4510に 進む。テストステップ4510において、実行エンジン802(第8図)が、r hs及びlhsが個別に項目によって表現されるか否かを判定する。lhsが項 目によって表現され、rhsが項目によって表現されない場合には、処理はテス トステップ4510(第45図)からステップ4512に進む。そうでない場合 には、処理は論理流れ図3356に従って、即ちステップ3356(第33C図 )に従って終了する。 ステップ4512(第45図)においては、実行エンジン802(第8図)が lhs項目に未知なものとしての印付けを行う。例えば、項目構造体2700( 第27図)がlhs項目を表現する場合、実行エンジン802(第8図)が、( i)未知のデータの型を示すデータをフィールド“type code”271 2(第27図)に格納し、(ii)lhs項目が初期化されていないことを示す データをフィールド“initialized”2714に格納し、(iii) lhsがエクスターナル若しくはリソースと関連付けられていないことを示すべ くフィールド“resource”2702及び“external”2704 にNULLを格納することによって、lhsが既知でないという印付けを行う。 ステップ4512(第45図)の終了後、処理は論理流れ図3356に従って、 即ちステップ3356(第33C図)に従って終了する。 従って、ステップ3356において、rhsを表現する項目の値はl hsを表現する項目に代入される。上述のように、実行エンジン802(第8図 )が、ステップ3408(第34図)において式の評価によって得られた項目の 値を、宣言された項目に代入する。ステップ3408におけるこの代入は、論理 流れ図3356(第45図)に関連して上述したrhs項目のlhs項目への代 入に類似したものである。ステップ3812(第38図)に関して上述したよう に、実行エンジン802(第8図)は、既知の項目の値を未知の項目に代入する 。ステップ3812(第38図)における既知の項目の未知の項目への代入は、 論理流れ図3356に関連して上述したrhs項目のlhs項目への代入に類似 したものである。上述のように、実行エンジン802(第8図)は、ステップ3 906(第39図)において、式の評価によって得られた項目の値を戻り値項目 に代入する。ステップ3906におけるこの代入処理は、論理流れ図3356( 第45図)に関連して上述したrhs項目のlhs項目への代入に類似したもの である。関数のエミュレーション 上述のように、実行エンジン802(第8図)は、ステップ3352(第33 C図)において、関数の実行をエミュレートすることにより関数の呼出しを評価 する。ステップ3352は論理流れ図3352(第46図)に詳細に示されてお り、ここでは処理がステップ4602から始まる。関数の呼出しの実行は、呼び 出される関数の挙動を表現する関数モデル構造体に従ってエミュレートされる。 テストステップ4602において、実行エンジン802(第8図)は、呼び出さ れる関数の挙動を表現する関数モデル構造体が、メモリ104(第1図)に格納 されているか否かを判定する。上述のように、関数モデル構造体1100(第1 1図)は、関数モデル構造体1100によってその挙動が表現される関数の識別 子を表現するデータを含んでいるフィールド“name”11 02を有する。各関数の挙動を表現する様々な関数モデル構造体の対応するフィ ールドは、サブジェクト関数がその関数を呼び出すのに用いる識別子と比較され るが、これは全ての関数モデル構造体がチェックされるまでか、若しくはそのフ ィールド“name”が識別子と一致する関数モデル構造体が見つけられるまで 続けて行われる。 その識別子と一致するフィールド“name”を有する関数モデル構造体が見 つけられない場合は、処理はテストステップ4602(第46図)からステップ 4604に進み、ここで呼び出される関数の実行のエミュレーションを評価する ことによって得られる項目としてNULLが生成される。上述のように、実行エ ンジン802(第8図)がその式を適切に評価するための十分な情報を有してい ないときには、式はNULLに評価される。ステップ4604(第46図)の実 行の後、処理は論理流れ図3352に従って、即ちステップ3352(第33C 図)に従って終了する。 一方、そのフィールド“name”が、サブジェクト関数が関数の呼出しに用 いる識別子と一致するような関数モデル構造体、即ち呼び出される関数の挙動を 表現する関数モデル構造体が見つけれられた場合には、処理はテストステップ4 602(第46図)からループステップ4606に進む。ループステップ460 6及びNEXTステップ4630はループを形成し、このループの中で呼び出さ れる関数の関数モデル構造体内のエクスターナルモデル構造体によって表現され る各エクスターナルが処理される。第13図に関連して以前に説明したように、 関数モデル構造体1100Aのような関数モデル構造体は、エクスターナルモデ ル構造体のシングルリンクトリストにおける第1エクスターナルモデル構造体を 指定するフィールド“first external”1104Aを含む。呼び 出される関数の関数モデル構造体のエクスターナルモデ ル構造体のシングルリンクトリストの各エクスターナルに対して、処理はループ ステップ4606(第46図)からテストステップ4608に進む。呼び出され る関数の関数モデル構造体のエクスターナルモデル構造体のシングルリンクトリ ストの各エクスターナルが処理された後、処理はループステップ4606から以 下に詳細に説明するステップ4632に進む。 以下のステップ4608〜4628の説明の文脈においては、ループステップ 4606及びNEXTステップ4630により形成されるループに従って処理さ れるエクスターナルモデル構造体には、エクスターナルモデル構造体の処理の説 明のための例として、エクスターナルモデル構造体1200(第12図)を用い るものとする。テストステップ4608(第46図)において、実行エンジン8 02(第8図)が、エクスターナルモデル構造体1200(第12図)がパラメ ータを表現しているか否かを、フィールド“type”1204とパラメータを 示すデータとを比較することによって判定する。エクスターナルモデル構造体1 200がパラメータを表現していない場合には、処理はテストステップ4608 (第46図)から以下に詳細に説明するテストステップ4612に進む。逆に、 エクスターナルモデル構造体1200(第12図)がパラメータを表現している 場合には、処理はテストステップ4608(第46図)からステップ4610に 進む。 ステップ4610においては、実行エンジン802(第8図)がそのパラメー タを表現する項目を検索する。ループステップ3348(第33C図)、ステッ プ3349、及びNEXTステップ3350に関連して以前に説明したように、 実行エンジン802(第8図)は、呼び出される関数のパラメータを表現する項 目の配列を含む。エクスターナルモデル構造体1200(第12図)によって表 現される特定のパラメータ は、フィールド“parameter number”1206において指定さ れる。処理はステップ4610(第46図)から、後に詳述するテストステップ 4616に進む。 上述のように、エクスターナルモデル構造体1200(第12図)がパラメー タを表現していない場合、処理はテストステップ4608からテストステップ4 612に進む。テストステップ4612(第46図)において、実行エンジン8 02(第8図)が、エクスターナルモデル構造体1200(第12図)が変数を 表現しているか否かを、フィールド“type”1204内に格納されたデータ と変数が表現されていることを示すデータとを比較することによって判定する。 エクスターナルモデル構造体1200(第12図)が変数を表現していない場合 には、処理はテストステップ4612(第46図)から後に詳述するテストステ ップ4616に進む。逆に、エクスターナルモデル構造体1200(第12図) が変数を表現している場合には、処理はテストステップ4612からステップ4 614に進む。 ステップ4614において、実行エンジン802(第8図)は、エクスターナ ルモデル構造体1200(第12図)によって表現される変数の評価を行う。実 行エンジン802(第8図)は、その変数の項目を検索することによってその変 数を評価する。サブジェクト関数を表現する関数構造体内において宣言構造体、 即ち宣言構造体1506(第16図)が、エクスターナルモデル構造体1200 (第12図)によって表現される変数を表現する。エクスターナルモデル構造体 1200はその変数の識別子をフィールド“name”1208に格納すること によって、表現された特定の変数を識別する。エクスターナルモデル構造体12 00及び宣言構造体1506(第16図)が同じ変数を表現している場合には、 フィールド“name”1604に格納された識別子はフィール ド“name”120(第12図)に格納された識別子と同じものである。宣言 構造体1506の“item”1608が指定する項目構造体2700を検索す ることによってその変数の評価が行われる。処理はステップ4614(第46図 )からテストステップ4616に進む。 上述のように、エクスターナルモデル構造体1200(第12図)がパラメー タ及びも変数の何れも表現していない場合、即ちエクスターナルモデル構造体1 200が呼び出される関数の戻り値項目を表現している場合には、処理はテスト ステップ4616からテストステップ4612に進む。また、処理はステップ4 616(第46図)の他ステップ4614からもテストステップ4616に進み 得る。テストステップ4616において、実行エンジン802(第8図)は、エ クスターナルモデル構造体1200(第12図)によって表現されるエクスター ナルを表現する項目が定義されているか否かを判定する。項目が定義されている のは、(i)ステップ4610においてエクスターナルモデル構造体1200に よって表現されるパラメータの値が定義され、既知の値に評価されて、かつ処理 がステップ4616(第46図)を通って進む場合、または(ii)ステップ4 614においてエクスターナルモデル構造体1200(第12図)によって表現 される変数が初期化され、処理がステップ4614(第46図)を通って進む場 合である。 エクスターナルモデル構造体1200(第12図)よって表現されるエクスタ ーナルを表現する項目が定義されない場合には、処理はテストステップ4616 (第46図)から後に説明するテストステップ4624に進む。逆に、このよう なアイテムが定義される場合には、処理はテストステップ4616からループス テップ4618に進む。 ループステップ4618及びNEXTステップ4622はループを形成し、こ のループの中でエクスターナルモデル構造体1200のフィー ルド“operations”1214(第12図)に格納された各演算が処理 される。上述のように、フィールド“operations”1214に格納さ れた演算の数は、フィールド“num operations”1212に記録 される。フィールド”operations”1214に格納された各演算に対 して処理はループステップ4618(第46図)からステップ4620に進み、 ここでステップ2906(第29図)に関連して上述したのと同じ方法で、エク スターナルモデル構造体1200(第12図)によって表現されるエクスターナ ルに演算が施される。エクスターナルに演算を施すことによって何らかのエラー が検出されたときには、それが上述の方法と同様にプログラミングエラーとして ユーザに通知される。ステップ4620(第46図)から、処理はNEXTステ ップ4622を通してループステップ4618に進み、ここでフィールド“op erations”1214(第12図)に格納された次の演算があれば、それ が処理される。フィールド“operations”1214に格納された全て の演算がループステップ4618(第46図)及びNEXTステップ4622に よって定義されたループに従ってひとたび処理されると、処理はテストステップ 4624に進む。 テストステップ4624において、実行エンジン802(第8図)は、エクス ターナルモデル構造体1200(第12図)が、エクスターナルモデル構造体1 200によって表現されるエクスターナルの代わりに新たなリソースが生成され ることを指定するか否かを判定する。実行エンジン802(第8図)は、フィー ルド“new resources”1218(第12図)とブール値“tru e”とを比較することによってこの判定を行う。フィールド“new reso urces”1218が“false”である場合には、処理はテストステップ 4624(第 46図)からNEXTステップ4630を通って、ループステップ4606に進 み、ここで次のエクスターナルが、上述のようにループステップ4606及びN EXTステップ4630により定義されるループに従って処理される。逆に、フ ィールド“new resources”1218(第12図)が“true” である場合には、処理はテストステップ4624(第46図)からステップ46 26に進む。 ステップ4626において、実行エンジン802(第8図)は、(i)項目構 造体、即ち項目構造体2700(第27図)及びリソース状態構造体、即ちリソ ース状態構造体3100(第31図)を生成してメモリ104(第1図)に格納 し、(ii)リソース状態構造体3100(第31図)を指定するポインタをフ ィールド“resource”2702に格納して、リソース状態構造体310 0と項目構造体2700(第27図)とを関連付けることによって、新たなリソ ースを生成する。処理はステップ4626(第46図)からステップ4628に 進み、ここで実行エンジン802(第8図)が、新たな項目と、エクスターナル モデル構造体1200(第12図)によって表現されるエクスターナルとを連係 させる。エクスターナルリスト構造体1414(第15図)がそのエクスターナ ルを表現している場合には、フィールド“first decl”1502(第 15図)が指定する宣言構造体1506のフィールド“item”1608(第 16図)に、項目構造体2700(第27図)を指定するポインタを格納するこ とによって、その項目がそのエクスターナルに関連付けられる。 エクスターナルが呼び出される関数の戻り値項目である場合には、論理流れ図 3352(第46図)の始めにNULLに設定されていた結果レコードが新たな 項目に設定される。エクスターナルモデル構造体1200のフィールド“typ e”1204(第12図)がそれを示してい る場合には、そのエクスターナルは、呼び出される関数の戻り値項目である。エ クスターナルが呼び出される関数の戻り値項目でない場合には、そのエクスター ナルを表現する宣言構造体1506のフィールド“item”1608(第16 図)に新たな項目が形成される。 ステップ4628(第46図)から、処理はNEXTステップ4630を通っ てループステップ4606に進み、ここで上述のように次のエクスターナルが処 理される。呼び出される関数を表現する関数モデル構造体1100のフィールド “first external”1104(第11図)及び“last ex ternal”1106によって指定されるエクスターナル構造体のシングルリ ンクトリストにおけるエクスターナル構造体によって表現されるエクスターナル の全てがひとたび処理されると、処理はループステップ4606(第46図)か らステップ4632に進む。ステップ4632において、実行エンジン802( 第8図)は、呼び出される関数の実行のエミュレーションにより評価して得られ た項目として、結果レコードを生成する。ステップ4628(第46図)に関連 して上述したように、この結果レコードはNULL値に初期化され、戻り値項目 の代わりに新たなリソースが生成された場合には、戻り値項目の値に設定される 。 ステップ4632の終了後、処理は論理流れ図3352に従って、即ちステッ プ3352(第33C図)に従って終了する。従って、呼び出される関数の挙動 を表現するモデルを用いることによって、サブジェクト関数内に呼び出される関 数に対する呼出しを評価して、呼び出される関数の実行のリソース及びエクスタ ーナルに対する評価を解析することができる。メモリの集群 C言語に特有なことの1つは、あるメモリを、連続して割り当てられ た配列として取り扱うことができるという点である。C言語においては、以下の 型のメモリは、そのメモリが連続したブロックとして割り当てられたメモリであ るかのようにアクセスすることができる。そのようなメモリの型とは、(i)命 令“struct”若しくは“array”を用いて定義された変数若しくはパ ラメータの何れかのデータ、即ち複合データ構造体若しくは配列、(ii)関数 にパラメータとして渡される任意のポインタ、(iii)C言語において定義さ れている関数calloc () 若しくは関数malloc () の実行により割り 当てられるメモリである。本発明のここに開示する実施例では、連続して割り当 てられるメモリをモデル化するためにメモリの集群(bunch)を用いている。 項目構造体は集群、即ち項目構造体の連続的な配列に割り当てられる。1つの 整数、若しくは浮動小数点型変数の宣言を表現する項目構造体の場合についての み述べると、この集群は1つの項目構造体を含む。複合型の変数、即ち“str uct”型及び配列の変数を表現する項目構造体の集群は、多重項目構造体によ って表現され、その項目構造体のそれぞれは、4バイトの配列若しくは複合デー タの変数である。 連続して割り当てられた項目構造体を有する連続して割り当てられたメモリを 表現することにより、いくつかのイリーガルな配列参照の検出が可能となる。例 えば、連続して割り当てられた項目構造体の集群の範囲内の項目構造体に対する 参照は、その集群によって表現される配列のイリーガルな指標(index)に対応 する。更に、項目構造体を集群に形成することにより、上述のようなメモリのリ ークの検出も単純化される。例えば、集群とされた何らかの項目構造体が関数の エクスターナルによって到達可能な場合は、集群における各項目構造体にも、そ の関数のエクスターナルが到達可能である。 上述のように、項目構造体2700(第27図)は、フィールド“first in bunch”2708、フィールド“size of bunch”2 710、フィールド“head in bunch”2716、及びフィールド “known bunch size”2718を含む。フィールド“firs t in bunch”2708は、項目構造体2700を含む項目構造体の集 群における第1の項目構造体を指定するポインタである。項目構造体2700が 1つの集群における第1の項目構造体である場合には、フィールド“first in bunch”2708が項目構造体2700を指定する。フィールド“ size of bunch”2710は、項目構造体2700を含む集群にお ける項目構造体の数を示す。一実施例においては、フィールド”size of bunch”2710が、所与の集群における第1の項目構造体においてのみ 、そのように定義されている。 フィールド“head in bunch”2716は、項目構造体2700 が、その項目構造体2700を含む集群における第1項目構造体であるか否かを 示すフラグである。フィールド“known bunch size”2718 は、項目構造体2700を含む集群が既知のサイズを有するか否かを示すフラグ である。集群が未知のサイズを有するのは、例えば、(i)その集群が動的に割 り当てられる、即ち関数malloc () を呼び出すことによって割り当てられ 、かつ実行エンジン802(第8図)が、要求されるメモリの量を計算するのに 十分な情報を有していないとき、(ii)その集群がサブジェクト関数に引き渡 される場合、若しくは(iii)その集群がその集群の各項目の追跡が実際には 無理であるようなサイズを有する場合である。フィールド“known bun ch size”2718によって示されることにより集群が未知のサイズを有 している場合には、実行エンジン802(第 8図)は、その集群の範囲を逸脱する違反のチェックは行わない。 付録A(Appendix A)のコンピュータプログラムは、一実施例として、米国 カリフォルニア州マウンテンビュー(mountain view)のサンマイクロシステム ズ社(Sun Microsystems)から入手可能なSun Sparcstation (登録商標)コンピュータシステムのようなワークステーションに備えられてい る、UNIXオペレーティングシステムSunOS4.1.3、コンパイラ、及 びリンカーを用いてコンパイルされ、リンクされた。第2実施例では、付録Aの コンピュータプログラムは、マイクロソフト社のVisual C++1.5コ ンパイラを用いてコンパイルされ、同社のVisual C++リンカーを用い てリンクされた。これらのコンパイラ及びリンカーは、米国ワシントン州レッド モンド(Redmond)のマイクロソフト社から発売されており、同様に同社から発 売されているMS DOS6.2オペレーティングシステム、Microsof t Windows(登録商標)3.1を用いているパーソナルコンピュータ上 で用いられる。使用できるパーソナルコンピュータには、米国カリフォルニア州 サンフランシスコのAtman社製のArt4000Sなどがある。付録Aのコ ンピュータプログラムが適合する特定のコンピュータ言語や、付録Aのコンピュ ータプログラムにより定義されたコンピュータプロセスが実行されるコンピュー タシステムは、本発明における重要な側面ではない。当業者は、本明細書の記載 内容を参照することにより、異なるコンピュータ言語及び/若しくは異なるコン ピュータシステムを用いて本発明を実現できよう。 付録Aには複数のソースコードファイルが含まれており、これには本発明の別 の実施例に基づき複数の関数及びデータ構造を定義するソースコードファイル“ readin.c”の2つの別の実施例が含まれている。ソースコードファイル “readin.c”の第1実施例は、付録 Aのフレーム64〜74に現れており、ソースコードファイル“readin. c”の第2実施例は、付録Aのフレーム77〜87に現れている。ソースコード ファイルの実施例の一方のみが付録Aの残りの部分とリンクされて、本発明の原 理に基づくリソースチェッカーを形成するということは理解されよう。 以上の記述は本発明を説明するためのものであり、本発明をこれに限定するも のではない。例えば、ここに開示した実施例はC言語における関数を分析してい るが、本発明の原理は、以上の記述の内容に限定されることなく、他のコンピュ ータ命令プロトコルにも適用され得る。更に、本発明を実現したコンピュータプ ログラムを何らかの媒体に格納して提供することも可能である。本発明の範囲は 、以下の請求の範囲によってのみ限定される。
【手続補正書】特許法第184条の8第1項 【提出日】1995年9月20日 【補正内容】 第25図は、第24図の論理流れ図中の一過程の論理流れ図である。 第26図は、第24図の論理流れ図に基づくコンピュータプログラムコンポー ネントの繰返し評価の一回分の論理流れ図である。 第27図は、本発明の実施例に基づく項目構造体(item structure)のブロッ ク図である。 第28図は、本発明の実施例に基づくステートメントの解析の論理流れ図であ る。 第29図は、本発明の実施例に基づく式の評価の論理流れ図である。 第30図は、本発明の実施例に基づくエクスターナル構造体のブロック図であ る。 第31図は、本発明の実施例に基づくリソース構造体(resource structure) のブロック図である。 第32図は、本発明の実施例に基づく項目への演算の適用の論理流れ図である 。 第33A図、第33B図、第33C、第33D、及び第33E図は、本発明の 実施例に基づく演算子の処理の論理流れ図である。 第34図は、本発明の実施例に基づく宣言の処理の論理流れ図である。 第35図は、本発明の実施例に基づく“if”ステートメントの処理の論理流 れ図である。 第36図は、本発明に基づく論理演算子の処理の論理流れ図である。 第37図は、第36図の論理流れ図の一過程の処理の論理流れ図である。 第38図は、第36図の論理流れ図の別の過程の処理の論理流れ図である。 第39図は、本発明の実施例に基づく“return”ステートメントの処理 の論理流れ図である。 子によって指定された処理が実行される。上述のように、式は、動的検査エンジ ン706(第7図)内に於いて式構造体2200(第22図)のような式構造体 によって表現される。式構造体2200のフィールド“kind”2202はそ の式の演算子の種類を指定し、またフィールド“operands”2210は その演算子の演算が施されるオペランドを含む。 このサブジェクト関数の解析は、コンピュータプロセス内に於けるそのサブジ ェクト関数の実行の文脈内で行われるので、このサブジェクト関数のエクスター ナルの初期値は未知である。従って、このサブジェクト関数に於ける式は、既知 の値に評価しなくてもよい。従って、ステップ2902(第29図)での実行エ ンジン802(第8図)による式の評価により、式の評価により既知の若しくは 部分的に既知の値が生成される場合には項目が生成され、そうでない場合にはN ULLが生成される。後に詳述するように、項目は、「部分的に既知」の値を有 し得る。例えば、項目が0でない値を有していることは知ることはできるが、項 目の正確な値はまだ知ることができず、この場合その項目の値は「部分的に既知 」であるという。ステップ2902は論理流れ図2902(第33a図、第33 b図、第33c図、第33d図、及び第33e図)に詳しく示されており、後に 詳細に説明する。 ステップ2902(第29図)から、処理はテストステップ2904に進み、 ここで実行エンジン802(第8図)が、式の評価によりNULLでなく項目が 生成されたか否か、及びステートマシン804によりその項目に演算が施される か否かを判定する。その式の評価により項目が生成されない場合、若しくはその 項目に演算が施されない場合には、処理はテストステップ2904(第29図) から後に説明するステップ2908に進む。逆に、その式の評価により項目が生 成されその項目に 連するリソースまたはエクスターナルに演算が施され、何らかのエラーが検出さ れてそれがユーザに通知される。ステップ2906から、処理はステップ290 8に進む。また、式の評価により生成された項目が存在しない場合、若しくは上 述のようにその式に対して施される演算が無い場合は、処理はテストステップ2 904から直接ステップ2908に進む。ステップ2908においては、実行エ ンジン802は、式、即ち、サブジェクトステートメントを含んでおり、更に、 項目が生成された場合にはその項目を、生成されなかった場合には数値がNUL Lである項目を含んでいる。詳述すると、実行エンジン802はサブジェクトス テートメントを表現する式構造体2200のフィールド“item”2206( 第22図)に、その項目を指定するポインタを格納する。従って、後に行われる その式の評価においては、単に、その項目がフィールド“item”2206が 指定する部位に戻されるだけとなり、これによって冗長な処理が回避される。ス テップ2908(第29図)の後、処理は論理流れ図2900に従って終了する 。定数 上述のように、論理流れ図2902(第33A図〜第33E図)に詳細に示さ れているステップ2902(第29図)においては、実行エンジン802(第8 図)は、式における演算子によって規定されている通りに式を処理する。実行エ ンジン802は、演算の型に応じてその式を処理する。テストステップ3301 (第33A図)においては、論理流れ図2902に従って処理が開始されるが、 ここでは実行エンジン802(第8図)が、その式が演算子は含んでいないが、 代わりに定数を含んでいるか否かを判定する。式構造体2200(第22図)が サブジェクトステートメントの式を表現している場合は、実行エンジン802( 第8図)は、式構造体2200のフィールド“kind”2202(第2 02(第29図)に従って終了する。単項演算子 上述のように、この式の演算子が関係演算子でない場合には、処理はテストス テップ3309(第33A図)からテストステップ3313に進む。テストステ ップ3313においては、実行エンジン802(第8図)が、式の演算子が単項 演算子であるか否かを、その式を表現する式構造体のフィールド“kind”2 202(第22図)と、単項演算子を示すデータとを比較することによって判定 する。単項演算子は、ただ1つのオペランドを有する演算を特定する演算子であ る。例えば、式“−a”は、ただ1つのオペランド“a”と、オペランド“a” に対して数値を負にする演算を特定する単項演算子“−”とを有する。式が1つ のオペランドを有し、かつ式構造体2200によって表現されている場合には、 その式のただ1つのオペランドが、フィールド“operands”2210の 第1の要素である式構造体によって表現される。 式の演算子が単項演算子でない場合には、処理はテストステップ3313(第 33B図)から、後に説明するテストステップ3313(第33B図)に進む。 逆に、式の演算子が単項演算子である場合には、処理はテストステップ3313 (第33B図)からステップ3314に進む。ステップ3314においては、実 行エンジン802(第8図)が、論理流れ図2900(第29図)に従って式の オペランドを式として評価するとともに、演算cを適用する。演算cは、式のオ ペランドに適用されるが、これはこのオペランドが計算において使用されるから である。このような計算において式のオペランドが不適切に使用されている場合 には、上述のように、演算を適用することによりエラーメッセージが生成される 。 処理はステップ3314(第33B図)からステップ3315に進み、 ここでは式の単項演算子が式の評価のために用いられる。ステップ3315は上 述のステップ3308に類似している。ステップ3315の終了後、処理は論理 流れ図2902、即ちステップ2902(第29図)に従って終了する。特定の演算子による処理 上述のように、式の演算子が単項演算子でない場合には、処理はテストステッ プ3313(第33B図)からテストステップ3317(第33B図)に進む。 更に上述したように、論理流れ図2902における上述のステップでは、式の演 算子の型に従って式の処理が行われる。テストステップ317及びそれに続くス テップにおいて、式の演算子の型がテストステップ3301(第33A図)、3 303、3305、3309及び3313で判定される演算子の型の中に入って いない場合に、実行エンジン802(第8図)が、式の特定の演算子に従って式 の処理を行う。インクリメント演算子またはデクリメント演算子 ステップ3317(第33B図)においては、実行エンジン802(第8図) が、式の演算子とインクリメント演算子及びデクリメント演算子とを比較する。 つまり、式構造体2200(第22図)がその式を表現している場合、実行エン ジン802は、フィールド”kind”2202(第22図)と、インクリメン ト演算子若しくはデクリメント演算子を指定するデータとを比較する。インクリ メント演算子若しくはデクリメント演算子は、1つのオペランドに対してそのオ ペランドを1づつ増減させる演算を施す。その式の演算子がインクリメント演算 子でもデクリメント演算子でもない場合には、処理は、後に説明するテストステ ップ3320(第33B図)に進む。逆に、式の演算子がインクリメント演算子 またはデクリメント演算子である場合には、処理はテストステッ ンマ(“,”)は、2つのオペランド、即ち式のlhs及びrhsに対して演算 を施し、演算結果としてrhsを評価した値を有する項目を生成する。つまり、 2つのオペランドは個別に評価され、式のrhsを評価した値が式の値になるの である。 式の演算子が複合演算子でない場合には、処理はテストステップ3327(第 33C図)からテストステップ3330に進む。逆に、式の演算子が複合演算子 である場合には、処理はテストステップ3327からステップ3328に進む。 ステップ3328においては、実行エンジン802(第8図)が論理流れ図2 900(第29図)に従って式のlhsをその式として評価し、また演算の適用 は行わない。ステップ3328(第33C図)から処理はステップ3329に進 み、ここでは実行エンジン802(第8図)が論理流れ図2900(第29図) に従って式のrhsを評価する。論理流れ図2900に従って、複合演算子を含 む式を評価する場合に施される演算は、ステップ3329(第33C図)におい てrhsを評価するときにrhsに施される演算と類似したものである。式のr hsの評価によって生成される項目は、その式そのものの項目として戻される。 ステップ3329(第33C図)の終了後、処理は論理流れ図2902に従って 、即ちステップ2902(第29図)に従って終了する。間接演算子 上述のように、式の演算子が複合演算子でない場合には、処理はテストステッ プ3327(第33C図)からテストステップ3330に進む。テストステップ 3330においては、実行エンジン802(第8図)がその式の演算子が間接演 算子(indirection operator)であるか否かを、その式を表す式構造体のフィー ルド”kind”2202(第22図)と間接演算子を指定するデータとを比較 することによって判定する。C 言語においては、間接演算子(即ち“*”)は1つのオペランドに対して演算を 施し、演算結果としてメモリ、即ちメモリ104(第1図)内のそのオペランド によって指定されたアドレスに格納された値を有する項目を生成する。例えば、 式“*a”は、メモリ内のアドレス“a”に格納された値を有する項目に対して 評価を行う。間接演算子は、配列の要素を参照するためにも使用され得る。例え ば、宣言“int array[10]”によって規定された配列の第2要素は、 “array[1]”または“*(array+1)”の何れかによって特定され 得る。後者の式はその配列の要素のサイズのアレイの始まる点を0としたときの 相対位置(オフセット)1に格納された値、即ち配列の第2要素の値を参照する ものである。 その式の演算子が間接演算子でない場合には、処理はテストステップ3330 (第33C図)からテストステップ3335に進む。逆に、その式の演算子が間 接演算子である場合には、処理はテストステップ3330からテストステップ3 331に進む。 テストステップ3331においては、実行エンジン802(第8図)がそのオ ペランドが配列であるか否かを判定する。式構造体2220(第22図)がその オペランドを表現している場合には、フィールド“type”2204(第22 図)がそのオペランドの型を指定する型構造体を指定する。例えば、型構造体1 612(第17図)が式構造体2220のフィールド“type”2204(第 22図)によって指定されている場合には、実行エンジン802(第8図)がそ のオペランドが配列であるか否かを、フィールド“kind”1702(第17 図)と配列を指定するデータとを比較することによって判定する。 そのオペランドが配列である場合には、処理はテストステップ3331(第3 3C図)からステップ3332に進み、ここで実行エンジン8 02(第8図)が、論理流れ図2900(第29図)に従って、そのオペランド をその式として評価し、かつ演算は適用しないが、その演算子を、配列の間接ア ドレス指定手段として、即ち上述の“*(array+1)”の型式の配列の1 つの要素の参照要素として取り扱う。逆に、オペランドが配列でない場合には、 処理はテストステップ3331(第33C図)からステップ3333に進み、こ こでは実行エンジン802(第8図)が、論理流れ図2900(第29図)に従 ってその式のオペランドを評価するとともに、演算iを適用し、かつその演算子 を間接アドレスを指定するポインタ、即ち上述の式“*a”のためのものとして 取り扱う。 処理はステップ3332(第33C図)またはステップ3333の何れかから 、ステップ3334に進み、ここでは実行エンジン802(第8図)が、そのオ ペランドをデリファレンスする。オペランドのデリファレンスにおいて、その式 の評価により、オペランドが指定する項目が生成される。オペランドが項目を指 定していない場合には、式はNULLに評価される。ステップ3334(第33 C図)の終了後、論理流れ図2902に従って、即ちステップ2902(第29 図)に従って処理は終了する。コンポーネント参照演算子 上述のように、式の演算子が間接演算子でない場合には、処理はテストステッ プ3330(第33C図)からテストステップ3335に進む。テストステップ 3335においては、実行エンジン802(第8図)が、その式の演算子がコン ポーネント参照演算子であるか否かを、その式を表現する式構造体のフィールド “kind”2202(第22図)と、コンポーネント参照演算子を指定するデ ータとを比較することによって判定する。C言語においては、コンポーネント参 照演算子(即ち、“.” または“−>”)は、2つのオペランド、即ち式のlhs及びrhsに対して演 算を施し、演算結果としてrhsによって特定されたlhsのフィールド項目を 生成する。例えば、宣言“struct{int a;char *b}c,* d”が宣言しているのは、項目“c”及び第2項目に対するポインタ“d”であ って、それぞれが、データの型“int”、即ち整数の第1フィールド項目“a ”及びデータの型が”char”、即ち文字であるデータを指定する第2フィー ルド項目“b”を有することを表している。式“c.a”は、項目“c”の整数 フィールド項目に評価される。同様に、式“d−>a”は、ポインタ“d”が指 定する項目の整数フィールド項目に評価される。 式の演算子がコンポーネント参照演算子でない場合には、処理はテストステッ プ3335(第33C図)からテストステップ3338(第33D図)に進む。 逆に式の演算子がコンポーネント参照演算子である場合には、処理はテストステ ップ3335(第33C図)からステップ3336に進む。 ステップ3336においては、実行エンジン802(第8図)が論理流れ図2 900(第29図)に従って式のlhsを評価し、また演算は施されない。ステ ップ3336(第33C図)から、処理はステップ3337に進み、ここで実行 エンジン802(第8図)が、式のrhsによって指定されるフィールドを検索 する。ステップ3337の終了後、処理は論理流れ図2902に従って、即ちス テップ2902(第29図)に従って終了する。配列参照演算子 上述のように、式の演算子がコンポーネント演算子でない場合には、処理はテ ストステップ3335(第33C図)からテストステップ3338(第33D図 )に進む。テストステップ3338においては、実行 エンジン802(第8図)が式の演算子が配列参照演算子であるか否かを、その 式を表現する式構造体のフィールド“kind”2202(第22図)と、配列 参照演算子を指定するデータとの比較を行うことによって判定する。C言語にお いては、配列参照演算子(即ち、“ [] ”)は2つのオペランド、即ちその式の lhs及びrhsに対して演算を施し、演算結果として、rhsにより特定され るlhsの配列の要素を生成する。例えば、宣言“int array[10] ”が宣言するのは10個の整数の配列である。式“array[b]”は、配列 “array”の、項目“b”によって指定される位置に存在する整数の要素に 評価される。項目“b”、即ちrhsは指標(index)と称されることもある。 C言語においては、配列参照演算子は、非配列ポインタからのオフセットを参 照するためにも使用されうる。例えば、“datum”が型が“int”である 変数である場合、式“datum[2]”は、メモリ104(第1図)の、変数 “datum”を表現する項目から2メモリ位置だけオフセットした位置に格納 されたデータに評価される。2メモリ位置は、変数“datum”の型、即ちデ ータの型“int”の変数2つ分の長さに等しい。上述のように、C言語の文脈 においては、“array[i]”及び“*(array+i)”は、等価な式 である(Cスタンダードのセクション6.3、2.1参照)。 その式の演算子が配列参照演算子でない場合は、処理はテストステップ333 8(第33D図)からテストステップ3344に進む。逆に、この式の演算子が 配列参照演算子である場合には、処理はテストステップ3338からステップ3 339に進む。 ステップ3339において、実行エンジン(第8図)は、論理流れ図2900 (第29図)に従ってその式の指標を評価し、また演算cを施 す。演算cを施すのは、この指標は計算に使用されるからである。ステップ33 39(第33D図)から、処理はテストステップ3340に進み、ここで実行エ ンジン802(第8図)が、lhsが配列であるか否かを、テストステップ33 31(第33C図)に関連して前に説明した方法で判定する。lhsが配列であ る場合には、処理はテストステップ3340(第33D図)からステップ334 1に進み、ここで実行エンジン802(第8図)が、論理流れ図2900(第2 図)に従ってその式のrhsを指標として評価する。このとき演算は施されない 。逆に、lhsが配列でない場合には、処理はテストステップ3340(第33 D図)からステップ3342に進み、ここで実行エンジン802(第8図)が論 理流れ図2900(第29図)に従ってその式のrhsをポインタとして評価し 、かつ演算iを施す。 処理はステップ3341(第33D図)若しくはステップ3342の何れかか ら、ステップ3343に進み、ここで実行エンジン802(第8図)が、lhs によって特定された配列の、rhsによって指定された要素を検索する。ステッ プ3343(第33D図)の終了後、処理は論理流れ図2902に従って、即ち ステップ2902(第29図)に従って終了する。アドレス演算子 上述のように、その式の演算子が配列演算子でない場合には、処理はテストス テップ3338(第33D図)からテストステップ3344に進む。テストステ ップ3344においては、実行エンジン802(第8図)が、その式の演算子が アドレス演算子であるか否かを、その式を表現する式構造体のフィールド“ki nd”2202と、アドレス演算子を指定するデータとを比較することによって 判定する。C言語においては、アドレス演算子(即ち“&”)は、1つのオペラ ンドに対して演算 を施し、演算結果としてオペランドのアドレスがその値である項目を生成する。 例えば、式“&a”は、メモリ、即ちメモリ104内の、項目“a”が格納され ているアドレスをその値とする項目に評価される。 その式の演算子がアドレス演算子でない場合には、処理はテストステップ33 44(第33D図)からテストステップ3347に進む。逆に、その式の演算子 がアドレス演算子である場合には、処理はテストステップ3344からステップ 3345に進む。 ステップ3345においては、実行エンジン802(第8図)が、論理流れ図 2900(第29図)に従ってオペランドの評価を行い、このとき他の演算は施 されない。ステップ3345(第33D図)から、処理はテストステップ334 6に進み、ここでこのアドレス演算子はその式を評価するのに使用される。つま り、オペランドのアドレスが決定されるのである。ステップ3346は、前に説 明したステップ3308(第33A図)に類似している。ステップ3346(第 33D図)が終了した後、処理は論理流れ図2902に従って、即ちステップ2 902(第29図)に従って終了する。関数の呼出し 上述のように、式の演算子がアドレス演算子でない場合には、処理はテストス テップ3344(第33D図)からテストステップ3347に進む。テストステ ップ3347においては、実行エンジン802(第8図)が、その式の演算子が 関数の呼出しであるか否かを、その式を表現する式構造体のフィールド“kin d”2202(第22図)と、関数の呼出しを指定するデータとを比較すること によって判定する。C言語においては、関数演算子(即ち“ () ”)は、関数の 呼出しを意味する。関数の呼出しは、その関数の戻り値項目(returned item) に評価される。例えば、式“abc () ”は、識別子が“abc”である関数の 実行の 呼出しを行う。同様に、式“xyz(d,e,f)”は、その識別子が“xyz ”である、パラメータとして項目d,e,及びfが与えられている関数を呼び出 す。 式の演算子が関数の呼出しでない場合には、処理はテストステップ3347( 第33E図)からテストステップ3353に進む。逆に、式の演算子が関数の呼 出しである場合には、処理はテストステップ3347からループステップ334 8に進む。 ループステップ3348、ステップ3349、及びNEXTステップ3350 は、各パラメータの評価が行われるループを形成する。ステップ3349におい て、実行エンジン802(第8図)は、論理流れ図2900(第29図)に従っ てパラメータの評価を行い、また演算は施さない。式構造体2200(第22図 )がその式を表現している場合、即ち関数の呼出しを表現している場合には、( i)フィールド“num operands”2208が呼び出された関数のパ ラメータの数をオペランドの数として特定し、(ii)フィールド“opera nds”2210は式構造体の配列であり、この式構造体の各要素は呼び出され た関数のパラメータを表現する式構造体である。各パラメータの評価は、フィー ルド“operands”2210の各要素を評価することによって行われる。 呼び出された関数のパラメータを表現する項目の配列は、ループステップ334 8、ステップ3349、及びNEXTステップ3350によって形成されたルー プにおいて構成され、後に(第46図に関連して)詳しく説明するように、ステ ップ3352において呼び出された関数の実行をエミュレートするのに用いられ る。 ひとたび呼出される関数の各パラメータが評価されると、処理はループステッ プ3348(第33E図)からステップ3351に進む。ステップ3351にお いては、実行エンジン802(第8図)が、呼び出さ れる関数のエクスターナルにおける実行の効果を表現する関数モデル構造体を抽 出する。関数モデル構造体は、第11図〜第13図に関連して以前に説明してあ る。ステップ3351(第33E図)から、処理はステップ3352に進み、こ こで実行エンジン802(第8図)が、呼び出される関数の実行のエミュレート については後に詳しく説明する。ここで簡単に説明すると呼び出される関数のエ ミュレートは、上述の関数モデル(3)、(4)、及び(5)から形成される関 数モデル構造体のような、関数モデル構造体において特定された演算を適用する ことによって行われる。この呼び出された関数に対応する関数モデル構造体は、 呼び出される関数のエクスターナルにおける実行の効果を表現する演算を特定す る。ステップ3352(第33E図)の終了後、処理は、論理流れ図2902に 従って、即ちステップ2902(第29図)に従って終了する。代入 上述のように、その式の演算子が関数の呼出しでない場合には、処理はテスト ステップ3347(第33E図)からテストステップ3353に進む。テストス テップ3353においては、実行エンジン802(第8図)が、その関数の演算 子が代入演算子であるか否かをその式を表現する式構造体のフィールド“kin d”2202(第22図)と、代入演算子を指定するデータとを比較することに よって判定する。C言語においては、代入演算子(即ち“=”)が、2つのオペ ランド、即ちlhs及びrhsに対して演算を施し、rhsの値をlhsに移す 。代入は、移された値を有する項目に評価される。例えば、式“a=b”は、項 目“b”の値を項目“a”に移し、項目“a”の新たな値を有する項目に評価さ れる。 式の演算子が代入演算子でない場合には、処理は論理流れ図2902 (第33A図〜第33E図)に従って、即ちステップ2902(第29図)に従 って終了し、論理流れ図2902に従って処理された式はNULL値に評価され る。NULL値は、有効値を持たない状態を示すために用いられる。 実行エンジン802(第8図)が、コンピュータプロセス内におけるサブジェ クト関数の実行の文脈を欠いた式を適切に評価することができない場合には、式 はNULL値に評価される。最も重要なことは、式の適切な評価ではなく、エク スターナル及びリソースのそれぞれの状態変化を追跡することである。この状態 の正確な追跡を確実に行うために、式の評価はできる限り多く行われる。 逆にテストステップ3353(第33E図)において、式の演算子が代入演算 子である場合には、処理はステップ3353に進む。ステップ3353において は、実行エンジン802(第8図)は、論理流れ図2900(第29図)に従っ て式のlhsを式そのものとして評価し、また演算は施さない。ステップ335 4(第33E図)から、処理はステップ3355に進み、ここでは実行エンジン 802(第8図)が論理流れ図2900(第29図)に従って式のrhsの評価 を行い、また演算は施さない。処理はステップ3355(第33E図)からステ ップ3356に進み、ここでは実行エンジン802(第8図)が、式のrhsの 評価によって生成された項目の値を、式のlhsの評価によって生成された項目 に代入する。ステップ3356については、後に論理流れ図3356(第45図 )に関連して詳細に説明する。ステップ3356(第33E図)の終了後、処理 は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終 了する。 従って、ステップ2804(第28図)においては、実行エンジン802(第 8図)が、論理流れ図2900(第29図)に従って式の評価 ステップ3902においては、実行エンジン802(第8図)が、“retu rn”ステートメントが戻り値項目を指定しているか否かを判定する。“ret urn”ステートメントは、それが式を含んでいる場合、戻り値項目を指定する 。例えば、ステートメント構造体1416(第21図)が“return”ステ ートメントを表現している場合、フィールド“pointers”2110は、 式構造体を指定する1つのポインタであるか、若しくはNULLである。“re turn”ステートメントが戻り値項目を指定する場合、即ちフィールド“po inters”2110が式構造体を指定している場合、処理はテストステップ 3902(第39図)からステップ3904に進み、ここで“return”ス テートメントの式が論理流れ図2900(第29図)に従って評価され、また、 演算は施されない。ステップ3904(第39図)において“return”ス テートメントの式の評価において演算は施されないが、前にステップ3306、 3307、及び3314(第33A−B図)に関連して説明したように、式のオ ペランドに何らかの演算を施すことも可能である。ステップ3904(第39図 )から処理はステップ3906に進み、ここでは実行エンジン802(第8図) がステップ3904(第39図)において式の評価を行うことにより生成された 項目を、サブジェクト関数の戻り値項目を表現する項目構造体に代入する。1つ の項目の値を他の項目に代入することに関しては、後に詳しく説明する。 処理はステップ3906からステップ3908に進む。また、“return ”ステートメントが戻り値項目を指定していない場合、処理はテストステップ3 902から、直接ステップ3908に進む。ステップ3908においては、実行 エンジン802(第8図)が、後に詳述するように、サブジェクト関数の実行の エミュレーション時においてサブジェクト関数を通る制御の流れを与えるのに用 いられる“return” 項目と等しく形成される。詳述すると、項目構造体2700フィールド“res ource”2702(第27図)、“external”2704、“val ue”2706、“type code”2712、“initialized ”2714、及び“invalid pointer”2720のそれぞれに対 応するrhs項目のフィールドに、データが格納される。処理はステップ450 4(第45図)からテストステップ450に進み、そこでは実行エンジン802 (第8図)がrhsが初期化されたか否かを判定する。実行エンジン802は、 項目構造体2700のフィールド“initialized”2714(第27 図)に対応するrhs項目のフィールドと、ブール値“false”とを比較す ることによってこのような判定を行う。 rhsが初期化されている場合、即ち項目構造体2700のフィールド”in itialized”2714(第27図)に対応するrhs項目のフィールド が、ブール値“true”を有している場合には、処理は論理流れ図3356に 従って、即ちステップ3356(第33E図)に従って終了する。逆に、rhs が初期化されていない場合、即ち項目構造体2700のフィールド“initi alized”2714(第27図)に対応するrhs項目のフィールドがブー ル値“false”を有している場合には、処理はテストステップ4506(第 45図)からステップ4508に進む。ステップ4508においては、上述のよ うにエラーメッセージがエラーログファイル及び/若しくはビデオモニタ118 上のディスプレイに対して送られて、初期化されていないデータが使用されてい ることを警告する。フィールド“initialized”2714(第27図 )に対応するrhs項目のフィールドが、上述のようにステップ4504におい て、lhs項目における対応するフィールドにコピーされることから、lhs項 目も初期化されていない旨の 印付けがなされる。ステップ4508(第45図)が終了した後、論理流れ図3 356に従って、即ちステップ3356(第33C図)に従って処理を終了する 。 上述のように、lhs若しくはrhsの何れかが項目によって表現されない場 合、処理はテストステップ4502(第45図)からテストステップ4510に 進む。テストステップ4510において、実行エンジン802(第8図)が、r hs及びlhsが個別に項目によって表現されるか否かを判定する。lhsが項 目によって表現され、rhsが項目によって表現されない場合には、処理はテス トステップ4510(第45図)からステップ4512に進む。そうでない場合 には、処理は論理流れ図3356に従って、即ちステップ3356(第33E図 )に従って終了する。 ステップ4512(第45図)においては、実行エンジン802(第8図)が lhs項目に未知なものとしての印付けを行う。例えば、項目構造体2700( 第27図)がlhs項目を表現する場合、実行エンジン802(第8図)が、( i)未知のデータの型を示すデータをフィールド“type code”271 2(第27図)に格納し、(ii)lhs項目が初期化されていないことを示す データをフィールド“initialized”2714に格納し、(iii) lhsがエクスターナル若しくはリソースと関連付けられていないことを示すべ くフィールド“resource”2702及び“external”2704 にNULLを格納することによって、lhsが既知でないという印付けを行う。 ステップ4512(第45図)の終了後、処理は論理流れ図3356に従って、 即ちステップ3356(第33E図)に従って終了する。 従って、ステップ3356において、rhsを表現する項目の値はl hsを表現する項目に代入される。上述のように、実行エンジン802(第8図 )が、ステップ3408(第34図)において式の評価によって得られた項目の 値を、宣言された項目に代入する。ステップ3408におけるこの代入は、論理 流れ図3356(第45図)に関連して上述したrhs項目のlhs項目への代 入に類似したものである。ステップ3812(第38図)に関して上述したよう に、実行エンジン802(第8図)は、既知の項目の値を未知の項目に代入する 。ステップ3812(第38図)における既知の項目の未知の項目への代入は、 論理流れ図3356に関連して上述したrhs項目のlhs項目への代入に類似 したものである。上述のように、実行エンジン802(第8図)は、ステップ3 906(第39図)において、式の評価によって得られた項目の値を戻り値項目 に代入する。ステップ3906におけるこの代入処理は、論理流れ図3356( 第45図)に関連して上述したrhs項目のlhs項目への代入に類似したもの である。関数のエミュレーション 上述のように、実行エンジン802(第8図)は、ステップ3352(第33 E図)において、関数の実行をエミュレートすることにより関数の呼出しを評価 する。ステップ3352は論理流れ図3352(第46図)に詳細に示されてお り、ここでは処理がステップ4602から始まる。関数の呼出しの実行は、呼び 出される関数の挙動を表現する関数モデル構造体に従ってエミュレートされる。 テストステップ4602において、実行エンジン802(第8図)は、呼び出さ れる関数の挙動を表現する関数モデル構造体が、メモリ104(第1図)に格納 されているか否かを判定する。上述のように、関数モデル構造体1100(第1 1図)は、関数モデル構造体1100によってその挙動が表現される関数の識別 子を表現するデータを含んでいるフィールド“name”11 02を有する。各関数の挙動を表現する様々な関数モデル構造体の対応するフィ ールドは、サブジェクト関数がその関数を呼び出すのに用いる識別子と比較され るが、これは全ての関数モデル構造体がチェックされるまでか、若しくはそのフ ィールド“name”が識別子と一致する関数モデル構造体が見つけられるまで 続けて行われる。 その識別子と一致するフィールド“name”を有する関数モデル構造体が見 つけられない場合は、処理はテストステップ4602(第46図)からステップ 4604に進み、ここで呼び出される関数の実行のエミュレーションを評価する ことによって得られる項目としてNULLが生成される。上述のように、実行エ ンジン802(第8図)がその式を適切に評価するための十分な情報を有してい ないときには、式はNULLに評価される。ステップ4604(第46図)の実 行の後、処理は論理流れ図3352に従って、即ちステップ3352(第33E 図)に従って終了する。 一方、そのフィールド“name”が、サブジェクト関数が関数の呼出しに用 いる識別子と一致するような関数モデル構造体、即ち呼び出される関数の挙動を 表現する関数モデル構造体が見つけれられた場合には、処理はテストステップ4 602(第46図)からループステップ4606に進む。ループステップ460 6及びNEXTステップ4630はループを形成し、このループの中で呼び出さ れる関数の関数モデル構造体内のエクスターナルモデル構造体によって表現され る各エクスターナルが処理される。第13図に関連して以前に説明したように、 関数モデル構造体1100Aのような関数モデル構造体は、エクスターナルモデ ル構造体のシングルリンクトリストにおける第1エクスターナルモデル構造体を 指定するフィールド“first external”1104Aを含む。呼び 出される関数の関数モデル構造体のエクスターナルモデ ル構造体のシングルリンクトリストの各エクスターナルに対して、処理はループ ステップ4606(第46図)からテストステップ4608に進む。呼び出され る関数の関数モデル構造体のエクスターナルモデル構造体のシングルリンクトリ ストの各エクスターナルが処理された後、処理はループステップ4606から以 下に詳細に説明するステップ4632に進む。 以下のステップ4608〜4628の説明の文脈においては、ループステップ 4606及びNEXTステップ4630により形成されるループに従って処理さ れるエクスターナルモデル構造体には、エクスターナルモデル構造体の処理の説 明のための例として、エクスターナルモデル構造体1200(第12図)を用い るものとする。テストステップ4608(第46図)において、実行エンジン8 02(第8図)が、エクスターナルモデル構造体1200(第12図)がパラメ ータを表現しているか否かを、フィールド“type”1204とパラメータを 示すデータとを比較することによって判定する。エクスターナルモデル構造体1 200がパラメータを表現していない場合には、処理はテストステップ4608 (第46図)から以下に詳細に説明するテストステップ4612に進む。逆に、 エクスターナルモデル構造体1200(第12図)がパラメータを表現している 場合には、処理はテストステップ4608(第46図)からステップ4610に 進む。 ステップ4610においては、実行エンジン802(第8図)がそのパラメー タを表現する項目を検索する。ループステップ3348(第33E図)、ステッ プ3349、及びNEXTステップ3350に関連して以前に説明したように、 実行エンジン802(第8図)は、呼び出される関数のパラメータを表現する項 目の配列を含む。エクスターナルモデル構造体1200(第12図)によって表 現される特定のパラメータ る場合には、そのエクスターナルは、呼び出される関数の戻り値項目である。エ クスターナルが呼び出される関数の戻り値項目でない場合には、そのエクスター ナルを表現する宣言構造体1506のフィールド“item”1608(第16 図)に新たな項目が形成される。 ステップ4628(第46図)から、処理はNEXTステップ4630を通っ てループステップ4606に進み、ここで上述のように次のエクスターナルが処 理される。呼び出される関数を表現する関数モデル構造体1100のフィールド “first external”1104(第11図)及び“last ex ternal”1106によって指定されるエクスターナル構造体のシングルリ ンクトリストにおけるエクスターナル構造体によって表現されるエクスターナル の全てがひとたび処理されると、処理はループステップ4606(第46図)か らステップ4632に進む。ステップ4632において、実行エンジン802( 第8図)は、呼び出される関数の実行のエミュレーションにより評価して得られ た項目として、結果レコードを生成する。ステップ4628(第46図)に関連 して上述したように、この結果レコードはNULL値に初期化され、戻り値項目 の代わりに新たなリソースが生成された場合には、戻り値項目の値に設定される 。 ステップ4632の終了後、処理は論理流れ図3352に従って、即ちステッ プ3352(第33E図)に従って終了する。従って、呼び出される関数の挙動 を表現するモデルを用いることによって、サブジェクト関数内に呼び出される関 数に対する呼出しを評価して、呼び出される関数の実行のリソース及びエクスタ ーナルに対する評価を解析することができる。メモリの集群 C言語に特有なことの1つは、あるメモリを、連続して割り当てられ 【図1】 【図2】 【図3】 【図3】 【図4】 【図4】 【図5】 【図5】 【図6】 【図7】 【図8】 【図9】 【図10】 【図11】 【図12】 【図13】 【図14】 【図15】 【図16】 【図17】 【図18】 【図19】 【図20】 【図21】 【図22】 【図23】 【図24】 【図25】 【図26】 【図27】 【図28】 【図29】 【図30】 【図31】 【図32】 【図33】 【図33】 【図33】 【図33】 【図33】 【図34】 【図39】 【図35】 【図36】 【図37】 【図43】 【図38】 【図40】 【図41】 【図42】 【図45】 【図44】 【図46】 【手続補正書】特許法第184条の8第1項 【提出日】1996年8月27日 【補正内容】 成されるコンピュータプロセスを、全ての可能な制御流れ経路を通るようにする ことは実際的ではない。そのようにするには、プログラマーが、コンピュータプ ログラムのコンピュータ命令の実行時に発生し得る全ての事象を予期し、そのよ うな事象発生の全ての組み合わせを生じさせるまたはエミュレートすることが必 要であるからである。 更に、ランタイムチェックは、コンピュータプログラムが完成しているときし か使用することができない。ランタイムチェックでは、ある1つの関数が完成し たプログラムに組み込まれる前に、その関数を解析することは不可能である。な ぜなら、解析するにはその関数を実行しなければならないからである。従って、 ランタイムチェックを用いて関数を解析するには、(i)コンピュータプログラ ムの全ての関数が、それらの関数のどれかを解析するよりも前に、開発され、組 み合わされてコンピュータプログラムを形成していること、または(ii)その 関数を組み込んだ特別なテストプログラムが開発されていることが必要である。 従って、完成したコンピュータプログラムへの組み込み前に個々の関数の設計、 制作及びテストを行う、複雑なコンピュータプログラムを開発する好適な方法で あり広く知られているトップダウン式のプログラミングは、ランタイム解析には なじまない。 スズキらに付与された米国特許第5,253,158号(以下「スズキ」と言 う)明細書には、自動化さた機器の動作を制御するために用いられるべきソウト ウェア(シーケンサソウトウェア)の実行時間チェックを行う装置が開示されて いる。「スズキ」によれば、自動化された機器を用いずにシーケンサソフトウェ アの試験ができる。「スズキ」の発明では、ソフトウェアの動作環境に関する情 報、自動化された機器の特性に関する情報、実行されるべきテストケースに関す る情報が、記憶装置に格納されている(第1図)。次に、「スズキ」の発明では 、シーケ ンサソフトウェアによって制御された自動化された機器の動作をシミュレートし 、シミュレートされた結果が得られる(第1欄の第54行から第59行)。「ス ズキ」の発明のシミュレーションは、シーケンサソフトウェアの実行を必要とす る(第4欄の第50行)。「スズキ」に開示された実行時間チェック装置は、こ れまで説明されたように、実行時間の解析の限界に対する主題であった。 フ・ティン・チャン及びツォン・ユゥエ・チェンは、「AIDA−A Dynam ic Data Flow Anomaly Detection Syete m for Pascal Programs, Software Prac tice And Experience第227頁−第239頁(1987年 3月)」で、パスカルプログラム用の動的データ流れ解析システムについて説明 している。AIDA(automated instruction syst em)は、文法的に補正されたパスカルプログラムを解析し、このプログラムを インストラクションプログラムに変換する。インストラクションプログラムは、 もとのパスカルソースコードに挿入された変数の状態を初期化、追従、若しくは チャックするための手続コールの形式を検査する。プログラムの実行中、AID Aは、データの流れの異常と、初期化されていない変数、変数の不正な使用、変 数の誤った分類化、定義された変数の意図しない破壊などのプログラミングエラ ーを検出する。AIDAは、上述されたように、実行時間解析の限定に対する主 題となっている。 必要とされているのは、コンピュータプログラムの動的な挙動を考慮し、自動 的にコンピュータプログラムの概ね全ての制御流れ経路を考慮し、コンピュータ プログラムのプログラマーがコンピュータプログラムを別の形式、例えば数学的 形式、で表すことを必要としないプログラミングエラー検出技術である。更に必 要とされているのは、プログラムの 個々のコンポーネントを、実行時のそのコンポーネントの挙動を考慮して解析す るプログラミングエラー検出技術である。更に必要とされているのは、解析中の コンピュータプログラムコンポーネントによって実行請求の範囲 1.1つ若しくは複数のステートメントを有する電子計算機用プログラムのコン ポーネントの挙動の解析方法であって、 (a)有効な状態を定義する過程と、 (b)前記1つ若しくは複数のステートメントを通る制御流れ経路を通過する 過程と、 (c)前記コンポーネントを動的に検査する過程と、 (d)前記コンポーネントの効果を記述する過程とを有することを特徴とする 電子計算機用プログラムのコンポーネントの挙動の解析方法。 2.(a)前記定義する過程が、リソース状態を有するリソースに対して1つ若 しくは複数の有効な状態を定義し、 (b)前記動的に検査する過程が、前記制御流れ経路に沿った前記1つ若しく は複数のステートメントの各々に対して、(1)前記リソースの前記リソース状 態に対する前記ステートメントの効果を評価する過程と、(2)前記効果に基づ いて前記リソースの新たなリソース状態の前記リソース状態からの遷移をモデル 化する過程とを実行し、 (c)前記記述する過程の前記新たな状態が前記有効な状態の何れでもないこ とを検出する過程を有することを特徴とする請求項1に記載の方法。 3.前記コンポーネントが関数からなることを特徴とする請求項1若しくは2に 記載の方法。 4.前記通過する過程が、 前記1つ若しくは複数のステートメントの選択されたステートメントが、述語 の値に基づいて前記制御流れ経路の一部を決定するか否かを判定する過程と、 前記制御流れ経路を決定するために前記述語を評価する過程とを有す ることを特徴とする請求項1若しくは2に記載の方法。 5.前記述語を評価する前記過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を割り当てる過程とを有することを特徴とする請求項4 に記載の方法。 6.前記述語を評価する過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する過程を更 に有することを特徴とする請求項5に記載の方法。 7.前記述語を評価する過程が、 前記想定した値から前記述語の1つまたは複数のオペランドの各々の値を推論 する過程を更に有することを特徴とする請求項5に記載の方法。 8.前記通過する過程が、 前記1つ若しくは複数のステートメントの第2の選択されたステートメントが 、前記第1の述語の前記1つ若しくは複数のオペランドを有する第2の述語の第 2の値に基づいて前記制御流れ経路の第2の部分を決定するか否かを判定する過 程と、 前記第1の述語の前記1つ若しくは複数のオペランドの前記推論された各々の 値を用いて、前記制御流れ経路の前記第2の部分を決定するために前記第2の述 語を評価する過程とを更に有することを特徴とする請求項7に記載の方法。 9.前記過程(b)の前記過程(1)が、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しであるか 否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しである場 合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネント の前記効果を評価するために、前記呼び出されたコン ポーネントの実行をエミュレートする過程とを有することを特徴とする請求項1 若しくは2に記載の方法。 10.(a)前記定義する過程が、リソース状態を有するリソースに対する1つ 若しくは複数の有効な状態を定義する過程を有し、 (b)各々が前記有効な状態の第1の状態から前記有効な状態の第2の状態へ の遷移からなる1つ若しくは複数の有効な状態の遷移を定義する過程を有し、 (c)前記動的に検査する過程が、前記制御流れ経路に沿って前記1つ若しく は複数のステートメントの各々に対し、(1)前記リソースの前記リソース状態 に対する前記ステートメントの効果を評価する過程と、(2)前記効果に基づき 前記リソースの前記リソース状態の変化をモデル化する過程とを実行し、 (d)前記記述する過程が、前記変化が前記有効な状態の遷移の何れでもない ことを検出する過程を有することを特徴とする請求項1に記載の方法。 11.前記述語を評価する過程が、 前記想定した値から前記述語の前記1つ若しくは複数の要素の各々の値を推論 する過程を更に有することを特徴とする請求項5に記載の方法。 12.前記通過する過程が、 前記1つ若しくは複数のステートメントの第2の選択されたステートメントが 、前記第1の述語の前記1つ若しくは複数の要素を有する第2の述語の第2の値 に基づいて前記制御流れ経路の第2の部分を決定するか否かを判定する過程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語を 評価する過程とを更に有することを特徴とする請求項 11に記載の方法。 13.前記過程(c)の前記過程(1)が、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しからなる か否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しからなる 場合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネン トの前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミ ュレートする過程とを有することを特徴とする請求項10に記載の方法。 14.前記呼び出されたコンポーネントの実行をエミュレートする前記過程が、 前記リソースが前記呼び出されたコンポーネントのエクスターナルに関連して いるか否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルに関連す る前記ソースに対する前記コンポーネントの実行の前記効果を決定する過程とを 有することを特徴とする請求項9若しくは13に記載の方法。 15.前記リソース状態が前記有効な状態の何れでもないことをユーザに通知す る過程を更に有することを特徴とする請求項1、2及び10に何れかに記載の方 法。 16.その前記リソース状態に対する効果が前記有効な状態の何れでもない新た なリソース状態への遷移を引き起こすという効果である前記ステートメントを、 ユーザに対して特定する過程を更に有することを特徴とする請求項1、2及び1 0の何れかに記載の方法。 17.前記コンポーネントがエクスターナルを含み、 (a)前記定義する過程が、エクスターナル状態を有する前記エクス ターナルに対する1つ若しくは複数の有効な状態を定義する過程を有し、 (b)前記動的に検査する前記過程が、前記1つ若しくは複数のステートメン トの各々に対し、(1)前記ステートメントの実行が、前記エクスターナルの前 記エクスターナル状態に対して効果を有するか否かを判定する過程と、(2)前 記効果に基づいて前記エクスターナル状態から前記エクスターナルの新たなエク スターナル状態への遷移をモデル化する過程とを有し、 (c)前記記述する過程が、前記エクスターナルの前記コンポーネントの前記 ステートメントの共通の効果を表すモデルを構築する過程を有することを特徴と する請求項1に記載の方法。 18.前記通過する過程が、 前記1つ若しくは複数のステートメントの選択されたステートメントが、述語 の値に基づいて前記制御流れ経路の一部を決定するか否かを判定する過程と、 前記制御流れ経路を決定するために、前記述語を評価する過程とを有すること を特徴とする請求項17に記載の方法。 19.前記述語を評価する過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を割り当てる過程とを有することを特徴とする請求項1 8に記載の方法。 20.前記述語を評価する過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する仮定を更 に有することを特徴とする請求項19に記載の方法。 21.前記述語を評価する過程が、 前記想定した値から前記述語の1つ若しくは複数のコンポーネントの各々の値 を推論する過程を更に有することを特徴とする請求項19に記 載の方法。 22.前記通過する過程が、 前記1つ若しくは複数のステートメントの第2の選択されたステートメントが 、前記第1の述語の前記要素の1つ若しくは複数を有する第2の述語の第2の値 に基づいて前記制御フローバスの第2の部分を決定するか否かを判定する過程と 、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語を 評価する過程とを更に有することを特徴とする請求項21に記載の方法。 23.前記述語を評価する過程が、 前記想定した値から前記エクスターナルの前記状態に関する情報を推論する過 程を更に有することを特徴とする請求項19に記載の方法。 24.前記過程(b)の前記過程(1)が、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しであるか 否かを判定する過程と、 前記ステートメントが前記呼び出されたコンポーネントに対する呼び出しであ る場合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネ ントの前記効果を評価するために、前記呼び出されたコンポーネントの実行をエ ミュレートする過程とを有することを特徴とする請求項17に記載の方法。 25.前記呼び出されたコンポーネントの実行をエミュレートする前記過程が、 前記リソースが前記呼び出されたコンポーネントのエクスターナルに関連する か否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナル に関連する前記リソースに対する前記コンポーネントの実行の前記効果を求める 過程とを有することを特徴とする請求項24に記載の方法。 26.(d)1つ若しくは複数のステートメントからなる第2の集合を有する第 2の制御流れ経路を通過する過程と、 (e)前記1つ若しくは複数のステートメントの第2の集合の各々のステート メントに対し、(1)前記ステートメントの実行が前記エクスターナルの前記エ クスターナル状態に対する効果を有するか否かを判定する過程と、(2)前記効 果に基づいて前記エクスターナル状態から第2の新たなエクスターナル状態への 遷移をモデル化する過程とを実行する過程と、 (f)前記第1の新たなエクスターナル状態と前記第2の新たなエクスターナ ル状態とから前記エクスターナルの共通のエクスターナル状態を形成する過程と を更に有することを特徴とする請求項17に記載の方法。 27.前記通過する過程が、 前記1つ若しくは複数のステートメントの選択されたステートメントが、述語 の値に基づいて前記第2の制御流れ経路の一部を決定するか否かを判定する過程 と、 前記第2の制御流れ経路を決定するために、前記述語を評価する過程とを有す ることを特徴とする請求項26に記載の方法。 28.前記述語を評価する過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を割り当てる過程とを有することを特徴とする請求項2 7に記載の方法。 29.前記述語を評価する過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する 過程を更に有することを特徴とする請求項28に記載の方法。 30.前記述語を評価する過程が、 前記想定した値から前記述語の1つ若しくは複数の要素の各々の値を推論する 過程を更に有することを特徴とする請求項28に記載の方法。 31.前記述語を評価する過程が、 前記想定した値から前記エクスターナルの前記状態に関する情報を推論する過 程を更に有することを特徴とする請求項28に記載の方法。 32.前記通過する過程が、 前記1つ若しくは複数のステートメントの第2の選択されたステートメントが 、前記第1の述語の前記1つ若しくは複数の要素を有する第2の述語の第2の値 に基づいて、前記制御流れ経路の第2の部分を決定するか否かを判定する過程と 、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語を 評価する過程を更に有することを特徴とする請求項32記載の方法。 33.前記過程(e)の前記過程(1)は、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しであるか 否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しである場 合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネント の前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミュ レートする過程とを有することを特徴とする請求項26に記載の方法。 34.前記呼び出されたコンポーネントの実行をエミュレートする前記過程が、 前記リソースが前記呼び出されたコンポーネントのエクスターナルに関連する か否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルに関連す る前記ソースに対する前記コンポーネントの実行の前記効果を求める過程とを有 することを特徴とする請求項33に記載の方法。 35.前記エクスターナルの前記共通の状態から前記コンポーネントの前記挙動 のモデルを導き出す過程を更に有することを特徴とする請求項26に記載の方法 。 36.前記コンポーネントの前記挙動の前記モデル内に、前記エクスターナルの 前記状態での1つ若しくは複数の遷移を指示する情報を包含させる過程を更に有 することを特徴とする請求項35に記載の方法。 37.前記第1のコンポーネントに対する呼び出しを含む前記電子計算機用プロ グラムの呼び出しコンポーネントの解析の間、前記モデルを用いて、前記エクス ターナルに対する前記第1のコンポーネントの実行の前記効果を求める過程を更 に有することを特徴とする請求項17に記載の方法。 38.前記コンポーネントがリソースの利用を指示し、 (a)前記定義する過程が、リソース状態を有する前記リソースに対する1つ若 しくは複数の有効な状態を定義する過程を有し、 (b)前記動的に検査する過程が、前記1つ若しくは複数のステートメントの各 々に対して、(1)前記ステートメントの実行が前記リソースの前記エクスター ナルの状態に対し効果を有するか否かを判定する過程と、(2)前記効果に基づ いて前記リソースの状態から新たなリソースの状態への遷移をモデル化する過程 とを実行する過程を有し、 (c)前記記述する過程が、前記リソースの前記コンポーネントの前記ステート メントの共通の効果を表すモデルを構築する過程を有すること を特徴とする請求項1に記載の方法。 39.前記通過する過程が、 前記1つ若しくは複数のステートメントの選択されたステートメントが、述語 の値に基づいて前記制御流れ経路の一部を決定するか否かを判定する過程と、 前記制御流れ経路を決定するために前記述語を評価する過程とを有することを 特徴とする請求項38に記載の方法。 40.前記述語を評価する過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を割り当てる過程とを有することを特徴とする請求項3 9に記載の方法。 41.前記述語を評価する過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する過程を更 に有することを特徴とする請求項40に記載の方法。 42.前記述語を評価する過程が、 前記想定した値から前記述語の1つ若しくは複数の要素の各々の値を推論する 過程を更に有することを特徴とする請求項40に記載の方法。 43.前記通過する過程が、 前記1つ若しくは複数のステートメントの第2の選択されたステートメントが 、 前記第1の述語の1つ若しくは複数の前記要素を有する第2の述語の第2の値 に基づいて前記制御流れ経路の第2の部分を決定するか否かを判定する過程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために前記第2の述語を評 価する過程を更に有することを特徴とする請求項42 に記載の方法。 44.前記過程(b)の前記過程(1)が、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しであるか 否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しである場 合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネント の前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミュ レートする過程とを有することを特徴とする請求項38に記載の方法。 45.前記呼び出されたコンポーネントの実行をエミュレートする前記過程が、 前記リソースが前記呼び出されたコンポーネントのエクスターナルと関連する か否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルと関連す る前記リソースに対する前記コンポーネントの実行の前記効果を求める過程とを 有することを特徴とする請求項44に記載の方法。 46.(d)1つ若しくは複数のステートメントからなる第2の集合を有する第 2の制御流れ経路を通過する過程と、 1つ若しくは複数のステートメントの前記第2の集合の各ステートメントに対 して、(1)前記ソースの前記リソース状態に対する前記ステートメントの効果 を評価する過程と、(2)前記効果に基づいて前記リソースの状態から第2の新 たなリソースの状態への遷移をモデル化する過程とを実行する過程と、 (f)前記第1の新たなリソースの状態と前記第2の新たなリソースの状態とか ら前記リソースの共通のリソース状態を形成する過程とを更に有することを特徴 とする請求項38に記載の方法。 47.前記通過する過程が、 前記1つ若しくは複数のステートメントの選択されたステートメントが、述語 の値に基づいて前記制御流れ経路の一部を決定するか否かを判定する過程と、 前記制御流れ経路を求めるために、前記述語を評価する過程とを有することを 特徴とする請求項46に記載の方法。 48.前記述語を評価する前記過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に仮定され値を割り当てる過程とを有することを特徴とする請求項4 7に記載の方法。 49.前記述語を評価する過程が、前記想定した値から前記リソースの前記状態 に関する情報を推論する過程を更に有することを特徴とする請求項48に記載の 方法。 50.前記述語を評価する過程が、 前記想定した値から前記述語の1つ若しくは複数の要素の各々の値を推論する 過程を更に有することを特徴とする請求項48に記載の方法。 51.前記通過する過程が、前記1つ若しくは複数のステートメントの第2の選 択されたステートメントが、前記第1の述語の1つ若しくは複数の前記要素を有 する第2の述語の第2の値に基づいて前記制御流れ経路の第2部分を決定するか 否かを判定する過程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語を 評価する過程とを更に有することを特徴とする請求項50に記載の方法。 52.前記過程(f)の前記過程(1)が、 前記ステートメントが呼び出されたコンポーネントに対する呼び出し であるか否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しからなる 場合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネン トの前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミ ュレートする過程とを更に有することを特徴とする請求項46に記載の方法。 53.前記呼び出されたコンポーネントの実行をエミュレートする前記過程が、 前記リソースが前記呼び出されたコンポーネントのエクスターナルと関連する か否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルと関連す る前記リソースに対する前記コンポーネントの実行の前記効果を求める過程とを 有することを特徴とする請求項52に記載の方法。 54.前記リソースの前記共通の状態から、前記コンポーネントの前記挙動のモ デルを導き出す過程を更に有することを特徴とする請求項46に記載の方法。 55.前記コンポーネントの前記挙動の前記モデル内に、前記リソースの前記状 態での1つ若しくは複数の遷移を表示する情報を包含させる過程を更に有するこ とを特徴とする請求項54に記載の方法。 56.前記第1のコンポーネントに対する呼び出しを含む前記電子計算機用プロ グラムの呼び出しコンポーネントを解析する間に、前記モデルを用いて、前記リ ソースに対する前記第1のコンポーネントの実行の前記効果を求める過程を更に 有することを特徴とする前記38に記載の方法。 57.電子計算機用プログラムの呼び出しコンポーネントの前記呼び出しコンポ ーネントの項目に対する実行の効果の解析方法であって、 前記呼び出しコンポーネントがその項目がエクスターナルからなる呼び出され たコンポーネントに対する呼び出しを含むか否かを判定する過程と、 前記呼び出されたコンポーネントの1つ若しくは複数のエクスターナルに対す る前記呼び出されたコンポーネントの実行の効果を記述するコンポーネントモデ ルから、前記項目に対する前記呼び出されたコンポーネントの実行の前記効果を 求める過程とを有することを特徴とする項目に対する実行の効果の解析方法。 58.前記項目が状態を有し、 前記項目に対する前記呼び出されたコンポーネントの実行の前記効果を求める 前記過程が、前記呼び出されたコンポーネントによって指示さた前記項目の前記 状態の変化を求める過程を有することを特徴とする請求項57に記載の方法。 59.前記呼び出されたコンポーネントが、前記項目の前記状態に施されるべき 1つ若しくは複数のオペレーションを指定することよって、前記項目の前記状態 の変化を指示することを特徴とする請求項58に記載の方法。 60.前記呼び出されたコンポーネントが、前記項目の前記状態の有効な状態か ら無効な状態への遷移を指示するか否かを判定する過程を更に有することを特徴 とする請求項58に記載の方法。 61.前記呼び出されたコンポーネントが、第1の有効な状態から第2の有効な 状態への遷移以外の前記項目の状態の遷移を指示するものであるか否かを判定す る過程を更に有することを特徴とする請求項58に記載の方法。 62.電子計算機用プログラムのコンポーネントのプログラミングエラーの検出 方法であって、 その利用が前記コンポーネントの1つ若しくは複数のステートメントによって 指示されたリソースが、1つ若しくは複数の状態にあるか否かを判定する過程と 、 前記コンポーネントが、前記1つ若しくは複数の状態のある特定の状態にある ことを要する第1の状態に前記リソースがあること、及び前記第1のステートメ ントが、実行それることによって前記特定の状態に前記リソースがあることを確 かめ第2のステートメントによって、前記コンポーネントを通る制御流れ経路に おいて先行されていないことを検知する過程とを有することを特徴とするプログ ラミングエラーの検出方法。 63.前記1つ若しくは複数の状態が、確実に割り当てられた状態と確実に割り 当てられていない状態とを有することを特徴とする請求項62に記載の方法。 64.前記特定の状態が前記確実に割り当てられた状態であることを特徴とする 請求項63に記載の方法。 65.1つ若しくは複数のリソースの利用を指示するステートメントを含み、か つ1つ若しくは複数のエクスターナルを含む電子計算機用プログラムのコンポー ネントのリソースのリークの検出方法であって、 前記1つ若しくは複数のリソースの何れが前記1つ若しくは複数のエクスター ナルの任意のエクスターナルによって到達可能であるか否かを判定する過程と、 エクスターナルによって到達可能ではない任意のリソースが、割り当てられて いるか否かを判定する過程とを有することを特徴とする電子計算機用プログラム のコンポーネントのリソースのリークの検出方法。 66.前記1つ若しくは複数のリソースの何れのリソースが到達可能であるかを 判定する前記過程が、 前記コンポーネントのエクスターナルの、前記リソースに到達するた めの項目を含む集群内にあるか否かを判定する過程を有することを特徴とする請 求項65に記載の方法。 67.電子計算機用プログラムのコンポーネントのデータフロー解析の実施方法 であって、 前記コンポーネントのステートメントが、述語の値に基づいて制御を遷移させ る1つ若しくは複数の要素を備えた条件付けられた分岐ステートメントとからな るか否かを判定する程と、 前記述語が第1の値を有すと仮定する過程と、 前記第1の値から、前記述語の前記1つ若しくは複数の要素の各々の値を推論 する過程とを有することを特徴とするデータフロー解析の実施方法。 68.前記述語の前記第1の値に基づいて、前記条件付けられた分岐ステートメ ントを有する前記コンポーネントを通る制御流れ経路を通過する過程を更に有す ることを特徴とする請求項67に記載の方法。 69.前記コンポーネントの第2のステートメントが、第2の述語の第2の値に 基づいて制御を遷移させる前記第1の述語の前記1つ若しくは複数の要素を含む 第2の条件付けられた分岐ステートメントであるか否かを判定する過程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値から 、前記第2の値を求める過程とを更に有することを特徴とする請求項67に記載 の方法。 70.1つ若しくは複数のステートメントを有する電子計算機用プログラムのコ ンポーネントのプログラミングエラーを検出するリソースチェッカであって、 リソース状態を有するリソースに対する1つ若しくは複数の有効な状態を定義 するリソース挙動モデルと、 前記1つ若しくは複数のステートメントを通る制御流れ経路を通過すると共に 前記のリソースの前記リソース状態に対するそれぞれの効果を前記1つ若しくは 複数のステートメントの各々が有するか否かを判定する実行エンジンと、 前記1つ若しくは複数のステートメントの各々の前記効果に基づいて、前記リ ソースの状態から新たなリソースの状態への遷移をモデル化すると共に前記新た なリソースの状態が前記有効な状態でないことを検知する状態マシンとを有する ことを特徴とするリソースチェッカ。 71.前記コンポーネントが関数からなることを特徴とする請求項70に記載の リソースチェッカ。 72.前記実行エンジンが、前記1つ若しくは複数のステートメントの選択され たステートメントが述語の値に基づいて前記制御流れ経路の一部を決定するか否 かを判定すると共に前記制御流れ経路を決定するために前記述語を評価すること を特徴とする請求項70に記載のリソースチェッカ。 73.前記実行エンジンが、前記述語の前記値が未知の値であるか否かを判定す ることによりかつ前記述語に想定した値を割り当てることにより、前記述語を評 価することを特徴とする請求項72に記載のリソースチェッカ。 74.前記実行エンジンが、前記想定した値から前記リソースの前記状態に関す る情報を推論することを特徴とする請求項73に記載のリソースチェッカ。 75.前記実行エンジンが、前記想定した値から前記述語の1つ若しくは複数の 要素の各々の値を推論することを特徴とする請求項73に記載のリソースチェッ カ。 76.前記実行エンジンが、前記第1の述語の前記1つ若しくは複数の 要素を有する第2の述語の第2の値に基づいて、前記1つ若しくは複数のステー トメントの第2の選択されたステートメントが前記制御流れ経路の第2の部分を 決定するか否かを判定し、 前記実行エンジンが、前記第1の述語の前記1つ若しくは複数の要素の前記推 論された各々の値を用いて、前記制御流れ経路の前記第2の部分を決定するため に前記第2の述語を評価することを特徴とする請求項75に記載のリソースチェ ッカ。 77.前記実行エンジンが、前記1つ若しくは複数のステートメントの選択され たステートメントが呼び出しされるコンポーネントに対する呼び出しであるか否 かを判定し、 前記実行エンジンが、前記選択されたステートメントが呼び出しされるコンポ ーネントに対する呼び出しである場合に、前記リソースの前記リソース状態に対 する前記呼び出されたコンポーネントの前記効果を評価するために、前記呼び出 されたコンポーネントの実行をエミュレートすることを特徴とする請求項70に 記載のリソースチェッカ。 78.前記実行エンジンが、前記リソースが前記呼び出されたコンポーネントの エクスターナルと関連するか否かを判定すること、及び前記エクスターナルと関 連する前記リソースに対する前記コンポーネントの実行の前記効果を前記呼び出 されたコンポーネントのモデルから求めることによって、前記呼び出されたコン ポーネントの実行をエミュレートすることを特徴とする請求項77に記載のリソ ースチェッカ。
───────────────────────────────────────────────────── フロントページの続き (81)指定国 EP(AT,BE,CH,DE, DK,ES,FR,GB,GR,IE,IT,LU,M C,NL,PT,SE),OA(BF,BJ,CF,CG ,CI,CM,GA,GN,ML,MR,NE,SN, TD,TG),AP(KE,MW,SD,SZ,UG), AM,AT,AU,BB,BG,BR,BY,CA,C H,CN,CZ,DE,DK,EE,ES,FI,GB ,GE,HU,IS,JP,KE,KG,KP,KR, KZ,LK,LR,LT,LU,LV,MD,MG,M N,MW,MX,NO,NZ,PL,PT,RO,RU ,SD,SE,SG,SI,SK,TJ,TM,TT, UA,UG,UZ,VN (72)発明者 ブッシュ、ウィリアム・アール アメリカ合衆国カリフォルニア州94402・ サンマテオ・レキシントンアベニュー 1739

Claims (1)

  1. 【特許請求の範囲】 1.電子計算機用プログラムの1つ若しくは複数のステートメントからなるコン ポーネントのプログラミングエラーの検出方法であって、 (a)リソース状態を有するリソースに対する1つ若しくは複数の有効な状態 を定義する過程と、 (b)前記1つ若しくはステートメントを通る制御流れ経路を通過する過程と 、 (c)前記制御流れ経路に沿って前記1つ若しくは複数のステートメントの各 々に対して、(1)前記リソースの前記リソース状態に対する前記ステートメン トの効果を評価する過程と、(2)前記効果に基づいて前記リソース状態から前 記リソース状態の新たなリソース状態への遷移をモデル化する過程とを実施する 過程と、 (d)前記新たな状態が、前記有効な状態のうちの1つの状態であるか否かを 判定する過程とを有することを特徴とするプログラミングエラーの検出方法。 2.前記コンポーネントが関数からなることを特徴とする請求項1に記載の方法 。 3.前記通過する過程が、 前記1つ若しくは複数のステートメントのうち選択されたステートメントが、 述語の値に基づいて前記制御流れ経路の一部を決定しているか否かを判定する過 程と、 前記制御流れ経路を決定するために前記述語を評価する過程とを有することを 特徴とする請求項1に記載の方法。 4.前記述語を評価する過程が、 前記述語の前記値が未知であるか否かを判定する過程と、 前記述語に想定した値を代入する過程とを有することを特徴する請求 項3に記載の方法。 5.前記述語を評価する過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する過程を更 に有することを特徴とする請求項4に記載の方法。 6.前記述語を評価する過程が、 前記想定した値から前記述語の1つ若しくは複数のオペランドの各々の値を推 論する過程を更に有することを特徴とする請求項4に記載の方法。 7.前記通過する過程が、 前記1つ若しくは複数のステートメントのうちの第2の選択されたステートメ ントが、前記第1の述語の前記1つ若しくは複数のオペランドからなる第2の述 語の第2の値に基づいて前記制御流れ経路の第2の部分を決定しているか否かを 判定する過程と、 前記第1の述語の前記1つ若しくは複数のオペランドの前記推論された各々の 値を用いて前記制御流れ経路の前記第2の部分を求めるために前記第2の述語を 評価する過程とを更に有することを特徴とする請求項6に記載の方法。 8.前記過程(c)の前記前記(1)が、 前記ステートメントが、呼び出されたコンポーネントに対する呼び出しである か否かを判定する過程と、 前記ステートメントが、呼び出されたコンポーネントに対する呼び出しである 場合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネン トの効果を評価するために、前記呼び出されたコンポーネントの実行をエミュレ ートする過程とを更に有することを特徴とする請求項1に記載の方法。 9.前記呼び出されたコンポーネントの実行をエミュレートする前記過 程が、 前記リソースが、前記呼び出されたコンポーネントのエクスターナルに関連し ているか否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルと関連す る前記リソースに対する前記呼び出されたコンポーネントの実行の前記効果を判 定する過程とを有することを特徴とする請求項8に記載の方法。 10.前記リソースが前記有効な状態のうちの何れでもないことをユーザに通知 する過程を更に有することを特徴とする請求項1に記載の方法。 11.前記リソースの状態に対するその効果が、前記有効な状態の何れでもない 新たなリソース状態への遷移を引き起こすという効果である、前記ステートメン トを、ユーザに対して特定する過程を更に有することを特徴とする請求項1に記 載の方法。 12.1つ若しくは複数のステートメントを有する電子計算機用プログラムのコ ンポーネントのプログラミングエラーの検出方法であって、 (a)リソース状態を有する1つのリソースに対する1つ若しくは複数の有効 な状態を定義する過程と、 (b)各々が前記有効な状態の第1の状態から前記有効な状態の第2の状態へ の状態遷移である1つ若しくは複数の有効な状態遷移を定義する過程と、 (c)前記1つ若しくは複数のステートメントを通る制御流れ経路を通過する 過程と、 (d)前期制御流れ経路に沿った前記1つ若しくは複数のステートメントの各 々に対して、(1)前記リソースの前記リソース状態に対する前記ステートメン トの効果を評価する過程と、(2)前記効果に基づいて前記リソースの前記リソ ース状態の変化をモデル化する過程とを実行 する過程と、 (e)前記変化が、前記有効な状態遷移のうちの1つではないことを検知する 過程とを有することを特徴とする方法。 13.前記通過する過程が、 前記1つ若しくは複数のステートメントのうちの選択されたステートメントが 、述語の値に基づいて前記制御流れ経路の一部分を決定しているか否かを判定す る過程と、 前記制御流れ経路を決定するために、前記述語を評価する過程とを有すること を特徴とする請求項12に記載の方法。 14.前記述語を評価する前記過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を代入する過程とを有することを特徴とする請求項13 に記載の方法。 15.前記述語を評価する前記過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する過程を更 に有することを特徴とする請求項14に記載の方法。 16.前記述語を評価する前記過程が、 前記想定した値から、前記述語の1つ若しくは複数の要素の各々の値を推論す る過程を更に有することを特徴とする請求項14に記載の方法。 17.前記通過する過程が、 前記1つ若しくは複数のステートメントのうちの第2の選択されたステートメ ントが、前記第1の述語の前記1つ若しくは複数の要素を有する第2の述語の第 2値に基づいて前記制御流れ経路の第2の部分を判定する過程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、 前記第2の述語を評価する過程とを更に有することを特徴とする請求項16に記 載の方法。 18.前記過程(d)の前記過程(1)が、 前記ステートメントが、呼び出されたコンポーネントに対する呼び出しである か否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しである場 合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネント の前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミュ レートする過程とを有することを特徴とする請求項12に記載の方法。 19.前記呼び出されたコンポーネントの実行をエミュレートする前記過程が、 前記リソースが、前記呼び出されたコンポーネントのエクスターナルに関連す るか否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルに関連す る前記リソースに対する前記コンポーネントの前記実行の前記効果を求める過程 とを有することを特徴とする請求項18に記載の方法。 20.前記リソース状態が前記有効な状態の何れでもないことをユーザに通知す る過程を更に有することを特徴とする請求項12に記載の方法。 21.前記リソース状態に対するその効果が、前記有効な状態の何れでもない新 たなリソース状態への遷移を引き起こす効果である前記ステートメントを、ユー ザに対して特定する過程とを更に有することを特徴とする請求項12に記載の方 法。 22.エクスターナルを含む電子計算機用プログラムのコンポーネントの振る舞 いのモデル化方法であって、 (a)前記エクスターナルに対して、エクスターナル状態を含む1つ 若しくは複数の有効な状態を定義する過程と、 (b)前記コンポーネントの1つ若しくは複数のステートメントを有する制御 流れ経路を通過する過程と、 (c)前記1つまたは複数のステートメントの各々に対して、(1)前記ステ ートメントの実行が、前記エクスターナルの前記エクスターナル状態に対する効 果を有するか否かを判定する過程と、(2)前記効果に基づいて前記エクスター ナル状態から前記エクスターナル状態の新たなエクスターナル状態への遷移をモ デル化する過程とを実行する過程と、 (d)前記エクスターナルに対する前記コンポーネントの前記ステートメント の共通の効果を表すモデルを構築する過程とを有することを特徴とする電子計算 機用プログラムのコンポーネントの振る舞いのモデル化方法。 23.前記通過する過程が、 前記1つ若しくは複数のステートメントの内の選択されたステートメントが、 述語の値に基づいて前記制御流れ経路の一部を決定するか否かを判定する過程と 、 前記制御流れ経路を決定するために、前記述語を評価する過程とを有すること を特徴とする請求項22に記載の方法。 24.前記述語を評価する過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を代入する過程とを有することを特徴とする請求項23 に記載の方法。 25.前記述語を評価する前記過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する過程を更 に有することを特徴とする請求項24に記載の方法。 26.前記述語を評価する前記過程が、 前記想定した値から、前記述語の1つ若しくは複数のコンポーネントの各々の 値を推論する過程を更に有することを特徴とする請求項24に記載の方法。 27.前記通過する過程が、 前記1つ若しくは複数のステートメントのうちの第2の選択されたステートメ ントが、前記第1の述語の前記1つ若しくは複数の要素を有する第2の述語の第 2の値に基づいて前記制御流れ経路の第2の部分を決定するか否かを判定する過 程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語を 評価する過程とを更に有することを特徴とする請求項26に記載の方法。 28.前記述語を評価する前記過程が、 前記想定した値から、前記エクスターナルの前記状態に関する情報を推論する 過程を更に有することを特徴とする請求項24に記載の方法。 29.前記過程(C)の前記過程(1)が、 前記ステートメントが、呼び出されたコンポーネントに対する呼び出しである か否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しである場 合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネント の前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミュ レートする過程とを有することを特徴とする請求項22に記載の方法。 30.前記呼び出されたコンポーネントの実行をエミュレートする前記過程が、 前記リソースが、前記呼び出されたコンポーネントのエクスターナル に関連しているか否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルに関連す る前記リソースに対する前記コンポーネントの実行の前記効果を求める過程とを 有することを特徴とする請求項29に記載の方法。 31.(e)1つ若しくは複数のステートメントの第2の集合を有する第2の制 御流れ経路を通過する過程と、 (f)前記1つ若しくは複数のステートメントからなる第2の集合の各々のステ ートメントに対し、(1)前記ステートメントの実行が、前記エクスターナルの 前記エクスターナル状態に対する効果を有するか否かを判定する過程と、(2) 前記効果に基づき、前記エクスターナル状態から前記エスクターナル状態の第2 の新たなエクスターナル状態への遷移をモデル化する過程とを実行する過程と、 (g)前記第1の新たなエクスターナル状態と前記第2の新たなエタスターナ ル状態とから、前記エスクターナルの組合せエクスターナル状態を形成する過程 とを更に有することを特徴とする請求項22に記載の方法。 32.前記通過する過程が、 前記1つ若しくは複数のステートメントのうちの選択されたステートメントが 、述語の値に基づいて前記第2の制御流れ経路の一部を決定するか否かを判定す る過程と、 前記第2の制御流れ経路を決定するために、前記述語を評価する過程とを有す ることを特徴とする請求項31に記載の方法。 33.前記述語を評価する過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を代入する過程を有することを特徴とする請求項32に 記載の方法。 34.前記述語を評価する前記過程が、 前記想定した値から前記リソースの前記状態に関する情報を推論する過程を更 に有することを特徴とする請求項33に記載の方法。 35.前記述語を評価する過程が、 前記想定した値から、前記述語の1つ若しくは複数の要素の各々の値を推論す る過程を更に有することを特徴とする請求項33に記載の方法。 36.前記述語を評価する過程が、 前記想定した値から、前記エクスターナルの前記状態に関する情報を推論する 過程を更に有することを特徴とする請求項33に記載の方法。 37.前記通過する過程が、 前記1つ若しくは複数のステートメントの第2の選択されたステートメントが 、前記第1の述語の前記1つ若しくは複数の要素を有する第2の述語の第2の値 に基づいて前記制御流れ経路の第2の部分を決定するか否かを判定する過程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語を 評価する過程を更に有することを特徴とする請求項35に記載の方法。 38.前記過程(f)の前記過程(1)が、 前記ステートメントが、呼び出されたコンポーネントに対する呼び出しである か否かを判定する過程と、 前記ステートメントが前記呼び出されたコンポーネントに対する呼び出しであ る場合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネ ントに対する前記効果を評価するために、前記呼び出されたコンポーネントの実 行をエミュレートする過程とを有することを特徴とする請求項31に記載の方法 。 39.前記呼び出されたコンポーネントの実行をエミュレートする過程が、 前記リソースが、前記呼び出されたコンポーネントのエクスターナルと関連す るか否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルと関連す る前記リソースに対する前記コンポーネントの実行の前記効果を求める過程とを 有することを特徴とする請求項38に記載の方法。 40.前記エクスターナルの前記組合せ状態から、前記コンポーネントの前記振 る舞いのモデルを導き出す過程を更に有することを特徴とする請求項31に記載 の方法。 41.前記コンポーネントの前記振る舞いの前記モデル内に、前記エクスターナ ルの前記状態の1つ若しくは複数の遷移を指示する情報を含める過程を更に有す ることを特徴とする請求項40に記載の方法。 42.前記エクスターナルに対する前記第1のコンポーネントの実行の効果を決 定するために、前記第1のコンポーネントへの呼び出しを含む前記電子計算機用 プログラムの呼び出しコンポーネントを分析する間に、前記モデルを用いる過程 を更に有することを特徴とする請求項22に記載の方法。 43.リソースの利用を指示する電子計算機用プログラムのコンポーネントの振 る舞いをモデル化する方法であって、 (a)リソース状態を有する前記リソースに対する1つ若しくは複数の有効な 状態を定義する過程と、 (b)前記コンポーネントの1つ若しくは複数のステートメントを有する制御 流れ経路を通過する過程と、 (c)前記1つ若しくは複数のステートメントの各々に対して、(1)前記ス テートメントの前記実行が、前記リソースの前記リソース状態に 対する効果を有するか否かを判定する過程と、(2)前記効果に基づいて前記リ ソース状態から前記リソース状態の新たなリソース状態への遷移をモデル化する 過程とを実行する過程と、 (d)前記リソースに対する前記コンポーネントの前記ステートメントの共通 の効果を表すモデルを構築する過程とを有することを特徴とする方法。 44.前記通過する過程が、 前記1つ若しくは複数のステートメントの選択されたステートメントが、述語 の値に基づいて前記制御流れ経路の一部を決定するか否かを判定する過程と、 前記制御流れ経路を決定するために、前記述語を評価する過程とを有すること を特徴とする請求項43に記載の方法。 45.前記評価する過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を代入する過程とを有することを特徴とする請求項44 に記載の方法。 46.前記述語を評価する過程が、 前記想定した値から、前記リソースの前記状態に関する情報を推論する過程を 更に有することを特徴とする請求項45に記載の方法。 47.前記述語を評価する過程が、 前記想定した値が、前記述語の前記1つ若しくは複数の要素の各々値を推論す る過程を更に有することを特徴とする請求項45に記載の方法。 48.前記通過する過程が、 前記1つ若しくは複数のステートメントのうちの第2の選択されたステートメ ントが、前記第1の述語の1つ若しくは複数の前記要素を第2の述語の第2の値 に基づいて前期制御流れ経路の第2の部分を決定する か否かを判定する過程と、 前記第1の述語の前記1つ若しくは複数の要素の前記推論された各々の値を用 いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語を 評価する過程とを更に有することを特徴とする請求項47に記載の方法。 49.前記過程(c)の前記過程(1)が、 前記ステートメントが、前記呼び出されたコンポーネントに対する呼び出しで あるか否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しである場 合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネント の前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミュ レートする過程とを有することを特徴とする請求項43に記載の方法。 50.前記呼び出されたコンポーネントの実行をエミュレートする過程が、 前記リソースが、呼び出されたコンポーネントのエクスターナルに関連するか 否かを判定する過程を、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルと関連す る前記リソースに対する前記コンポーネントの実行の前記効果を決定する過程を 有することを特徴とする請求項49に記載の方法。 51.(e)1つ若しくは複数のステートメントの第2の集合を有する第2の制 御流れ経路を通過する過程と、 (f)前記1つ若しくは複数のステートメントからなる前記第2の集合の各ス テートメントに対して、(1)前記リソースの前記リソース状態に対する前記ス テートメントの効果を評価する過程と、(2)前記効果に基づいて、前記リソー スのステートメントから前記リソースの第2 の新たなリソースのステートメントへの遷移をモデル化する過程とを実行する過 程と、 (g)前記第1の新たなリソースのステートメントと前記第2の新たなリソー スのステートメントとから、前記リソースの共通のリソースのステートメントを 形成する過程とを更に有することを特徴とする請求項43に記載の方法。 52.前記通過する過程が、 前記1つ若しくは複数のステートメントの選択されたステートメントが、述語 の値に基づいて前記制御流れ経路の一部を決定するか否かを判定する過程と、 前記制御流れ経路を決定するために、前記述語を評価する過程とを有すること を特徴とする請求項51に記載の方法。 53.前記述語を評価する過程が、 前記述語の前記値が未知の値であるか否かを判定する過程と、 前記述語に想定した値を代入する過程とを有することを特徴とする請求項52 に記載の方法。 54.前記述語を評価する前記過程が、 前記想定した値から前記リソースが前記状態に関する情報を推論する過程を更 に有することを特徴とする請求項53に記載の方法。 55.前記述語を評価する前記過程が、 前記想定した値から、前記述語の前記1つまたは複数の要素の各々の値を推論 する過程を更に有することを特徴とする請求項53に記載の方法。 56.前記通過する過程が、 前記1つまたは複数のステートメントのうちの第2の選択されたステートメン トが、前記第1の述語の前記1つまたは複数の要素を有する第 2の述語の第2の値に基づいて、前記制御流れ経路の第2の部分を決定するか否 かを判定する過程と、 前記第1の述語の前記1つまたは複数の要素の前記推論されたおのおのの値を 用いて、前記制御流れ経路の前記第2の部分を決定するために、前記第2の述語 を評価する過程とを更に有することを特徴とする請求項55に記載の方法。 57.前記過程(g)の前記過程(1)が、 前記ステートメントが、呼び出されたコンポーネントに対する呼び出しであ るか否かを判定する過程と、 前記ステートメントが呼び出されたコンポーネントに対する呼び出しである場 合、前記リソースの前記リソース状態に対する前記呼び出されたコンポーネント の前記効果を評価するために、前記呼び出されたコンポーネントの実行をエミュ レートする過程を有することを特徴とする請求項51に記載の方法。 58.前記呼び出されたコンポーネントの実行をエミュレートする過程が 前記リソースが前記呼び出されたコンポーネントのエクスターナルと関連して いるか否かを判定する過程と、 前記呼び出されたコンポーネントのモデルから、前記エクスターナルの関連す る前記リソースに対する前記コンポーネントの前記効果を判定する過程とを有す ることを特徴とする請求項57に記載の方法。 59.前記リソースの前記組み合わせ状態から、前記コンポーネントの前記振る 舞いのモデルを導き出す過程を更に有することを特徴とする請求項51に記載の 方法。 60.前記コンポーネントの前記振る舞いの前記モデルに、前記リソースの前記 状態の1つまたは複数の遷移を指示する情報を包含させる過程 を更に有することを特徴とする請求項59に記載の方法。 61.前記リソースの前記第1のコンポーネントの実行の前記効果を求めるため に、前記第1のコンポーネントに対する呼び出しを含む前記電子計算機用プログ ラムのコーリングコンポーネントを解析する間に、前記モデルを用いる過程を更 に有することを特徴とする請求項43に記載の方法。 62.電子計算機用プログラムのコーリングコンポーネントの実行の項目に対す る効果の解析方法であって、 前記コーリングコンポーネントが、エクスターナルからなる前記項目を有する 呼び出されたコンポーネントに対する呼び出しを含むか否かを判定する過程と、 前記呼び出されたコンポーネントの前記実行の前記呼び出されたコンポーネン トの1つ若しくは複数の前記エクスターナルに対する効果を記述しているコンポ ーネントモデルから、前記呼び出されたコンポーネントの実行の前記項目の前記 効果を判定する過程とを有することを特徴とする電子計算機用プログラムのコー リングコンポーネントの実行の項目に対する効果の解析方法。 63.前記項目が状態を有し、 前記呼び出されたコンポーネントの実行の前記項目に対する効果を判定する過 程が、前記呼び出されたコンポーネントによって指示された前記項目の前記状態 の変化を判定する過程を有することを特徴とする請求項62に記載の方法。 64.前記呼び出されたコンポーネントが、前記項目の前記状態に実施されるべ き1つ若しくは複数のオペレーションを特定することによって、前記項目の前記 状態の変化を指示することを特徴とする請求項63に記載の方法。 65.前記呼び出されたコンポーネントが、有効な状態から無効な状態への前記 項目の前記状態の遷移を指示しているか否かを判定する過程を更に有することを 特徴とする請求項63に記載の方法。 66.前記呼び出されたコンポーネントが、第1の有効な状態から第2の有効な 状態への遷移以外の前記項目の前記状態の遷移を指示しているか否かを判定する 過程を更に有することを特徴とする請求項63に記載の方法。 67.電子計算機用プログラムのコンポーネントのプログラミングエラーの検出 方法であって、 前記コンポーネントの1つ若しくは複数のステートメントによってその利用が 指示されているリソースが、1つ若しくは複数のステートメントの何れかの中に あるか否かを検出する過程と、 前記コンポーネントが、前記リソースが前記1つ若しくは複数のステートメン トの特定のステートメントのなかにあることを要求する第1のステートメントを 含むことを検知し、かつ、前記第1のステートメントが、前記コンポーネントを 通過する制御流れ経路において、その実行より前記リソースが前記特定の状態に あることが確実となる第2のステートメントによって先行されていないことを検 知する過程とを有することを特徴とする電子計算機用プログラムのコンポーネン トのプログラミングエラーの検出方法。 68.前記1つ若しくは複数の状態が、確定的にアロケートされた状態と、確定 的にアロケートされていない状態とを有することを特徴とする請求項67に記載 の方法。 69.前記特定の状態が、前記確定的にアロケートされた状態からなることを特 徴とする請求項68に記載の方法。 70.電子計算機用プログラムのコンポーネントのリソースのリークの 検知方法であって、前記コンポーネントは、1つ若しくは複数のリソースの利用 を指示するステートメントと、1つ若しくは複数のエクスターナルとを含み、 前記検出方法が、 前記1つ若しくは複数のリソースのうちのいずれのリソースが前記1つ若しく は複数のエクスターナルの何れかによって到達されるか否かを判定する過程と、 前記エクスターナルによって到達されない前記リソースが、前記コンポーネン トの実行の終了時にアロケートさけた状態にあるか否かを判定する過程とを有す ることを特徴とする方法。 71.前記1つ若しくは複数のリソースのいずれが到達されるかを判定する前記 過程が、 前記コンポーネントのエクスターナルが、前記リソースへ到達するための項目 を含む集群に含まれているか否かを判定する過程を有することを特徴とする請求 項70に記載の方法。 72.電予計算機用プログラムのコンポーネントのデータフロー解析の実行方法 であって、 前記コンポーネントのステートメントが、述語の値に基づいて制御を遷移させ る1つ若しくは複数の要素を有する条件付き分岐ステートメントからなるか否か を判定する過程と、 前記述語が第1の値を有すると仮定する過程と、 前記第1の値から、前記述語の前記1つ若しくは複数の要素のおのおのの値を 推論する過程とを有することを特徴とする方法。 73.前記述語の前記第1の値に基づいて、前記コンポーネントを通って、前記 条件付けられた分岐ステートメントを有する制御流れ経路を通過させる過程を更 に有することを特徴とする請求項72に記載の方法。 74.前記コンポーネントの第2のステートメントが、前記第1の述語の前記1 つ若しくは複数の要素を含むと共に第2の述語の第2の値に基づいて制御を遷移 させる第2の条件付けられた分岐ステートメントであるか否かを判定する過程と 、 前記第1の述語の前記1つ若しくは複数の要素の前記推論されたおのおのの値 から前記第2の値を求める過程とを更に有することを特徴とする請求項72に記 載の方法。 75.電子計算機用プログラムの1つ若しくは複数のステートメントを有するコ ンポーネントのプログラミングエラーを検出するリソースチェッカであって、 リソース状態を有するリソースに対して1つ若しくは複数の有効な状態を定義 するリソース振る舞いモデルと、 前記1つ若しくは複数のステートメントを通る制御流れ経路を通過すると共に 前記1つ若しくは複数のステートメントのおのおのが前記リソースの前記リソー ス状態に対する各々の効果を有するか否かを判定する実行エンジンと、 前記1つ若しくは複数のステートメントの各々の前記効果に基づく前記リソー ス状態から新たなリソース状態への遷移をモデル化し、かつ前記新たな状態が前 記有効な状態のうちのいずれかの状態であるか否かを検出する状態マシンとを有 することを特徴とするリソースチェッカ。 76.前記コンポーネントが関数からなることを特徴とする請求項75に記載の リソースチェッカ。 77.前記実行エンジンが、前記1つ若しくは複数のステートメントのうちの選 択されたステートメントが述語の値に基づく前記制御流れ経路の一部を決定する か否かを判定し、かつ前記制御流れ経路を決定するた めに前記述語を評価することを特徴とする請求項75に記載のリソースチェッカ 。 78.前記実行エンジンが、前記述語の前記値が未知の値であるか否かを判定し 、かつ前記述語に想定した値を代入することによって前記述語を評価することを 特徴とする請求項77に記載のリソースチェッカ。 79.前記実行エンジンが、前記想定した値から、前記リソースの前記状態に関 する情報を推論することを特徴とする請求項78に記載のリソースチェッカ。 80.前記実行エンジンが、前記想定した値から、前記述語の1つ若しくは複数 の要素の各々の値を推論することを特徴とする請求項78に記載のリソースチェ ッカ。 81.前記実行エンジンが、前記1つ若しくは複数のステートメントの第2の選 択されたステートメントが前記第1の述語の1つ若しくは複数の前記要素を有す る第2の述語の第2の値に基づいて前記制御フローバスの第2の部分を決定して いるか否かを判定して前記制御流れ経路を通過し、 前記実行エンジンが、前記第1の述語の前記1つ若しくは複数の要素の前記推 論された各々の値を用いて前記制御流れ経路の前記第2の部分を決定するために 前記第2の述語を評価することを特徴とする請求項80に記載のリソースチェッ カ。 82.前記実行エンジンが、前記1つ若しくは複数のステートメントのうちの選 択されたステートメントが呼び出しされるコンポーネントに対する呼び出しであ るか否かを判定し、 前記実行エンジンが、前記選択されたステートメントが呼び出されたコンポー ネントに対する呼び出しからなる場合に、前記リソースの前記リソース状態に対 する前記呼び出されたコンポーネントの前記効果を評 価するために前記呼び出されたコンポーネントの実行をエミュレートすることを 特徴とする請求項75に記載のリソースチェッカ。 83.前記実行エンジンが、前記リソースが前記呼び出されたコンポーネントの エクスターナルと関係しているか否かを判定し、かつ前記呼び出されたコンポー ネントのモデルから前記リソースの前記エクスターナルと関係する前記コンポー ネントの実行の効果を求めることによって、前記呼び出されたコンポーネントの 実行をエミュレートすることを特徴とする請求項82に記載のリソースチェッカ 。
JP50738496A 1994-08-10 1995-08-09 コンピュータプロセスのリソースのモデル化方法及び装置 Expired - Fee Related JP4213203B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US08/289,148 US5694539A (en) 1994-08-10 1994-08-10 Computer process resource modelling method and apparatus
US289,148 1994-08-10
PCT/US1995/009691 WO1996005556A1 (en) 1994-08-10 1995-08-09 Computer process resource modelling method and apparatus

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP2006159153A Division JP4430043B2 (ja) 1994-08-10 2006-06-07 プログラムコンポーネントのエラーをチェックするための、コンピュータにおける方法

Publications (2)

Publication Number Publication Date
JPH10509258A true JPH10509258A (ja) 1998-09-08
JP4213203B2 JP4213203B2 (ja) 2009-01-21

Family

ID=23110253

Family Applications (2)

Application Number Title Priority Date Filing Date
JP50738496A Expired - Fee Related JP4213203B2 (ja) 1994-08-10 1995-08-09 コンピュータプロセスのリソースのモデル化方法及び装置
JP2006159153A Expired - Fee Related JP4430043B2 (ja) 1994-08-10 2006-06-07 プログラムコンポーネントのエラーをチェックするための、コンピュータにおける方法

Family Applications After (1)

Application Number Title Priority Date Filing Date
JP2006159153A Expired - Fee Related JP4430043B2 (ja) 1994-08-10 2006-06-07 プログラムコンポーネントのエラーをチェックするための、コンピュータにおける方法

Country Status (8)

Country Link
US (5) US5694539A (ja)
EP (1) EP0775342B1 (ja)
JP (2) JP4213203B2 (ja)
AT (1) ATE182223T1 (ja)
AU (1) AU3235795A (ja)
CA (2) CA2197071C (ja)
DE (1) DE69510801T2 (ja)
WO (1) WO1996005556A1 (ja)

Families Citing this family (120)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6513154B1 (en) 1996-10-21 2003-01-28 John R. Porterfield System and method for testing of computer programs in programming effort
US5920716A (en) * 1996-11-26 1999-07-06 Hewlett-Packard Company Compiling a predicated code with direct analysis of the predicated code
US5822589A (en) * 1996-12-06 1998-10-13 Hewlett-Packard Company Method for locating errors in a computer program
US5872957A (en) * 1997-05-01 1999-02-16 International Business Machines Corporation Method for flexible simulation modeling of multi-component systems
US6222537B1 (en) * 1997-07-29 2001-04-24 International Business Machines Corporation User interface controls for a computer system
US6282701B1 (en) 1997-07-31 2001-08-28 Mutek Solutions, Ltd. System and method for monitoring and analyzing the execution of computer programs
US6202199B1 (en) 1997-07-31 2001-03-13 Mutek Solutions, Ltd. System and method for remotely analyzing the execution of computer programs
JP3199013B2 (ja) * 1998-01-26 2001-08-13 日本電気株式会社 言語処理方法及び言語処理装置並びに言語処理プログラムを記録した記憶媒体
US6104873A (en) * 1998-02-03 2000-08-15 International Business Machines Corporation Use of language instructions and functions across multiple processing sub-environments
US5995752A (en) * 1998-02-03 1999-11-30 International Business Machines Corporation Use of language instructions and functions across multiple processing sub-environments
CA2240584C (en) * 1998-06-12 2002-02-12 Ibm Canada Limited - Ibm Canada Limitee Compile-time data dependency verification
US6378088B1 (en) * 1998-07-14 2002-04-23 Discreet Logic Inc. Automated test generator
US6189116B1 (en) * 1998-07-14 2001-02-13 Autodesk, Inc. Complete, randomly ordered traversal of cyclic directed graphs
US6219805B1 (en) * 1998-09-15 2001-04-17 Nortel Networks Limited Method and system for dynamic risk assessment of software systems
WO2000023863A2 (en) * 1998-10-16 2000-04-27 Computer Associates Think, Inc. Determining differences between two or more metadata models
US7039495B1 (en) * 1998-12-08 2006-05-02 Advance Micro Devices, Inc. Management of multiple types of empty carriers in automated material handling systems
US6321378B1 (en) * 1998-12-10 2001-11-20 International Business Machines Corporation Automated code replication during application development
GB9828794D0 (en) * 1998-12-29 1999-02-17 Sgs Thomson Microelectronics Generation of a system model
US6782530B1 (en) * 1999-04-05 2004-08-24 Microsoft Corporation Method of ranking messages generated in a computer system
FR2797963B1 (fr) * 1999-08-23 2002-11-29 Trusted Logic Protocole de gestion, procede de verification et de transformation d'un fragment de programme telecharge et systemes correspondants
US9916134B2 (en) * 1999-10-05 2018-03-13 Dietrich Charisius Methods and systems for accessing distributed computing components through the internet
US7734457B2 (en) 1999-10-16 2010-06-08 Computer Associates Think, Inc. Method and system for generating dynamic comparison models
US6539539B1 (en) * 1999-11-16 2003-03-25 Lucent Technologies Inc. Active probes for ensuring software package compatibility
US7058928B2 (en) 1999-12-23 2006-06-06 Identify Software Ltd. System and method for conditional tracing of computer programs
US7024661B2 (en) * 2000-01-07 2006-04-04 Hewlett-Packard Development Company, L.P. System and method for verifying computer program correctness and providing recoverable execution trace information
US6701513B1 (en) 2000-01-14 2004-03-02 Measurement Computing Corporation Program-development environment for use in generating application programs
US6425120B1 (en) * 2000-01-14 2002-07-23 Softwire Technology Llc Repeating program object for use with a graphical program-development system
US6684385B1 (en) 2000-01-14 2004-01-27 Softwire Technology, Llc Program object for use in generating application programs
US7082599B1 (en) 2000-01-14 2006-07-25 Measurement Computing Corporation Method and apparatus for detecting and resolving circularflow paths in graphical programming systems
CA2297994A1 (en) * 2000-02-04 2001-08-04 Ibm Canada Limited-Ibm Canada Limitee Automated testing computer system components
US6996557B1 (en) * 2000-02-15 2006-02-07 International Business Machines Corporation Method of optimizing SQL queries where a predicate matches nullable operands
US20020087949A1 (en) 2000-03-03 2002-07-04 Valery Golender System and method for software diagnostics using a combination of visual and dynamic tracing
US6763497B1 (en) 2000-04-26 2004-07-13 Microsoft Corporation Method and apparatus for displaying computer program errors as hypertext
JP2001343967A (ja) * 2000-05-31 2001-12-14 Konami Co Ltd 表示制御方法、ゲーム機、記録媒体
US20030121027A1 (en) * 2000-06-23 2003-06-26 Hines Kenneth J. Behavioral abstractions for debugging coordination-centric software designs
US20030005407A1 (en) * 2000-06-23 2003-01-02 Hines Kenneth J. System and method for coordination-centric design of software systems
US7219332B2 (en) * 2000-07-07 2007-05-15 Microsoft Corporation Configuring software components(merge) with transformation component using configurable and non-configurable data elements
US7120902B2 (en) * 2000-12-04 2006-10-10 Hewlett-Packard Development Company, L.P. Method and apparatus for automatically inferring annotations
US8312435B2 (en) 2000-12-26 2012-11-13 Identify Software Ltd. (IL) System and method for conditional tracing of computer programs
US20040015816A1 (en) * 2001-01-05 2004-01-22 Hines Kenneth Joseph Coordination synthesis for software systems
US7284274B1 (en) * 2001-01-18 2007-10-16 Cigital, Inc. System and method for identifying and eliminating vulnerabilities in computer software applications
US7539747B2 (en) 2001-03-14 2009-05-26 Microsoft Corporation Schema-based context service
US7136859B2 (en) * 2001-03-14 2006-11-14 Microsoft Corporation Accessing heterogeneous data in a standardized manner
US7024662B2 (en) 2001-03-14 2006-04-04 Microsoft Corporation Executing dynamically assigned functions while providing services
US7302634B2 (en) 2001-03-14 2007-11-27 Microsoft Corporation Schema-based services for identity-based data access
US7284271B2 (en) 2001-03-14 2007-10-16 Microsoft Corporation Authorizing a requesting entity to operate upon data structures
US6817014B2 (en) * 2001-04-11 2004-11-09 Hewlett-Packard Development Company, L.P. Analysis of executable program code using compiler-generated function entry points and endpoints with other sources of function entry points and endpoints
US6842891B2 (en) * 2001-09-11 2005-01-11 Sun Microsystems, Inc. Dynamic attributes for distributed test framework
US6910158B2 (en) * 2001-10-01 2005-06-21 International Business Machines Corporation Test tool and methods for facilitating testing of duplexed computer functions
KR100409028B1 (ko) * 2001-10-29 2003-12-06 전흥재 면역인자흡수체가 그라프트된 백혈구 제거필터 제조방법및 이에 의해 제조된 필터
US7213175B2 (en) * 2002-01-09 2007-05-01 Microsoft Corporation Methods and systems for managing an application's relationship to its run-time environment
FR2838205B1 (fr) * 2002-04-09 2006-08-18 Canon Kk Procede de detection d'erreurs dans un programme informatique
US6862682B2 (en) * 2002-05-01 2005-03-01 Testquest, Inc. Method and apparatus for making and using wireless test verbs
US20030208542A1 (en) * 2002-05-01 2003-11-06 Testquest, Inc. Software test agents
US6898704B2 (en) * 2002-05-01 2005-05-24 Test Quest, Inc. Method and apparatus for making and using test verbs
US9886309B2 (en) 2002-06-28 2018-02-06 Microsoft Technology Licensing, Llc Identity-based distributed computing for device resources
US6957367B2 (en) * 2002-08-30 2005-10-18 Hewlett-Packard Development Company L.P. System and method for controlling activity of temporary files in a computer system
US7386839B1 (en) 2002-11-06 2008-06-10 Valery Golender System and method for troubleshooting software configuration problems using application tracing
US7051322B2 (en) * 2002-12-06 2006-05-23 @Stake, Inc. Software analysis framework
US7401057B2 (en) 2002-12-10 2008-07-15 Asset Trust, Inc. Entity centric computer system
US8032866B1 (en) 2003-03-27 2011-10-04 Identify Software Ltd. System and method for troubleshooting runtime software problems using application learning
US20040230959A1 (en) * 2003-05-14 2004-11-18 Vick Paul A. Is not operator
US7343589B2 (en) * 2003-06-18 2008-03-11 Microsoft Corporation Declarative state space reduction in a transactional messaging language
US7818729B1 (en) 2003-09-15 2010-10-19 Thomas Plum Automated safe secure techniques for eliminating undefined behavior in computer software
US7810080B2 (en) * 2003-09-15 2010-10-05 Thomas Plum Automated safe secure techniques for eliminating undefined behavior in computer software
WO2005029241A2 (en) * 2003-09-15 2005-03-31 Plum Thomas S Automated safe secure techniques for eliminating
US7856624B2 (en) * 2003-09-15 2010-12-21 Thomas Plum Automated safe secure techniques for eliminating undefined behavior in computer software
US7421680B2 (en) * 2003-09-22 2008-09-02 Microsoft Corporation Persisted specifications of method pre-and post-conditions for static checking
JP2005122560A (ja) * 2003-10-17 2005-05-12 Fujitsu Ltd デッドロック事前検出プログラム
US7505952B1 (en) * 2003-10-20 2009-03-17 The Board Of Trustees Of The Leland Stanford Junior University Statistical inference of static analysis rules
US7610584B2 (en) * 2004-01-02 2009-10-27 International Business Machines Corporation Method, system, and product for defining and managing provisioning states for resources in provisioning data processing systems
US20080109785A1 (en) * 2004-01-16 2008-05-08 Bailey Bendrix L Graphical Program Having Graphical and/or Textual Specification of Event Handler Procedures for Program Objects
US7793271B2 (en) * 2004-06-17 2010-09-07 State Of Oregon Acting By And Through The State Board Of Higher Education On Behalf Of Portland State University Bi-directional product development process simulation
US7155653B2 (en) * 2004-08-02 2006-12-26 Comcast Cable Holdings, Llc System and method for testing electronic device performance
US20060136877A1 (en) * 2004-12-22 2006-06-22 International Business Machines Corporation Method, system and program product for capturing a semantic level state of a program
US9152531B2 (en) * 2005-02-18 2015-10-06 Green Hills Sofware, Inc. Post-compile instrumentation of object code for generating execution trace data
US8266608B2 (en) * 2005-02-18 2012-09-11 Green Hills Software, Inc. Post-compile instrumentation of object code for generating execution trace data
US7549144B2 (en) * 2005-02-22 2009-06-16 Microsoft Corporation Custom API modeling for source code static analysis simulator
US8713025B2 (en) 2005-03-31 2014-04-29 Square Halt Solutions, Limited Liability Company Complete context search system
WO2007022454A2 (en) 2005-08-18 2007-02-22 The Trustees Of Columbia University In The City Of New York Systems, methods, and media protecting a digital data processing device from attack
WO2007050667A2 (en) 2005-10-25 2007-05-03 The Trustees Of Columbia University In The City Of New York Methods, media and systems for detecting anomalous program executions
US7707553B2 (en) * 2005-12-08 2010-04-27 International Business Machines Corporation Computer method and system for automatically creating tests for checking software
US9489290B1 (en) 2005-12-30 2016-11-08 The Mathworks, Inc. Scheduling tests based on a valuation system
US8209667B2 (en) * 2006-01-11 2012-06-26 International Business Machines Corporation Software verification using hybrid explicit and symbolic model checking
US20070174823A1 (en) * 2006-01-25 2007-07-26 Microsoft Corporation Compile-time interpretable code error detection
US8321666B2 (en) * 2006-08-15 2012-11-27 Sap Ag Implementations of secure computation protocols
WO2008055156A2 (en) 2006-10-30 2008-05-08 The Trustees Of Columbia University In The City Of New York Methods, media, and systems for detecting an anomalous sequence of function calls
US8613080B2 (en) 2007-02-16 2013-12-17 Veracode, Inc. Assessment and analysis of software security flaws in virtual machines
WO2008137223A1 (en) * 2007-05-07 2008-11-13 Nec Laboratories America, Inc. Accelerating model checking via synchrony
US8799856B2 (en) * 2007-06-12 2014-08-05 International Business Machines Corporation System and method for automatically declaring variables
GB2451253A (en) * 2007-07-24 2009-01-28 Ezurio Ltd Indicating the position of a next declaration statement in object code when declaring a variable object code
US8689195B2 (en) * 2008-06-03 2014-04-01 International Business Machines Corporation Identifying structured data types as requiring designated initializers
FR2947609B1 (fr) 2009-07-06 2015-05-15 Permaswage Dispositif de raccordement pour canalisations et procede de raccordement associe
US8578341B2 (en) 2009-09-11 2013-11-05 International Business Machines Corporation System and method to map defect reduction data to organizational maturity profiles for defect projection modeling
US8495583B2 (en) 2009-09-11 2013-07-23 International Business Machines Corporation System and method to determine defect risks in software solutions
US8893086B2 (en) 2009-09-11 2014-11-18 International Business Machines Corporation System and method for resource modeling and simulation in test planning
US8527955B2 (en) 2009-09-11 2013-09-03 International Business Machines Corporation System and method to classify automated code inspection services defect output for defect analysis
US8539438B2 (en) 2009-09-11 2013-09-17 International Business Machines Corporation System and method for efficient creation and reconciliation of macro and micro level test plans
US10235269B2 (en) 2009-09-11 2019-03-19 International Business Machines Corporation System and method to produce business case metrics based on defect analysis starter (DAS) results
US8402444B2 (en) * 2009-10-09 2013-03-19 Microsoft Corporation Program analysis through predicate abstraction and refinement
US8689180B2 (en) * 2009-11-03 2014-04-01 International Business Machines Corporation Systems and methods for resource leak detection
US8595707B2 (en) * 2009-12-30 2013-11-26 Microsoft Corporation Processing predicates including pointer information
US8533695B2 (en) * 2010-09-28 2013-09-10 Microsoft Corporation Compile-time bounds checking for user-defined types
US8839197B2 (en) * 2010-10-11 2014-09-16 International Business Machines Corporation Automated analysis of composite applications
US8762952B2 (en) 2010-12-14 2014-06-24 Bmc Software, Inc. Recording method calls that led to an unforeseen problem
US8745598B2 (en) 2010-12-14 2014-06-03 Bmc Software, Inc. Running injected code prior to execution of an application
RU2014112261A (ru) 2011-09-15 2015-10-20 Зе Трастис Оф Коламбия Юниверсити Ин Зе Сити Оф Нью-Йорк Системы, способы и носители информации для обнаружения полезных нагрузок возвратно-ориентированного программирования
US9286063B2 (en) 2012-02-22 2016-03-15 Veracode, Inc. Methods and systems for providing feedback and suggested programming methods
US8909990B2 (en) 2012-08-04 2014-12-09 Microsoft Corporation Historical software diagnostics using lightweight process snapshots
CN102843236B (zh) * 2012-09-12 2014-12-10 飞天诚信科技股份有限公司 一种动态口令的生成及认证方法与系统
US10078575B2 (en) * 2013-03-13 2018-09-18 Microsoft Technology Licensing, Llc Diagnostics of state transitions
US10289411B2 (en) 2013-11-18 2019-05-14 Microsoft Technology Licensing, Llc Diagnosing production applications
US9632915B2 (en) * 2014-10-29 2017-04-25 Microsoft Technology Licensing, Llc. Historical control flow visualization in production diagnostics
CN107656861B (zh) * 2016-07-26 2020-06-02 龙芯中科技术有限公司 硬件抽象层调试方法和装置
US9720785B1 (en) * 2016-10-14 2017-08-01 International Business Machines Corporation Variable checkpointing in a streaming application that includes tuple windows
US9678837B1 (en) 2016-10-14 2017-06-13 International Business Machines Corporation Variable checkpointing in a streaming application with one or more consistent regions
KR102322260B1 (ko) 2017-05-18 2021-11-04 현대자동차 주식회사 하이브리드 자동차의 isg 시스템
US12254343B2 (en) 2018-11-21 2025-03-18 Zoox, Inc. Executable component interface and controller
US10678740B1 (en) * 2018-11-21 2020-06-09 Zoox, Inc. Coordinated component interface control framework
CN112835560A (zh) * 2021-03-04 2021-05-25 广州图创计算机软件开发有限公司 Web多终端低代码智能软件开发平台

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4953084A (en) * 1987-11-16 1990-08-28 Hewlett-Packard Company Method and apparatus using variable ranges to support symbolic debugging of optimized code
US5038348A (en) * 1988-07-01 1991-08-06 Sharp Kabushiki Kaisha Apparatus for debugging a data flow program
US5253158A (en) * 1990-04-23 1993-10-12 Matsushita Electric Industrial Co., Ltd. Apparatus for supporting the development of sequence software to be used in automated equipments, and method thereof
US5355469A (en) * 1990-07-30 1994-10-11 Delphi Data, A Division Of Sparks Industries, Inc. Method for detecting program errors
US5313616A (en) * 1990-09-18 1994-05-17 88Open Consortium, Ltd. Method for analyzing calls of application program by inserting monitoring routines into the executable version and redirecting calls to the monitoring routines
US5293629A (en) * 1990-11-30 1994-03-08 Abraxas Software, Inc. Method of analyzing computer source code
US5317740A (en) * 1991-03-07 1994-05-31 Digital Equipment Corporation Alternate and iterative analysis of computer programs for locating translatable code by resolving callbacks and other conflicting mutual dependencies
US5193180A (en) * 1991-06-21 1993-03-09 Pure Software Inc. System for modifying relocatable object code files to monitor accesses to dynamically allocated memory
US5517629A (en) * 1992-08-26 1996-05-14 Boland; R. Nick K. Methods for analyzing computer program performance
US5559980A (en) * 1993-03-18 1996-09-24 Lucent Technologies Inc. Method and apparatus for detecting references to deallocated memory in a dynamic memory allocation system
US5729676A (en) * 1993-12-10 1998-03-17 Nec Corporation Method of generating data for evaluating programs
US5590329A (en) * 1994-02-04 1996-12-31 Lucent Technologies Inc. Method and apparatus for detecting memory access errors
US5644709A (en) * 1994-04-21 1997-07-01 Wisconsin Alumni Research Foundation Method for detecting computer memory access errors
US5613063A (en) * 1994-07-01 1997-03-18 Digital Equipment Corporation Method and apparatus for checking validity of memory operations
US5615369A (en) * 1994-07-25 1997-03-25 Hewlett-Packard Company Automated detection and correction of uninitialized variables
US5689712A (en) * 1994-07-27 1997-11-18 International Business Machines Corporation Profile-based optimizing postprocessors for data references
US5943499A (en) * 1996-11-27 1999-08-24 Hewlett-Packard Company System and method for solving general global data flow predicated code problems

Also Published As

Publication number Publication date
JP4430043B2 (ja) 2010-03-10
JP4213203B2 (ja) 2009-01-21
US6079031A (en) 2000-06-20
US6154876A (en) 2000-11-28
CA2637798A1 (en) 1996-02-22
EP0775342B1 (en) 1999-07-14
WO1996005556A1 (en) 1996-02-22
US5968113A (en) 1999-10-19
US5857071A (en) 1999-01-05
ATE182223T1 (de) 1999-07-15
CA2637798C (en) 2011-06-21
AU3235795A (en) 1996-03-07
JP2006252583A (ja) 2006-09-21
DE69510801D1 (de) 1999-08-19
EP0775342A1 (en) 1997-05-28
US5694539A (en) 1997-12-02
CA2197071A1 (en) 1996-02-22
DE69510801T2 (de) 2000-04-06
CA2197071C (en) 2008-11-04

Similar Documents

Publication Publication Date Title
JPH10509258A (ja) コンピュータプロセスのリソースのモデル化方法及び装置
Bush et al. A static analyzer for finding dynamic programming errors
Pearce A lightweight formalism for reference lifetimes and borrowing in Rust
Lindner et al. No panic! Verification of Rust programs by symbolic execution
US20060253739A1 (en) Method and apparatus for performing unit testing of software modules with use of directed automated random testing
Lindahl et al. Detecting software defects in telecom applications through lightweight static analysis: A war story
CN118916886B (zh) 一种面向risc-v架构的二进制程序验证方法及系统
Moy et al. Trace contracts
JPH0748182B2 (ja) プログラム・エラー検出方法
Kyle et al. Application of domain-aware binary fuzzing to aid Android virtual machine testing
Pflanzer et al. Automatic test case reduction for opencl
Evans Using specifications to check source code
JP2002515996A (ja) シミュレートされたプログラムの実行エラーの検出方法および装置
Naudziuniene An infrastructure for tractable verification of JavaScript programs
Mayer et al. Debugging program exceptions
Coughlin et al. Measuring enforcement windows with symbolic trace interpretation: What well-behaved programs say
Kansomkeat et al. An analysis technique to increase testability of object‐oriented components
Eilertsen Making software refactorings safer
Alshnakat Automatic verification of embedded systems using horn clause solvers
Hyyryläinen A static analysis tool for finding buffer overflows in C
Besson et al. SawjaCard: a static analysis tool for certifying Java Card applications
Bombarda et al. From Concept to Code: Unveiling a Tool
Klein Experience with randomized testing in programming language metatheory
Engelen Nullness analysis of Java source code
Stalker Runtime checking of graph programs

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20050614

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20050914

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20051031

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20051214

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20060207

RD13 Notification of appointment of power of sub attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7433

Effective date: 20060508

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20060508

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20060607

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

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20060720

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

Free format text: JAPANESE INTERMEDIATE CODE: A912

Effective date: 20060803

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080910

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: 20081030

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

Free format text: PAYMENT UNTIL: 20111107

Year of fee payment: 3

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: 20111107

Year of fee payment: 3

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

Free format text: PAYMENT UNTIL: 20121107

Year of fee payment: 4

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

Free format text: PAYMENT UNTIL: 20121107

Year of fee payment: 4

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

Free format text: PAYMENT UNTIL: 20131107

Year of fee payment: 5

LAPS Cancellation because of no payment of annual fees
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