JP4430043B2 - A computer method for checking program component errors - Google Patents
A computer method for checking program component errors Download PDFInfo
- Publication number
- JP4430043B2 JP4430043B2 JP2006159153A JP2006159153A JP4430043B2 JP 4430043 B2 JP4430043 B2 JP 4430043B2 JP 2006159153 A JP2006159153 A JP 2006159153A JP 2006159153 A JP2006159153 A JP 2006159153A JP 4430043 B2 JP4430043 B2 JP 4430043B2
- Authority
- JP
- Japan
- Prior art keywords
- function
- item
- expression
- statement
- external
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging 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
Description
コンピュータプロセスのリソースのモデル化方法及び装置付録Aについて本開示の一部である付録Aは、以下により詳しく説明する本発明の一実施例におけるコンピュータプログラム及び関連するデータのリストである。 Computer Process Resource Modeling Method and Apparatus Appendix A Appendix A, which is part of this disclosure, is a list of computer programs and associated data in one embodiment of the present invention that is described in more detail below.
本特許文献の開示の一部には著作権保護に従う題材が含まれている。本著作権所有者は、特許商標庁の特許ファイルまたは記録に掲載される場合は、本特許文献または特許開示が誰によって複製されてもそれに異議を唱えるものではないが、それ以外の場合は全ての著作権を保留するものである。 Part of the disclosure of this patent document contains material subject to copyright protection. This copyright owner does not object to any reproduction of this patent document or patent disclosure by anyone who appears in the patent file or record of the Patent and Trademark Office, but otherwise Is reserved for copyright.
本発明はコンピュータプログラムの解析に関する。特に、コンピュータプログラムによって定められたリソースの使用の解析を通して、コンピュータプログラム内のプログラミングエラーを検出することに関する。 The present invention relates to the analysis of computer programs. In particular, it relates to detecting programming errors in a computer program through an analysis of the use of resources defined by the computer program.
既存のプログラミングエラー検出方法には、特定のプログラムが従うべきコンピュータ命令プロトコル(computer instructionprotocol)における違反を検出するものがある。そのようなプログラムエラー検出方法は“スタティックチェック法(static checking)”と呼ばれているが、それはコンピュータプログラムのコンピュータ命令(または“ステートメント”)の文法が、それらのステートメントの実行から生じる挙動の文脈(context)の外で解析されるからである。“ステートメント”という用語は、本明細書中では、Herbert Schildtによる“注釈版ANSI Cスタンダード(Osborne McGraw−Hill 1990)”(以下、Cスタンダードと呼ぶ)として再版された“American National Standard for ProgrammingLanguages−−C(American National Standards Institute/International Organization for Standardization ANSI/ISO 9899−1990)”のセクション6.6において定義されている意味で使用される。簡単に説明すると、C言語の文脈において、ステートメントとは宣言ではないコンピュータ命令である。言い換えると、ステートメントとは、コンピュータに指示を与えて1または複数の処理過程を実行させる任意の式または命令である。C言語の文脈におけるスタティックチェック法には、(i)コンピュータプログラム中に同じ名前が付けられた2つの変数がないことを確認すること、(ii)各“break”ステートメントが先行する“while”、“for”または“switch”ステートメントに対応していることを確認すること、及び(iii)演算子が適切なオペランドに対して施されていることをベリフィケーションすることなどが含まれる。スタティックチェック法については、例えば、Alfred V.Aho らによる“Compilers(Addison Wesley 1988)”に記載されている。 Some existing programming error detection methods detect violations in a computer instruction protocol that a particular program should follow. Such a program error detection method is called "static checking", which is a context in which the grammar of computer instructions (or "statements") in a computer program results from the execution of those statements. This is because the analysis is performed outside (context). The term "statement" is used herein, due to Herbert Schildt "annotated version of ANSI C standard (Osborne McGraw-Hill 1990)" ( hereinafter, C standard referred to as) has been reprinted as "American National Standard for ProgrammingLanguages-- C (American National Standards Institute / International Organization for Standardization ANSI / ISO 9899-1990) "as used in the meaning defined in Section 6.6. Briefly, in the context of C, a statement is a computer instruction that is not a declaration. In other words, a statement is any expression or instruction that instructs a computer to perform one or more processing steps. The static check method in the context of C language includes (i) ensuring that there are no two variables with the same name in the computer program, (ii) “while” preceded by each “break” statement, Including verifying that it corresponds to a “for” or “switch” statement, and (iii) verifying that the operator is applied to the appropriate operands. For the static check method, see, for example, Alfred V.A. Aho et al., “ Compilers (Addison Wesley 1988)”.
一般に“データ流れ解析”技法と呼ばれている、既存のスタティックチェック法のあるものは、プログラミングエラーを検出するため、プログラム中のデータの流れを解析する。このような解析は、例えば、ある変数に値が代入される前にその変数を使用するといった不適切なデータオブジェクトの使用を検出するため、ステートメント及びループステートメントを順に並べるなどして、制御流れ情報を活用する。あるコンピュータプログラムにおける制御流れとは、そのコンピュータプログラムによって定義されるコンピュータプロセスにおいてそのコンピュータプログラムのコンピュータ命令が実行されていく特定の順序のことである。コンピュータプログラム及びプロセス、及びそれらの関係については、後により詳しく説明する。データ流れ技法については、Beizerによる“Software Testing Techniques,(1990)pp.145−172”に記載されている。 Some existing static checking methods, commonly referred to as “data flow analysis” techniques, analyze the flow of data in a program to detect programming errors. Such an analysis can be used to detect control flow information by, for example, arranging statements and loop statements in order to detect inappropriate use of data objects such as using a variable before a value is assigned to a variable. Take advantage of. A control flow in a computer program is a specific order in which computer instructions of the computer program are executed in a computer process defined by the computer program. Computer programs and processes and their relationships will be described in more detail later. Data flow techniques are described by Beizer in “ Software Testing Techniques , (1990) pp. 145-172”.
既存のスタティックチェック法には、まとまってコンピュータプログラムを形成する関数のようなコンピュータプログラムの幾つかの個々のコンポーネントを通じたリソースの使用の追跡が不可能であるという欠点がある。例えば、ある変数が第1の関数において初期化され、第2のそれに続いて実行される関数における計算において使用されるということがあり得る。第2の関数のコンピュータ命令を解析するだけでは、その変数は初期化される前に使用されるようにみえ、これは誤ってエラーとして通知される可能性がある。更に、既存のスタティックチェック法は本質的に静的(static)であり、特定のデータオブジェクトに関連付けられる特定のデータ値を考慮することはない。静的な解析は、プログラムの実行の動的な効果を考慮することなく決定することができることに限定される。Beizerは、静的な解析が不適当である幾つかの領域について述べている。それらには、配列、特に動的に計算される指標及び動的に割り当てられる配列;レコード及びポインタ;ファイル;及び交互状態テーブル(alternate state tables)が含まれる。これらは同じプログラムにおいて異なる型の異なる意味(semantics)を表す。 Existing static checking methods have the disadvantage that it is impossible to track the use of resources through several individual components of a computer program, such as the functions that together form a computer program. For example, a variable may be initialized in a first function and used in calculations in a second subsequent function. By simply analyzing the computer instructions of the second function, the variable appears to be used before it is initialized, which can be erroneously signaled as an error. Furthermore, existing static checking methods are static in nature and do not take into account specific data values associated with specific data objects. Static analysis is limited to being able to determine without considering the dynamic effects of program execution. Beizer describes some areas where static analysis is inappropriate. They include arrays, particularly dynamically calculated indicators and dynamically allocated arrays; records and pointers; files; and alternate state tables. These represent different types of different semantics in the same program.
スタティックチェッカ(static checker)は、動的に割り当てられるメモリ(dynamically allocated memory)に対応して計算されるアドレスまたは配列をなすように計算される指標を含むエラーを検出しない。計算されるアドレス及び指標は、それぞれコンピュータプロセスの実行中に計算されるアドレス及び指標である。スタティックチェッカがそのようなエラーをコンピュータプログラム中で検出しないのは、そのようなエラーの調査には、通常、計算されるアドレス及び指標の正確な値を決定することが含まれ、それには実行時のコンピュータプログラムの挙動を考慮すること即ちコンピュータプロセスとして考慮することが含まれるからである。 The static checker does not detect an error including an index that is calculated to form an address or an array that is calculated corresponding to a dynamically allocated memory. The calculated address and index are respectively the address and index calculated during the execution of the computer process. The reason that static checkers do not detect such errors in a computer program is that investigating such errors usually involves determining the exact value of the calculated address and index, which includes runtime This is because it includes consideration of the behavior of the computer program, that is, consideration as a computer process.
またスタティックチェッカは、正常に割り当てられるか疑わしいリソースの使用や、変数または他のデータオブジェクトの値によって状態を決定されるリソースの使用を含むエラーを検出しない。C言語では、リソース(例えば、動的に割り当てられるメモリまたはファイル)が正常に割り当てられるかどうか疑わしい。言い換えると、リソースを割り当てる関数は、リソースの割り当てに失敗しても正常に終了する。割り当てが成功したかどうかは、関数の戻り値項目(割り当てられたリソースを指すポインタ)を無効値(例えばNULL)と比較することによって判定されるのだが、スタティックチェッカは呼び出される関数の挙動を考慮することはせず、被呼び出し関数に対する呼び出しの文法が、特定のコンピュータ言語において定められた文法に従っているかどうかのみをベリフィケーションする。従って、スタティックチェッカは正常に割り当てられるかどうか疑わしいリソースの使用を含むエラーを検出しない。 Static checkers also do not detect errors that involve the use of resources that are suspected of being successfully allocated or the use of resources whose state is determined by the value of a variable or other data object. In C, it is questionable whether resources (eg, dynamically allocated memory or files) are allocated successfully. In other words, the function for allocating resources ends normally even if resource allocation fails. Whether or not the allocation was successful is determined by comparing the return value item of the function (a pointer to the allocated resource) with an invalid value (eg NULL), but the static checker considers the behavior of the called function Instead, it verifies only that the grammar of the call to the called function conforms to the grammar defined in the specific computer language. Thus, the static checker does not detect errors that involve the use of resources that are suspected of being successfully allocated.
上述したように、スタティックチェッカは呼び出される関数の挙動を考慮しない。従って、複数の関数にまたがったリソースの使用をベリフィケーションすることは不可能である。例えば、第1の関数がリソースを割り当てを行い(allocate)、第2の関数がそのリソースを使用し、第3の関数がそのリソースを開放(deallocate)する場合、第1、第2、及び第3の関数のいずれかを単独で、または3つの関数の全ての呼び出しをする一つの関数を静的に調べることによっては、リソースの適切な使用をベリフィケーションすることはできない。 As mentioned above, the static checker does not consider the behavior of the called function. Therefore, it is impossible to verify the use of resources across multiple functions. For example, if a first function allocates a resource, a second function uses the resource, and a third function deallocates the resource, the first, second, and second Proper use of resources cannot be verified by statically examining any of the three functions alone or a single function that makes all three function calls.
実行時のコンピュータプログラムの挙動に関する情報を十分に使用しないエラー検出技法が用いられる場合、そのような技法によって検出されるエラーは過小に検出されるかあるいは過大に検出されるかのいずれかとなる。例えば、ある関数が、割り当てられるリソース(例えば、ファイル)を指定するポインタをパラメータとして受け取り、そのパラメータを無効ポインタと比較することなく使用するような場合、その関数はエラーを含む可能性を有する。その関数がエラーを含むかどうかは、その関数の文脈内ではわからない様々な状況に依存する。例えば、そのポインタが関数が呼び出される前に有効なポインタであるとベリフィケーションされる場合、その関数はエラーを含まない。そのポインタの使用をエラーとして通知することは、誤ったエラー通知でその関数の解析を混乱させ、エラーを過大にすることとなる。大きなプログラムの解析において誤ってエラーを通知することは、よくてもプログラム開発者をわずらわせ、悪ければコンピュータプログラムの解析を役に立たないものとしてしまう。関数を呼び出す前にポインタが有効であるかチェックされない場合に、エラーの通知をしないと、実行時にコンピュータプログラムを突然アボートさせ、データ構造の破壊や有効なデータの損失といった結果を生じさせ得るエラーの検出がなされないこととなる。 If error detection techniques are used that do not make full use of information about the behavior of the computer program at run time, errors detected by such techniques are either under-detected or over-detected. For example, if a function receives a pointer that specifies a resource (eg, a file) to be allocated as a parameter and uses that parameter without comparing it to an invalid pointer, the function may contain an error. Whether the function contains an error depends on various situations that are not known within the context of the function. For example, if the pointer is verified to be a valid pointer before the function is called, the function does not contain an error. Notifying the use of the pointer as an error confuses the analysis of the function with an erroneous error notification and makes the error excessive. Notifying an error in the analysis of a large program at all would bother the program developer at best, and would otherwise make the computer program analysis useless. If the pointer is not checked for validity before calling the function, failure to notify the error will cause the computer program to abruptly abort at run time, resulting in data structure corruption or loss of valid data. It will not be detected.
コンピュータプログラムの動的な挙動を考慮しないスタティックチェック法の欠点の1つは、明白な、しかし“虚偽の”エラーの通知をすることである。即ち、制御が流れ得ないコンピュータ命令から生じるエラーを通知することである。
制御流れ経路(control flowpath)が特定のデータ構造及びプログラム変数に関連付けられる特定の値に依存するような関数では、制御流れはこれらのデータ構造及び変数に関連付けられる値を考慮することなくして決定することはできない。また、これらのデータ構造及び変数に関連付けられる値は、一般に、実行時の関数の挙動を考慮することなくして決定することはできない。その結果、実行されない命令または特定の状態の下でしか実行されない命令は一般にスタティックチェッカでは常に実行されるものと仮定される。
One drawback of the static check method that does not take into account the dynamic behavior of the computer program is the notification of obvious but "false" errors. That is, to notify an error resulting from a computer instruction that cannot be controlled.
In functions where the control flow path depends on specific values associated with specific data structures and program variables, the control flow is determined without considering the values associated with these data structures and variables. It is not possible. Also, the values associated with these data structures and variables generally cannot be determined without considering the behavior of the function at runtime. As a result, instructions that are not executed or instructions that are executed only under certain conditions are generally assumed to always be executed by a static checker.
既存のプログラミングエラー検出技法の別のタイプに、プログラムベリフィケーション(program verification)と呼ばれるものがある。プログラムベリフィケーションでは、コンピュータプログラムは形式的な数学的対象として扱われる。コンピュータプログラム中のエラーは理論数学を用いてコンピュータプログラムの所定の特性を立証すること、または立証するのに失敗することによって検出される。一般に立証が試みられる特性の1つは、所定の入力が与えられたとき、コンピュータプログラムによって定義されたコンピュータプロセスが所定の出力を生成するということである。その立証が失敗に終わる場合、コンピュータプログラムはプログラミングエラーを含む。このようなプログラムベリフィケーション技法は、例えば、Eric C.R.Hehnerらによる“A PracticalTheory of Programming,(Verlag 1993)”及び Ole−Johan Dahlによる“Verifiable Programming,(Prentice Hall 1992)”に記載されている。 Another type of existing programming error detection technique is called program verification. In program verification, a computer program is treated as a formal mathematical object. Errors in the computer program are detected by using theoretical mathematics to verify or fail to verify certain characteristics of the computer program. One characteristic that is generally attempted to be verified is that given a given input, a computer process defined by a computer program produces a given output. If the verification fails, the computer program contains a programming error. Such a program verification technique is described in, for example, Eric C.I. R. “ A Practical Theory of Programming , (Verlag 1993)” by Hehner et al. And “ Verifiable Programming , (Prentice Hall 1992)” by Ole-Johan Dahl.
プログラムベリフィケーション技法は少なくとも2つの意味で制約を受ける。
即ち、(i)形式的論理を用いて表現し自動的に立証することができるコンピュータプログラムの特性のみがベリフィケーション可能である、(ii)コンピュータプログラムの開発者は、コンピュータプログラムの特性を形式的に明確に表さなければならない。コンピュータプログラムの特性を形式的に表すことは、どんな場合にも極めて困難なことであり、大きなプログラムでは殆ど不可能である。そのため、プログラムベリフィケーション技法を用いた商業的に成功した商品は極めて希である。
Program verification techniques are limited in at least two ways.
That is, (i) only the characteristics of a computer program that can be expressed and automatically verified using formal logic can be verified. (Ii) The computer program developer formalizes the characteristics of a computer program. Must be clearly expressed. Formally expressing the characteristics of a computer program is extremely difficult in any case and almost impossible with large programs. Therefore, commercially successful products using program verification techniques are very rare.
プログラミングエラー検出技法の別のタイプでは、コンピュータプログラムが実行され、従ってコンピュータプロセスが形成され、コンピュータプロセスの挙動が監視される。コンピュータプログラムの解析がプログラムの実行中になされるため、そのようなプログラムエラー検出技法は“ランタイムチェック法(runtime checking)”と呼ばれる。ランタイムチェック技法の中には、コンピュータ命令をコンピュータプログラム中に自動的に挿入して、コンピュータプログラムの実行時に、挿入されたコンピュータ命令が実行されることによって、コンピュータプログラムの変数及びリソースの状態が示されるようにするものがある。そのようなエラー検出技法は、Hastingsに付与された米国特許第5,193,180号明細書に記載されている。 In another type of programming error detection technique, a computer program is executed, thus forming a computer process and monitoring the behavior of the computer process. Such a program error detection technique is called “runtime checking” because the analysis of the computer program is done during the execution of the program. Some runtime check techniques automatically insert computer instructions into a computer program, and when the computer program is executed, the inserted computer instructions are executed to indicate the status of computer program variables and resources. There is something to be done. Such an error detection technique is described in US Pat. No. 5,193,180 to Hastings.
ランタイムチェックでは、通常、メモリリーク(memory leaks)や禁止領域に入った配列の指標のようなエラーを検出することができる。ランタイムチェックの例として、カリフォルニア州サニーベイル(Sunnyvale,California)“Pure Software Inc.”から入手可能な“Purify”や、カリフォルニア州パサデナ(Pasadena,California)の“Parasoft Corporation”から入手可能な“Insight”などがある。“Purify”は、コンピュータがコンパイルされてオブジェクトコード形式になった後にコンピュータプログラムをモニタリングするためのコンピュータ命令を挿入する。“Insight”は、コンピュータプログラムがコンパイルされる前に、即ちコンピュータプログラムがまだソースコード形式のときに、コンピュータプログラムをモニタリングするためのコンピュータ命令を挿入する。 The runtime check can usually detect errors such as memory leaks or an index of an array that has entered a prohibited area. Examples of runtime checks include “Purify” available from “Pure Software Inc.”, Sunnyvale, Calif., And “Parasoft Corporation” available from “Parasoft Corporation”, Pasadena, Calif. There is. “Purify” inserts computer instructions for monitoring a computer program after the computer is compiled into object code format. “Insight” inserts computer instructions to monitor the computer program before it is compiled, that is, when the computer program is still in source code form.
ランタイムチェックは、一般に、実際の特定の入力を使ってコンピュータプログラムのコンピュータ命令を実際に実行することによって判定可能なものに限定される。ランタイムチェッタ法はコンピュータプログラムの制御の流れの全経路を考慮することはせず、実行時にコンピュータプログラムに与えられる特定の入力に対応した経路しか考慮しない。一般に、コンピュータプログラムのコンピュータ命令の実行によって形成されるコンピュータプロセスを、全ての可能な制御流れ経路を通るようにすることは実際的ではない。そのようにするには、プログラマーが、コンピュータプログラムのコンピュータ命令の実行時に発生し得る全ての事象を予期し、そのような事象発生の全ての組み合わせを生じさせるまたはエミュレートすることが必要であるからである。 Runtime checks are generally limited to those that can be determined by actually executing the computer instructions of the computer program using the actual specific inputs. The runtime checker method does not consider the entire path of the control flow of the computer program, but only considers the path corresponding to the specific input given to the computer program at runtime. In general, it is not practical to allow a computer process formed by the execution of computer instructions in a computer program to go through all possible control flow paths. To do so, it is necessary for the programmer to anticipate all events that can occur during the execution of the computer instructions of the computer program, and to generate or emulate all combinations of such event occurrences. It is.
更に、ランタイムチェックは、コンピュータプログラムが完成しているときしか使用することができない。ランタイムチェックでは、ある1つの関数が完成したプログラムに組み込まれる前に、その関数を解析することは不可能である。なぜなら、解析するにはその関数を実行しなければならないからである。従って、ランタイムチェックを用いて関数を解析するには、(i)コンピュータプログラムの全ての関数が、それらの関数のどれかを解析するよりも前に、開発され、組み合わされてコンピュータプログラムを形成していること、または(ii)その関数を組み込んだ特別なテストプログラムが開発されていることが必要である。従って、完成したコンピュータプログラムへの組み込み前に個々の関数の設計、制作及びテストを行う、複雑なコンピュータプログラムを開発する好適な方法であり広く知られているトップダウン式のプログラミングは、ランタイム解析にはなじまない。 In addition, runtime checks can only be used when the computer program is complete. In runtime checking, it is impossible to analyze a function before it is incorporated into a complete program. This is because the function must be executed for analysis. Thus, to analyze functions using runtime checks, (i) all functions of a computer program are developed and combined to form a computer program before analyzing any of those functions. Or (ii) a special test program incorporating the function must be developed. Therefore, the well-known top-down programming is a good way to develop complex computer programs that design, produce and test individual functions before incorporation into a finished computer program. I'm not familiar.
スズキらに付与された米国特許第5,253,158号(以下「スズキ」と言う)明細書には、自動化された機器の動作を制御するために用いられるべきソウトウェア(シーケンサソウトウェア)の実行時間チェックを行う装置が開示されている。「スズキ」によれば、自動化された機器を用いずにシーケンサソフトウェアの試験ができる。「スズキ」の発明では、ソフトウェアの動作環境に関する情報、自動化された機器の特性に関する情報、実行されるべきテストケースに関する情報が、記憶装置に格納されている(第1図)。次に、「スズキ」の発明では、シーケンサソフトウェアによって制御された自動化された機器の動作をシミュレートし、シミュレートされた結果が得られる(第1欄の第54行から第59行)。「スズキ」の発明のシミュレーションは、シーケンサソフトウェアの実行を必要とする(第4欄の第50行)。「スズキ」に開示された実行時間チェック装置は、 これまで説明されたように、実行時間の解析の限界に対する主題であった。 US Pat. No. 5,253,158 (hereinafter referred to as “Suzuki”) issued to Suzuki et al. Describes the execution time of software (sequencer software) to be used to control the operation of automated equipment. An apparatus for performing a check is disclosed. According to "Suzuki", sequencer software can be tested without using automated equipment. In the invention of “Suzuki”, information relating to the operating environment of software, information relating to automated device characteristics, and information relating to test cases to be executed are stored in the storage device (FIG. 1). Next, in the “Suzuki” invention, the operation of an automated device controlled by sequencer software is simulated, and a simulated result is obtained (lines 54 to 59 in the first column). The simulation of the "Suzuki" invention requires execution of sequencer software (column 4, line 50). The execution time check device disclosed in "Suzuki" has been the subject of the limits of analysis of execution time, as explained so far.
フ・ティン・チャン及びツォン・ユゥエ・チェンは、「AIDA−A Dynamic Data Flow Anomaly Detection Syetem for Pascal Programs, Software Practice And Experience第227頁−第239頁(1987年3月)」で、パスカルプログラム用の動的データ流れ解析システムについて説明している。AIDA(automated instruction system)は、文法的に補正されたパスカルプログラムを解析し、このプログラムをインストラクションプログラムに変換する。インストラクションプログラムは、もとのパスカルソースコードに挿入された変数の状態を初期化、追従、若しくはチャックするための手続コールの形式を検査する。プログラムの実行中、AIDAは、データの流れの異常と、初期化されていない変数、変数の不正な使用、変数の誤った分類化、定義された変数の意図しない破壊などのプログラミングエラーを検出する。AIDAは、上述されたように、実行時間解析の限定に対する主題となっている。 Fu Ting Chang and Tsong Yue Chen are “AIDA-A Dynamic Data Flow Anomaly Detection System for Pascal Programs, Software, Practice and Expert Experience, page 1987, page 2 of the third program” A dynamic data flow analysis system is described. AIDA (automated instruction system) analyzes a grammatically corrected Pascal program and converts this program into an instruction program. The instruction program checks the format of the procedure call for initializing, following, or chucking the state of variables inserted in the original Pascal source code. During program execution, AIDA detects data flow anomalies and programming errors such as uninitialized variables, incorrect use of variables, incorrect classification of variables, and unintentional destruction of defined variables. . AIDA is the subject of limiting execution time analysis, as described above.
必要とされているのは、コンピュータプログラムの動的な挙動を考慮し、自動的にコンピュータプログラムの概ね全ての制御流れ経路を考慮し、コンピュータプログラムのプログラマーがコンピュータプログラムを別の形式、例えば数学的形式、で表すことを必要としないプログラミングエラー検出技術である。更に必要とされているのは、プログラムの個々のコンポーネントを、実行時のそのコンポーネントの挙動を考慮して解析するプログラミングエラー検出技術である。更に必要とされているのは、解析中のコンピュータプログラムコンポーネントによって実行を喚起されるコンポーネントの挙動を考慮するプログラミングエラー検出技術である。 What is needed is to consider the dynamic behavior of a computer program and automatically consider almost all control flow paths of the computer program, so that the computer program programmer can convert the computer program into another form, for example mathematical It is a programming error detection technique that does not need to be expressed in a form. What is further needed is a programming error detection technique that analyzes individual components of a program taking into account the behavior of that component during execution. What is further needed is a programming error detection technique that takes into account the behavior of components that are triggered to execute by the computer program component being analyzed.
このような課題を解決するために、本発明は、複数のステートメントを有するプログラムコンポーネントのエラーをチェックするための、コンピュータにおける方法であって、前記プログラムコンポーネントはコンピュータプログラムを構成するものであって、前記コンピュータは前記プログラムコンポーネントを記憶する記憶手段と、情報処理手段と、前記プログラムコンポーネントの処理対象となるリソースであって、1つまたは複数のプログラムコンポーネントに割り当てられおよび開放されるリソースとを有し、前記記憶手段に記憶されたプログラムコンポーネントの複数のステートメントを前記情報処理手段により実行するステップと、前記情報処理手段により前記複数のステートメントを実行することにより生じた前記リソースの状態の変化が予め定められた変化であるか否かを判定することで前記プログラムコンポーネントがエラーか否かを前記情報処理手段により判定するステップとを備え、前記判定するステップは、前記プログラムコンポーネントによって使用される前記リソースの挙動をモデル化し、前記リソースにおいて発生する可能性のある状態違反を検出することによって前記プログラムコンポーネントの解析がなされ前記プログラムコンポーネント中のエラーの発生が判定されるものであり、該エラーの発生の判定はモデル化された前記リソースの挙動と前記プログラムコンポーネントに含まれる前記ステートメントとの対応関係の情報を用いて、前記プログラムコンポーネントに含まれる前記ステートメントが実行されたとした場合に、前記対応関係の前記情報を用いて次の挙動を推定し、該推定した挙動によってエラーが発生するかどうかを判定するものであることを特徴とする。 In order to solve such a problem, the present invention is a method in a computer for checking an error of a program component having a plurality of statements, the program component constituting a computer program, The computer includes storage means for storing the program component, information processing means, and a resource to be processed by the program component, which is assigned to and released from one or more program components. Executing the plurality of statements of the program component stored in the storage means by the information processing means, and the resource generated by executing the plurality of statements by the information processing means And a determining step by the information processing means whether the program component or an error by a change of state to determine whether a change to a predetermined, the step of determining, by said program component The behavior of the resource used is modeled, and the occurrence of an error in the program component is determined by analyzing the program component by detecting a state violation that may occur in the resource, The determination of the occurrence of the error is performed when the statement included in the program component is executed using information on a correspondence relationship between the modeled behavior of the resource and the statement included in the program component. Said correspondence Using the information for estimating the following behavior, and characterized in that to determine whether an error occurs due to behaviors that the estimation.
本発明の一形態によると、コンピュータプログラムによって使用されるリソースの挙動をモデル化し、それらのリソースにおいて発生する可能性のある状態違反を検出することによって、コンピュータプログラムの解析がなされコンピュータプログラム中のプログラミングエラーが検出される。リソースは、リソース状態とリソースの挙動を表すリソース状態遷移(変化)とに基づいてモデル化される。コンピュータプログラムのコンピュータ命令は動的に検査される。即ち、コンピュータ命令の動的挙動が決定され、コンピュータ命令の動的挙動に従ってリソースの状態が変化させられる。 According to one aspect of the present invention, a computer program is analyzed by modeling behavior of resources used by the computer program and detecting state violations that may occur in those resources. An error is detected. A resource is modeled based on a resource state and a resource state transition (change) that represents the behavior of the resource. The computer instructions of the computer program are examined dynamically. That is, the dynamic behavior of the computer instruction is determined, and the state of the resource is changed according to the dynamic behavior of the computer instruction.
コンピュータプログラムの各コンポーネントは個々に解析される。使用が複数のコンポーネントに渡るリソース、例えば第1コンポーネントによって割り当てられ、第2コンポーネントによって使用され、第3コンポーネントによって開放されるリソースの使用は、各コンポーネントのエクスターナル(external)をモデル化することによって解析される。コンピュータプログラムの2つのコンポーネントは、各コンポーネントのエクスターナルを通じて互いにコミュニケートする。例えば、第1コンポーネントによって割り当てられるリソースに関する情報が、そのリソースを使用する第2コンポーネントに、第1及び第2コンポーネントのエクスターナルを通して伝達される。各コンポーネントの挙動をそのコンポーネントのエクスターナルに関して解析することによって、使用が複数のコンポーネントに渡るリソースの適切なモデル化がなされる。 Each component of the computer program is analyzed individually. Resources whose usage spans multiple components, eg, resources allocated by the first component, used by the second component, and released by the third component, are analyzed by modeling each component's external Is done. The two components of the computer program communicate with each other through each component's external. For example, information about the resource allocated by the first component is communicated to the second component that uses the resource through the external of the first and second components. By analyzing the behavior of each component with respect to that component's external, appropriate modeling of resources across multiple components is made.
各コンポーネントが解析されると、コンポーネントの実行がそのコンポーネントの各エクスターナルに与える影響が決定される。コンポーネントの解析から、コンポーネントのモデルが生成される。コンポーネントのモデルは、そのコンポーネントの実行がそのコンポーネントの各エクスターナルに対して与える影響を、エクスターナルのそれぞれの状態の変化とそのコンポーネントのいずれかのエクスターナルに関連付けられる新たなリソースの導入とに関して記述するものである。モデル化されるコンポーネントの実行が与える影響の数及び影響されるエクスターナルは任意であり、これらの影響はエクスターナルの複合状態(composite state)に表される。生成されたコンポーネントのモデルは、モデル化されたコンポーネントの実行を喚起する他のコンポーネントの解析に用いることができる。 As each component is analyzed, the impact of component execution on each external of that component is determined. A component model is generated from the component analysis. The component model describes the impact of the component's execution on each external of the component, with respect to each change in the external state and the introduction of new resources associated with any of the component's externals. It is. The number of effects that the execution of the modeled component has and the externals that are affected are arbitrary, and these effects are expressed in the external composite state. The generated component model can be used to analyze other components that trigger the execution of the modeled component.
本発明によると、コンピュータプログラム中のエラーは、そのコンピュータプログラムによって使用されるリソースをモデル化し、それらのリソースに於いて発生し得る状態違反(state violation)を検出することによって検出される。 According to the present invention, errors in a computer program are detected by modeling the resources used by the computer program and detecting state violations that can occur in those resources.
まず、リソースの挙動をリソースの状態と状態遷移とに関して模擬することによってリソースをモデル化する。コンピュータプログラムの各コンピュータ命令を解析し、コンピュータ命令の実行がリソースに及ぼす影響に基づいてリソースの状態を変化させる。状態違反、即ちリソースの状態に於ける無効な状態及び無効な状態遷移を検出し、プログラムエラーとして通知する。このようにして、本発明によるエラー検出はコンピュータプログラムによって定義されたコンピュータプロセスの挙動を考慮し、それによって従来技術のスタティックチェック法の制約の多くを克服するものである。 First, the resource is modeled by simulating the behavior of the resource with respect to the resource state and state transition. Each computer instruction of the computer program is analyzed, and the state of the resource is changed based on the influence of execution of the computer instruction on the resource. A state violation, that is, an invalid state and an invalid state transition in the resource state are detected and notified as a program error. In this way, error detection according to the present invention takes into account the behavior of a computer process defined by a computer program, thereby overcoming many of the limitations of the prior art static check method.
各リソースは所定の挙動を有し、それは有効な状態とそれらの状態間の有効な遷移とに関して記述することができる。コンピュータプログラムに於けるエラー発生の源は、しばしばコンピュータプログラムの開発者がリソースの所定の挙動を把握していないことにある。コンピュータプログラム中のコンピュータ命令によって、リソースの所定の挙動に違反したリソースの使用がコンピュータに指示されると状態違反が発生する。状態違反の例として、例えば、ファイルの所定の挙動によれば読み出しをするにはファイルが開かれていなければならない場合において、ファイルを閉じた後のファイルからのレコードの読み出しがある。 Each resource has a predetermined behavior, which can be described in terms of valid states and valid transitions between those states. The source of errors in a computer program is often that the computer program developer does not know the predetermined behavior of the resource. A state violation occurs when a computer instruction in a computer program instructs the computer to use a resource that violates a predetermined behavior of the resource. An example of a state violation is, for example, reading a record from a file after closing the file when the file must be opened for reading according to the predetermined behavior of the file.
コンピュータ100(第1図)には、中央演算装置(CPU)102、メモリ104、及び入力/出力回路(I/O回路)106が含まれており、これらは全てバス108を介して互いに接続されている。メモリ104は、磁気ディスクのような二次記憶装置、ランダムアクセスメモリ(RAM)、読み出し専用メモリ(ROM)を含む任意のタイプのメモリを含み得る。CPU102は、メモリ104からコンピュータプロセス110を読み出して実行する。コンピュータプロセス110は、ライブラリ関数112、動的に割り当てられるメモリ114、及び第2コンピュータプロセス116に対するアクセスを有する。I/O回路106は、ドライバ106A、106B、106C、106D、及び106Eを含んでおり、これらのドライバはそれぞれビデオモニタ118、二次記憶装置120、ネットワーク126、ポインティングデバイス(マウス122など)、キーボード124を駆動・制御する。
The computer 100 (FIG. 1) includes a central processing unit (CPU) 102, a
本明細書中では、リソースはコンピュータプロセスによって使用されるコンピュータシステムの一部であり、一般に、使用前に割り当てられ、使用後に開放、即ちフリーにされなければならない。リソースの例として、グローバルメモリ、ファイル、ウインドウ、メニュー、及びダイアログ(dialog)がある。コンピュータプロセス110のリソースには、例えば、動的に割り当てられるメモリ114、コンピュータプロセス116、磁気ディスク120が含まれる。
As used herein, a resource is part of a computer system used by a computer process and generally must be allocated before use and released or freed after use. Examples of resources include global memory, files, windows, menus, and dialogs.
また本明細書中において、コンピュータプロセスとはコンピュータによって実行される一連の過程(step)である。コンピュータプログラムはコンピュータによって実行されうる一連の命令である。コンピュータプログラムの命令によって過程が定義され、それらがコンピュータにより実行されると、コンピュータプロセスが形成される。従って、コンピュータプロセス110の挙動をモデル化するため、コンピュータプロセス110を定義するコンピュータプログラムの解析がなされる。
In this specification, a computer process is a series of steps executed by a computer. A computer program is a series of instructions that can be executed by a computer. Processes are defined by the instructions of a computer program, and when they are executed by a computer, a computer process is formed. Therefore, in order to model the behavior of the
関数レベルでの解析
コンピュータプログラムは、通常、既に開発されているコンポーネントと新たに開発されるコードとを組合せたものである。本明細書中において、“コード”はソースコード、即ち人間に理解可能な形式の一連のコンピュータ命令、及び/またはオブジェクトコード、即ちコンピュータに理解可能な形式の一連のコンピュータ命令を表す。コンピュータプログラムのコンポーネントとは、特定の部分プロセスを実行するように既に開発され、通常、その部分プロセスが忠実に実行されることが試験済みであるコンピュータ命令及び/またはデータ構造の集まりである。部分プロセスとは、コンピュータプロセス中の1または複数の過程であり、即ちコンピュータプロセスの一部である。コンピュータプログラムの開発者は、特定の部分プロセスを実行するためこのようなコンポーネントを使用し、通常、そのコンポーネントを信頼しており、実行時には定められた通りに機能するものと思っている。そのようなコンポーネントは、開発者が既に開発したコンポーネントまたは商業的に入手可能なコンポーネントの実行の要求、即ち呼び出し(call)を含むことができる。そのようにして、コンピュータプログラムの開発に於ける作業の重複が避けられている。
An analysis computer program at the function level is usually a combination of already developed components and newly developed code. As used herein, “code” refers to source code, ie, a series of computer instructions in a form that is understandable to humans, and / or object code, ie, a series of computer instructions in a form that is understandable to a computer. A component of a computer program is a collection of computer instructions and / or data structures that have already been developed to execute a particular partial process and that have been tested to be executed faithfully. A partial process is one or more steps in a computer process, that is, a part of a computer process. Computer program developers use such components to execute specific sub-processes, and usually trust that component and expect it to function as it is defined at runtime. Such components may include requests for execution of components already developed by the developer or commercially available components, ie calls. In this way, duplication of work in computer program development is avoided.
新たなコンピュータプログラムは、通常、開発済みのコンポーネントを組み合わせ、新たに書かれたコンピュータ命令を用いてこれらのコンポーネントを互いに接続することによって開発される。そのような組合せ及び相互接続の結果、他のコンポーネントまたはコンピュータプログラムによって使用可能な新たなコンポーネント、または新たなコンピュータプログラムが生成される。あるコンピュータプログラムのコンポーネントは、そのコンピュータプログラムによって定義されるコンピュータプロセスの部分プロセスを定義する。コンピュータプロセスの各部分プロセスは、そのコンピュータプロセスによって用いられるリソースの状態を変化させ得る。従って、あるコンピュータプロセスによって用いられるリソースの状態及び状態遷移を適切に解析するには、コンピュータプログラムのコンポーネントによって定義される部分プロセスの実行がリソースの状態に与える影響を確かめなければならない。例えば、第1コンポーネントによって定義される第1部分プロセスに於いて割り当てられ、第2コンポーネントによって定義される第2部分プロセスに於いて使用され、第3コンポーネントによって定義される第3部分プロセスに於いて開放されるリソースの使用を適切に解析するには、第1、第2、及び第3部分プロセスのリソースに対する影響を解析することが必要である。 New computer programs are usually developed by combining developed components and connecting these components together using newly written computer instructions. Such a combination and interconnection results in a new component or new computer program that can be used by other components or computer programs. A component of a computer program defines a partial process of the computer process defined by the computer program. Each sub-process of a computer process can change the state of resources used by that computer process. Therefore, in order to appropriately analyze the state and state transition of a resource used by a certain computer process, it is necessary to confirm the influence of the execution of the partial process defined by the component of the computer program on the state of the resource. For example, assigned in a first partial process defined by a first component, used in a second partial process defined by a second component, and in a third partial process defined by a third component. In order to properly analyze the use of the resources to be released, it is necessary to analyze the effects on the resources of the first, second, and third partial processes.
コンピュータプログラムは、様々なコンピュータ言語の何れで書かれていても良い。典型的なコンピュータ言語は手続き型である。手続き型言語において、コンピュータプログラムのコンピュータ命令は編成されてコンポーネントを形成し、これらのコンポーネントは、しばしば手続き、または“関数”と呼ばれる。それらは各々実行されたとき特定の部分プロセスを実行するように設計される。手続き型言語の例として、C、Ada、Pascal、Fortran及びBasicがある。手続き型言語にはオブジェクト指向のものがあり、そのようなものとして例えばC++やSmallTalkがある。オブジェクト指向コンピュータ言語では、関数及びデータ構造が結合されてオブジェクトが形成され、それらのオブジェクトが更に編成されて“クラス(class)”として知られるコンポーネントが形成される。 The computer program may be written in any of various computer languages. A typical computer language is procedural. In a procedural language, computer instructions of a computer program are organized to form components, which are often referred to as procedures, or “functions”. They are each designed to execute a specific partial process when executed. Examples of procedural languages include C, Ada, Pascal, Fortran, and Basic. Procedural languages include object-oriented languages, such as C ++ and SmallTalk. In an object-oriented computer language, functions and data structures are combined to form objects, and these objects are further organized to form components known as “classes”.
コンピュータ言語にはグラフィックベースのものがあり、そのようなコンピュータ言語では、命令はコンピュータスクリーン上に表示されるグラフィックイメージとして表される。プログラマーはそれらのグラフィックイメージをリンクしてコンピュータプログラムを形成する。例えば、ワシントン州レッドモンド(Redmond,Washington)のマイクロソフト社(Microsoft Corporation)から入手可能な“Microsoft Visual Basic”は、そのようなグラフィックベースのコンピュータ言語である。コンピュータ言語には、マイクロソフト社から入手可能な“Microsoft Word”ワープロソフト用の“Microsoft Word Basic”というコンピュータ言語や、マサチューセッツ州ケンブリッジ(Cambridge,Massachusetts)のロータスディベロップメント社(Lotus Development Corporation)から入手可能な“Lotus 1−2−3”表計算ソフト用の“Lotus 1−2−3”マクロ言語のように、特定のソフトウェア製品を対象としたものもある。本発明は、任意のコンピュータ言語、即ちリソースが使用される任意のコンピュータ命令プロトコルに適用可能である。ソースコードのコンピュータ命令プロトコルについて上記で述べたが、本明細書中に開示することは、オブジェクトコード形式のコンピュータ命令にも同じように適用可能であることを理解されたい。以下に示す例示的な実施形態では、解析されるコンピュータ言語はCスタンダードに説明されている良く知られたC言語である。 Some computer languages are graphic-based, in which instructions are represented as graphic images that are displayed on a computer screen. The programmer links the graphic images to form a computer program. For example, “Microsoft Visual Basic”, available from Microsoft Corporation of Redmond, Wash., Is such a graphics-based computer language. Computer languages include the “Microsoft Word Basic” computer language for the “Microsoft Word” word processor software available from Microsoft Corporation, and available from Lotus Development Corporation of Cambridge, Massachusetts. Some "Lotus 1-2-3" macro languages for spreadsheet software such as "Lotus 1-2-3" are intended for specific software products. The present invention is applicable to any computer language, ie any computer instruction protocol in which resources are used. Although the source code computer instruction protocol has been described above, it should be understood that what is disclosed herein is equally applicable to object code form computer instructions. In the exemplary embodiment shown below, the computer language to be analyzed is the well-known C language described in the C standard.
C言語で書かれたコンピュータプログラムは、通常、いくつかの関数に分割される。関数は、実行されると、入力として0または1以上のパラメータを受け取り、出力として1つの戻り値項目(returned item)を生成することもあるが、戻り値項目を生成しないこともある。これらのパラメータ及び戻り値項目はデータ構造であり、その関数によってアクセス可能なデータを含み、例えばメモリ104のようなメモリに格納される。C言語で定義された関数の例を、後にコンピュータコードの抜粋(1)に示す。
A computer program written in C language is usually divided into several functions. When executed, the function receives zero or more parameters as input and may generate one returned item as output, but may not generate a return item. These parameters and return value items are data structures, include data accessible by the function, and are stored in a memory such as
本明細書中で述べる例示的な実施形態では、コンピュータプログラム内の各関数は個々に解析される。関数は、その関数のコンピュータ命令によって影響されるその関数のリソース、エスクターナル及び項目の使用及び変化をモデル化することによって解析される。関数の項目(item)は、その関数によってアクセス可能なメモリ(例えばメモリ104)中の位置を表す。項目は型(type)と値(value)とを有する。本発明の一実施例においてサポートされる項目の型には、整数、浮動小数点、及びポインタ(pointer)データが含まれる。項目の値とは、その項目によって表されるメモリ内の位置に格納された特定のデータによって表される値である。エクスターナル及びリソースは、関数の各項目に関連付けられ得る。項目については後により詳細に説明する。変数(variable)が、識別子(identifier)と1または複数の項目との間を関連付ける。 In the exemplary embodiment described herein, each function in the computer program is analyzed individually. A function is analyzed by modeling the usage and changes of the function's resources, escalators, and items that are affected by the function's computer instructions. A function item (item) represents a position in a memory (for example, the memory 104) accessible by the function. An item has a type and a value. The types of items supported in one embodiment of the present invention include integer, floating point, and pointer data. An item value is a value represented by specific data stored at a location in the memory represented by the item. Externals and resources can be associated with each item of the function. Items will be described in more detail later. A variable associates between an identifier and one or more items.
関数のエクスターナルは、その関数の文脈の外、即ち、その関数の実行の始まる前またはその関数の実行が終了した後に存在するコンピュータプログラムの一部を表す。関数のエクスターナルの例には、関数のパラメータ及び戻り値項目、グローバル定義変数、及びスタティック変数が含まれる。用語(i)“グローバル定義変数”及び(ii)“スタティック変数”は、本明細書中では、それぞれ(i)リンケージが“外部的(extern)”な変数、及び(ii)リンケージが“内部的(intern)”で格納期間が“静的”な変数を表すのに使用される。“ローカル定義変数”はリンケージが“内部的”で格納期間が“自動的(automatic)”な変数である。リンケージ(linkage)については、Cスタンダードのセクション6.1.2.2に説明されており、格納期間(storage duration)についてはCスタンダードのセクション6.1.2.4に説明されている。簡単に説明すれば、グローバル定義変数は、コンピュータプロセスの全部分プロセスに対し定義され、スタティック変数は幾つかの部分プロセスに対し定義されるが、コンピュータプロセスの全部分プロセスに対して定義されるとは限らない。 A function external represents a portion of a computer program that exists outside the context of the function, that is, before execution of the function begins or after execution of the function ends. Examples of function externals include function parameters and return value items, global definition variables, and static variables. The terms (i) “globally defined variable” and (ii) “static variable” are used herein to refer to (i) a variable whose linkage is “external” and (ii) whose linkage is “internal”, respectively. (Intern) "is used to represent a variable whose storage period is" static ". “Locally defined variable” is a variable whose linkage is “internal” and whose storage period is “automatic”. Linkage is described in C standard section 6.1.2.2, and storage duration is described in C standard section 6.1.2.4. In short, globally defined variables are defined for all subprocesses of a computer process, and static variables are defined for several subprocesses, but defined for all subprocesses of a computer process. Is not limited.
各部分プロセスは幾つかのリソースを使用する。例えば、プロセス110(第1図)の関数202(第2図)は、動的に割り当てられるメモリ114、及びコンピュータプロセス116を使用する。また関数202(第2図)は、(i)関数202A及び202B及び他の関数によってもアクセス可能なグローバル定義メモリ204と、(ii)ローカルメモリと、(iii)パラメータ208A〜208Cと、(iv)戻り値項目210も使用する。関数202は、これらのリソースの1または複数をモデル化することによって解析される。
Each partial process uses several resources. For example, function 202 (FIG. 2) of process 110 (FIG. 1) uses dynamically allocated
各リソース及びエクスターナルは状態(state)を有する。関数の各コンピュータ命令の実行は、コンピュータ命令の実際の実行によって生じるであろうその関数のリソースまたはエクスターナルの状態の変化をモデル化することによってエミュレートされる。エクスターナルまたはリソースの状態が変化する場合、その状態変化はそれぞれ対応するエクスターナル挙動モデルまたはリソース挙動モデルと比較され、その状態変化がエクスターナルまたはリソースの適切な使用を反映しているかどうかが判定される。状態変化が不適切である場合は、状態違反が発生し、エラーが通知される。エラーのユーザへの通知は、(i)エラーメッセージをビデオモニタ118(第1図)または同様の出力装置に表示することによって、(ii)エラーメッセージをメモリ104または二次記憶装置120のエラーログファイルに記録することによって、または(iii)エラーメッセージの表示とエラーメッセージの記録を両方とも行うことによって可能である。
Each resource and external has a state. The execution of each computer instruction of a function is emulated by modeling changes in the resource or external state of that function that would result from the actual execution of the computer instruction. When the state of the external or resource changes, the state change is compared with the corresponding external behavior model or resource behavior model, respectively, to determine whether the state change reflects the appropriate use of the external or resource. If the state change is inappropriate, a state violation occurs and an error is notified. Notification of the error to the user can be accomplished by (i) displaying the error message on the video monitor 118 (FIG. 1) or similar output device, and (ii) displaying the error message in the error log of the
挙動モデル
関数モデルは、関数をその関数が割り当てる新たなリソース及びその関数のエクスターナルにその関数が施す演算に関して、抽象して表したものである。
上述したように、リソースは状態を有する。リソースの有効な状態及び有効な状態間遷移は、リソース挙動モデルによって表される。リソースの挙動のモデル化は、そのリソースの実際の挙動よりも大幅に簡略化され得る。例えば、リソースの状態は、状態図300(第3A図)によって表されるリソース挙動モデルに基づいてモデル化される。状態図300に基づくと、リソースは次の状態の何れかを取り得る。
The behavior model function model is an abstract representation of a new resource to which a function is assigned and an operation that the function performs on the external of the function.
As described above, a resource has a state. Valid states of resources and valid transitions between states are represented by a resource behavior model. Modeling the behavior of a resource can be greatly simplified over the actual behavior of that resource. For example, the state of the resource is modeled based on the resource behavior model represented by the state diagram 300 (FIG. 3A). Based on the state diagram 300, a resource can assume any of the following states.
状態UとXは似ているが別のものである。未割り当てのリソースに関連付けられた項目は不定値を有し、無効なリソースに関連付けられた項目は既知の無効値(invalid value)を有する。リソース挙動モデルは挙動がモデル化されるリソースの実際の挙動と同程度に複雑になり得る。しかしながら、状態図300に表されたような大幅に簡略されたリソース挙動モデルでも、そのようなリソースの使用に於いて発生し得る全エラーのほとんどを検出する上で有効である。 States U and X are similar but different. An item associated with an unassigned resource has an indefinite value, and an item associated with an invalid resource has a known invalid value. The resource behavior model can be as complex as the actual behavior of the resource being modeled. However, a greatly simplified resource behavior model, such as that represented in state diagram 300, is effective in detecting most of the total errors that can occur in the use of such resources.
リソースは最初は割り当てられていないため、状態Uにある。各コンピュータ命令のエミュレートされた実行(それらを実際に実行するとリソースの状態変化を引き起こす)によって、リソースに演算(operation)が施される。リソースに演算を施すことによって、リソースの状態は状態図300に従って変化する。
以下にリソースに施すことのできる演算を示す。
Since the resource is not initially allocated, it is in state U. By emulated execution of each computer instruction (actual execution of them causes a state change of the resource), the operation is performed on the resource. By performing an operation on the resource, the state of the resource changes according to the state diagram 300.
The following are the operations that can be performed on resources.
このように、状態図300に従うと、未割り当てのリソース、即ち状態Uにあるリソースに対し、ある関数内の命令によって適確な割り当てがなされる場合、即ち演算aが施される場合、そのリソースは状態A、即ち割り当てられた状態となる。しかしながら、未割り当てのリソース、即ち状態Uにあるリソースが計算に於いて使用される(従って演算cを施される)と、そのリソースは状態Eとなる。状態Eは、プログラミングエラーの結果、状態違反が起こったことを示す。状態Eはリソースの予め定められた挙動を表すものではなくオプション的なものであるが、開示する実施例に於いては、状態違反を表す便利な方法として使用される。別の実施例では状態Eは省略され、状態違反は上記の例に於いてリソースが状態Uにあるとき、演算cが定義されないことに注目することによって検出される。
状態図300(第3A図)は表Cのようにまとめられる。
As described above, according to the state diagram 300, when an unallocated resource, that is, a resource in the state U is appropriately allocated by an instruction in a certain function, that is, when an operation a is performed, the resource Is in state A, the assigned state. However, if an unassigned resource, ie a resource in state U, is used in the computation (and thus subjected to operation c), the resource is in state E. State E indicates that a state violation has occurred as a result of a programming error. State E is optional rather than representing a predetermined behavior of the resource, but in the disclosed embodiment, it is used as a convenient way to represent a state violation. In another embodiment, state E is omitted and a state violation is detected by noting that operation c is not defined when the resource is in state U in the above example.
State diagram 300 (FIG. 3A) is summarized as Table C.
状態図300中の演算識別子に対応している上付の数字、及び表Cに於いて新たな状態識別子に付されている上付の数字は、特定のエラーを示している。これらのエラーは、次の表Dに示す通りである。 The superscript number corresponding to the operation identifier in the state diagram 300 and the superscript number added to the new status identifier in Table C indicate a specific error. These errors are as shown in Table D below.
上述の例では、演算cを状態Uにあるリソースに施すことによって、状態図300に於いて状態Uから状態Eへと向かう“c2”によって識別される矢印によって示されているように、リソースは状態Eに置かれる。このように、この例に於けるエラーは表Dに示したエラー番号2、即ち未割り当てのリソースの使用である。 In the above example, by applying operation c to a resource in state U, the resource is shown in the state diagram 300 as indicated by the arrow identified by “c 2 ” going from state U to state E. Is placed in state E. Thus, the error in this example is error number 2 shown in Table D, ie the use of unallocated resources.
各関数モデルは、対応する関数の各エクスターナルにどの演算が施されるかを規定する。例えば、Cスタンダードのセクション7.9.5.3に説明されているC言語用に定義された関数fopen () は、2つのパラメータを定め、そのうち第1のパラメータは入力として受け取られ、開かれるべきファイルを特定する。また、開かれたファイルに対応するファイルポインタである戻り値項目を定める。ファイルポインタ、即ち、型“FILE”の項目を指定するポインタは、Cスタンダードのセクション7.9.1に説明されておりよく知られている。ファイルポインタは関数fopen () のエクスターナルであり、このパラメータによって特定されるファイルは、このエクスターナルに関連付けられるリソースである。関数fopen () に対する関数モデルは、初期状態が状態Qの新たなリソースが生成されることを定める。このリソースの初期状態は状態Aではなく状態Qであるが、それは関数fopen () はファイルが正常に開かれることを保証するものではないからである。 Each function model defines which operations are performed on each external of the corresponding function. For example, the function fopen () defined for the C language described in section 7.9.5.3 of the C standard defines two parameters, of which the first parameter is taken as input and opened Identify the file that should be. Further, a return value item which is a file pointer corresponding to the opened file is defined. File pointers, ie pointers that specify items of type “FILE”, are well known and described in section 7.9.1 of the C standard. The file pointer is an external of the function fopen (), and the file specified by this parameter is a resource associated with this external. The function model for the function fopen () defines that a new resource is generated whose initial state is state Q. The initial state of this resource is state Q, not state A, because the function fopen () does not guarantee that the file is opened successfully.
Cスタンダードのセクション7.9.5.1に説明されているC言語用に定義された関数fclose () は、ファイルポインタであるパラメータを定める。 The function fclose () defined for the C language described in section 7.9.5.1 of the C standard defines a parameter that is a file pointer.
関数fclose () を実行することによって、そのパラメータが指定するファイル記述子(file descriptor)を有するファイルが閉じられる。関数fclose () に対する関数モデルは、関連するファイルが閉じられること、従って開放されることが反映されるように、そのパラメータに演算kが施されることを定める。同様に、ファイルに対する読み出し及び書き込み演算を定義するC言語の関数に対する関数モデルは、ファイルが使用されたことが反映されるように、そのファイルを表すリソースに演算cが施されることを規定する。 By executing the function fclose (), a file having a file descriptor specified by the parameter is closed. The function model for the function fclose () determines that the operation k is applied to its parameters to reflect that the associated file is closed and thus opened. Similarly, a function model for a C language function that defines read and write operations on a file specifies that operation c is performed on the resource representing that file so that the file is used. .
あるリソースに対応する項目(例えば関数fopen () の戻り値項目であるファイルポインタなど)が、決定命令(decision instruction)中で述語(predicate)として使用される場合、演算pがそのリソースに施され、リソースの状態は状態図300に基づいて変化される。項目が関係式(例えば演算子の>、<、<=、>=、及び!=の何れかを含む演算)またはブール式(例えば演算子&&、||、及び!の何れかを含む演算)中にオペランドとして現れる場合、または項目が“switch”ステートメントに於いて制御式(control expression)として用いられる場合、項目は述語中で用いられることとなる。“switch”ステートメントはC言語用に定義されており、制御式の値に応じて関数の流れを制御する。“switch”ステートメントについては、Cスタンダードのセクション6.6.4.2に詳細に説明されている。 When an item corresponding to a certain resource (for example, a file pointer that is a return value item of the function fopen ()) is used as a predicate in a decision instruction, an operation p is applied to the resource. The state of the resource is changed based on the state diagram 300. The item is a relational expression (for example, an operation including any of the operators>, <, <=,> =, and! =) Or a Boolean expression (for example, an operation including any of the operators &&, ||, and!). An item will be used in a predicate if it appears as an operand in or if the item is used as a control expression in a "switch" statement. The “switch” statement is defined for the C language, and controls the function flow according to the value of the control expression. The “switch” statement is described in detail in section 6.6.4.2 of the C standard.
あるリソースに対応する項目が計算中で用いられる場合、演算cがリソースに施され、それにより状態図300に基づいてそのリソースの状態が変わる。項目が計算中で使用されるのは、(i)数学的演算(例えば+、/、*、または−)に対するオペランドとして現れる場合、または(ii)リソースがポインタのデリファレンス(dereference)または配列へのアクセスとして現れる場合、または(iii)リソースが配列指標として現れる場合である。 When an item corresponding to a resource is used in the calculation, operation c is applied to the resource, thereby changing the state of the resource based on state diagram 300. An item is used in a calculation when (i) it appears as an operand to a mathematical operation (eg, +, /, *, or-), or (ii) a resource goes to a pointer dereference or array Or (iii) when a resource appears as an array index.
ポインタ及び配列については良く知られており、Cスタンダードにも記載されているが、念のためにポインタ及び配列について以下に簡単に説明する。C言語の文脈に於いて、ポインタはその値が他の項目のメモリ中のアドレスであるような項目である。従って、ポインタは他の項目を“指定(point)”する。ポインタをデリファレンスすることは、ポインタが指定する項目を検索することである。 Although pointers and arrays are well known and described in the C standard, pointers and arrays are briefly described below just in case. In the C language context, a pointer is an item whose value is the address in memory of another item. Thus, the pointer “points” other items. Dereferencing the pointer means searching for an item specified by the pointer.
開示される本発明の実施例を具現するべく用いられる以下により詳細に説明されるデータ構造は、他のデータ構造を指定するポインタを含むものとして説明される。データ構造を一意に特定するためのポインタ以外の機構も知られているが、これらの機構は本発明の原理を逸脱することなくポインタの代わりとなり得るものであることを理解されたい。 The data structures described in more detail below that are used to implement embodiments of the disclosed invention are described as including pointers that specify other data structures. Although mechanisms other than pointers for uniquely identifying data structures are known, it should be understood that these mechanisms can be substituted for pointers without departing from the principles of the present invention.
配列は、同様の構造の1または複数の項目の集合である。配列の項目はエレメントと呼ばれ、順番に番号付けされる。配列へのアクセスは、エレメントの番号、即ちエレメントの指標を参照することによる配列のエレメントへのアクセスである。 An array is a collection of one or more items of similar structure. The items in the array are called elements and are numbered sequentially. An access to an array is an access to an element of the array by referring to the element number, that is, the index of the element.
演算xは、NULLであるとされる項目に対応するリソースに施される。NULLは一般に無効値であり、ある項目が有効な値を有していないことを示すためにその項目に代入される。例えば、値がNULLであるポインタは項目の指定をしない。C言語の文脈では、NULLは“false(偽)”を表すブール値でもある。ある項目がNULLと比較されてその比較の結果がtrue(真)であるとされる場合、その項目はNULLである、即ちNULLの値を有するとされる。後により詳細に説明するように、関数を解析するには、実行時の関数の特定の挙動に関して様々な仮定を設定することが必要である。例えば、関数fopen () は、正常にファイルを開くか、またはファイルを開くのに失敗するか何れかである。戻り値項目、即ちファイルポインタがNULLと比較されその結果がtrueであるとされる場合、即ち関数fopen () がファイルを開くのに失敗したとされる場合、そのファイルを表すリソースに演算xが施される。これについては、後により詳細に説明する。 The operation x is performed on the resource corresponding to the item that is assumed to be NULL. NULL is generally an invalid value and is assigned to an item to indicate that the item does not have a valid value. For example, a pointer whose value is NULL does not specify an item. In the context of the C language, NULL is also a Boolean value representing “false”. If an item is compared to NULL and the result of the comparison is true, the item is NULL, i.e., has a value of NULL. As will be explained in more detail later, analyzing a function requires setting various assumptions about the specific behavior of the function at runtime. For example, the function fopen () either successfully opens the file or fails to open the file. If the return value item, i.e., the file pointer is compared to NULL and the result is true, i.e. if the function fopen () fails to open the file, the resource x represents the operation x. Applied. This will be described in more detail later.
本発明の基本的原理を説明するための例
リソースのモデル化の有用性について以下に例を用いて説明する。以下のソースコード抜粋(1)はプログラミングエラーを含んでおり、開示される本発明の実施例ではそのプログラミングエラーを検出する。このソースコード抜粋(1)は公知のC言語に適合するものであり、関数example 1 () を定義している。ライン番号はC言語の一部ではないが、以下の説明をよりわかりやすくするために付け加えたものである。
Example for explaining the basic principle of the present invention The usefulness of resource modeling is explained below using an example. The following source code excerpt (1) contains a programming error, which is detected in the disclosed embodiment of the invention. This source code excerpt (1) conforms to the well-known C language, and the function example 1 () is defined. Line numbers are not part of the C language, but are added to make the following explanation easier to understand.
関数example 1 () を解析するとき、エクスターナルを含む各項目の状態が追跡される。変数“str”はローカルに定義された、即ち関数example 1 () の文脈内でのみ定義されたものである。変数“str”はライン10で定義されているように、型が“char”であるデータを指定するポインタである。しかし最初、変数“str”は初期化されておらず特定のデータを指定しない。従って、変数“str”はリソースに関連付けられていない。 Function example When analyzing 1 (), the status of each item, including the external, is tracked. The variable “str” is defined locally, ie the function example 1 Defined only in the context of (). The variable “str” is a pointer that specifies data whose type is “char” as defined in the line 10. Initially, however, the variable “str” is not initialized and does not specify specific data. Therefore, the variable “str” is not associated with the resource.
Cスタンダードのセクション7.10.3.3に説明されているC言語用に定義された関数malloc () の実行では、割り当てられるメモリ(例えばメモリ104(第1図))に対するリクエストを受け付け、そのメモリを割り当てるかまたはその割り当てに失敗する。関数malloc () は、戻り値項目として、メモリの割り当てに成功した場合は割り当てられたメモリを指定するポインタを、そうでない場合はNULLポインタをリターンする。このように、関数malloc () は初期状態がQである新たなリソースを生成し、その新たなリソースを関数malloc () の戻り値項目に関連付ける。ライン23で関数malloc () の戻り値項目の値が代入された後において、変数“str”は、メモリが割り当てられた場合は新たに割り当てられたメモリを指定し、そうでない場合はNULLポインタである。 Execution of the function malloc () defined for the C language described in section 7.10.3.3.3 of the C standard accepts a request for the allocated memory (eg memory 104 (FIG. 1)) Allocate or fail to allocate memory. The function malloc () returns, as a return value item, a pointer designating the allocated memory if the memory allocation is successful, and a NULL pointer otherwise. In this way, the function malloc () generates a new resource whose initial state is Q, and associates the new resource with the return value item of the function malloc (). After the value of the return value item of the function malloc () is assigned in line 23, the variable “str” designates the newly allocated memory if the memory is allocated, and if not, with the NULL pointer. is there.
ソースコード抜粋(1)のライン25において、変数“str”は関数fgets () 内でパラメータとして用いられている。この関数fgets () もCスタンダードのセクション7.9.7.2に説明されているC言語用に定義された関数である。関数fgets () を実行すると、ソースコード抜粋(1)のライン25の文脈において、第1パラメータ、即ち、変数“str”がデリファレンスされる。従って、変数“str”に関連付けられたリソースに対して演算iが施される。状態図300(第3A図)及び表C、表Dに示されているように、状態Qのリソースに演算iを施すとリソースは状態Aに置かれ、割り当てられているかどうか不確実なデータがチェックされることなしに使用されたことを示すエラーメッセージが生成される。 In line 25 of the source code excerpt (1), the variable “str” is used as a parameter in the function fgets (). This function fgets () is also a function defined for the C language described in section 7.9.7.2 of the C standard. When the function fgets () is executed, the first parameter, ie, the variable “str” is dereferenced in the context of the line 25 of the source code excerpt (1). Therefore, the operation i is performed on the resource associated with the variable “str”. As shown in state diagram 300 (FIG. 3A) and Tables C and D, when an operation i is applied to a resource in state Q, the resource is placed in state A, and there is uncertain data whether it is allocated or not. An error message is generated indicating that it was used without being checked.
ソースコード抜粋(1)のライン29において、変数“str”は、変数“str”が指定するメモリをフリーにする即ち開放する関数free () にパラメータとして渡されている。従って、関数“str”に関連付けられたリソースに対し演算kが施される。状態図300及び表C、表Dに示されているように、演算kを状態Aにあるリソースに施すと、リソースは状態Uに置かれる。割り当てられているリソースを開放することは適正であるため、エラーは通知されない。 In the line 29 of the source code excerpt (1), the variable “str” is passed as a parameter to the function free () that frees the memory designated by the variable “str”. Accordingly, the operation k is performed on the resource associated with the function “str”. As shown in state diagram 300 and Tables C and D, when operation k is applied to a resource in state A, the resource is placed in state U. Since it is appropriate to release the allocated resources, no error is reported.
以下のテキスト(2)は、ソースコード抜粋(1)の関数example 1 () を解析する、開示される本発明の実施例によって生成されるエラーメッセージを示したものである。 The following text (2) is the function example of the source code excerpt (1). 1 illustrates an error message generated by an embodiment of the disclosed invention that parses ().
テキスト(2)において、“example 1.c”は、上記のソースコード抜粋(1)を含む、従って関数example 1 () を定義しているファイルを表している。関数example 1 () は、ソースコード抜粋(1)のライン23において関数malloc () の呼び出し(即ち実行要求)において、割り当てを要求されるメモリ量に対してメモリが足りないかもしれないということを考慮していない。関数example 1 () の実行時に関数malloc () が要求されたメモリの割り当てに失敗すると、関数example 1 () の実行を含むコンピュータプロセスが突然アボートし、ユーザにはプロセスの予期されない終了に対する理由も示されないことになる。しかしながら、例えば上記のテキスト(2)を用いてそのような事態が考慮されていないことを検出し通知することによって、関数example 1 () の開発者に、関数example 1 () 中の欠陥を修正するのに必要な情報が与えられ、そのような事態に適切に対処することが可能となる。 In the text (2), “example” 1. c ″ contains the source code excerpt (1) above, so the function example 1 Indicates a file that defines (). Function example 1 () takes into account that in the call to the function malloc () in line 23 of the source code excerpt (1) (ie execution request), there may be insufficient memory for the amount of memory required to be allocated. Not. Function example If the function malloc () fails to allocate the requested memory when 1 () is executed, the function example The computer process containing the execution of 1 () will abort abruptly and the user will not be given a reason for the unexpected termination of the process. However, for example, by using the text (2) above to detect and notify that such a situation is not taken into account, the function example 1 The function example is given to the developer of (). 1) The information necessary to correct the defects in () is given, and it becomes possible to appropriately deal with such a situation.
本発明の有用性は、ソースコード抜粋(1)の関数example 1 () におけるファイルポインタ“fptr”の状態の追跡について検討することによって更に明らかとなる。ファイルポインタ“fptr”は関数example 1 () のローカル定義変数である。ファイルポインタ“fptr”は、型“FILE”のデータを指定するポインタである。最初、ファイルポインタ“fptr”は初期化されておらず、どのリソースにも関連付けられていない。 The utility of the present invention is that the function example of the source code excerpt (1) is used. It becomes more apparent by examining the tracking of the state of the file pointer “fptr” in 1 (). The file pointer “fptr” is a function example. 1 () Locally defined variable. The file pointer “fptr” is a pointer that designates data of the type “FILE”. Initially, the file pointer “fptr” has not been initialized and is not associated with any resource.
ライン14において、関数fopen () の戻り値項目がファイルポインタ“fptr”に代入される。上述したように、関数fopen () は、初期状態Qの新たなリソースを生成し、その新たなリソースに関数fopen () の戻り値項目を関連付ける。ライン15の“if”ステートメントは、ファイルポインタ“fptr”が指定するファイルが正常に開かれたかどうかをファイルポインタ“fptr”と“NULL”とを比べることによって判定する。 In line 14, the return value item of the function fopen () is assigned to the file pointer “fptr”. As described above, the function fopen () generates a new resource in the initial state Q, and associates the return value item of the function fopen () with the new resource. The “if” statement in line 15 determines whether the file specified by the file pointer “fptr” has been opened normally by comparing the file pointer “fptr” with “NULL”.
ファイルポインタ“fptr”がNULLである場合、ファイルは正常に開かれておらず、関数example 1 () は、ユーザにファイルを正常に開くことができなかったことを通知して終了する。逆に、ファイルポインタ“fptr”がNULLでない場合は、ファイルポインタ“fptr”が指定するファイルは正常に開かれていることがわかり、関数example 1 () はライン22へと進む。ライン15においてファイルポインタ“fptr”の比較をすることによって、ファイルポインタ“fptr”に関連付けられたリソースに演算pが施される。従って、ファイルポインタ“fptr”に関連付けられたリソースの状態は状態Qから状態Aへと変化する。従って、状態図300及び表Cに示されているように、計算(演算cの適用)または述語(演算pの適用)のどちらでファイルポインタ“fptr”を使用しても、エラーメッセージは生成されない。従って、ファイルポインタ“fptr”の処理に関してエラーは検出されない。 If the file pointer “fptr” is NULL, the file has not been opened normally and the function example 1 () notifies the user that the file could not be opened normally and ends. Conversely, when the file pointer “fptr” is not NULL, it can be seen that the file specified by the file pointer “fptr” has been opened normally, and the function example 1 () goes to line 22. By comparing the file pointer “fptr” on line 15, the operation p is performed on the resource associated with the file pointer “fptr”. Accordingly, the state of the resource associated with the file pointer “fptr” changes from the state Q to the state A. Therefore, as shown in the state diagram 300 and Table C, no error message is generated when the file pointer “fptr” is used in either a calculation (application of operation c) or a predicate (application of operation p). . Accordingly, no error is detected regarding the processing of the file pointer “fptr”.
上述したように、関数fopen () 及びmalloc () は、実行時、パラメータ及び戻り値項目のリソースに対して特定の処理を実行する。関数fopen () やmalloc () のような関数は、コンピュータプロセス110によってアクセス可能なライブラリ関数112(第1図)内に含まれる。そのような関数の呼び出しは、関数202(第2図)に含まれる。本明細書中において、関数に対する“呼び出し(call)”とは、実行時にCPU102(第1図)のようなプロセッサに次のような処理をさせるステートメントである。即ち、(i)関数に0または1以上の項目をパラメータとして与え、(ii)関数を実行し、(iii)関数の評価により生じる値を表す戻り値項目(戻り値項目が関数によって定められる場合)を生成する。第1の関数が第2の関数に対する呼び出しを含んでいる場合、第1の関数は“呼び出し関数(calling function)”と呼ばれる。また、第2の関数は“被呼び出し関数(called function)”と呼ばれる。
As described above, the functions fopen () and malloc () execute specific processing on the parameters and the resource of the return value item at the time of execution. Functions such as functions fopen () and malloc () are included in library functions 112 (FIG. 1) accessible by
関数202のステートメントによって呼び出される関数の実行によって影響される関数202のリソース(第2図)を適切に解析するため、そのような被呼び出し関数の挙動を記述する関数モデルがサポートされる。一実施例では、そのような関数モデルは、例えばCスタンダードにあるこのような関数の挙動を定める公知のテキスト形式の記述から生成され、コンピュータ100のメモリ104内に格納される。これらの関数モデルはその後コンピュータプログラムの解析に先立ってメモリ104から検索され取り出される。これについては以下により詳細に説明する。
In order to properly analyze the resource of function 202 (FIG. 2) affected by the execution of the function called by the statement of
以下に、上記のソースコード抜粋(1)の関数example 1 () によって呼び出される関数の関数モデルの例を示す。これらの被呼び出関数は全てCスタンダードのライブラリの“stdio”(入力/出力)ヘッダファイルからのものである。このヘッダファイルはC言語で使用される広く知られたファイルであり、Cスタンダードのセクション7.9以下に示されている。 The function example of the above source code excerpt (1) is shown below. 1 An example of a function model of a function called by () is shown. These called functions are all from the “stdio” (input / output) header file of the C standard library. This header file is a well-known file used in the C language, and is shown in section 7.9 and below of the C standard.
開示される本発明の実施例に基づく関数モデルをメモリ104(第1図)において表す関数モデル構造体については、後に詳述する。関数モデル(3)は、関数malloc () の実行が関数malloc () のエクスターナルの状態に与える効果について定めている。関数モデル(3)によると、新たなリソースが生成され、状態Qに初期化され、関数malloc () の戻り値項目に関連付けられる。また関数モデル(3)は、関数malloc () の第1パラメータ、即ち、パラメータ0(parameter O)に演算Cが施されることも規定している。 The function model structure representing the function model in the memory 104 (FIG. 1) according to the disclosed embodiment of the present invention will be described in detail later. The function model (3) defines the effect that the execution of the function malloc () has on the external state of the function malloc (). According to the function model (3), a new resource is generated, initialized to the state Q, and associated with the return value item of the function malloc (). The function model (3) also defines that the operation C is performed on the first parameter of the function malloc (), that is, the parameter 0 (parameter O).
関数モデル(4)は、関数free () の実行が関数free () のエクスターナルに及ぼす効果について規定しており、演算kが引数リスト(argument list)の第1パラメータ即ちパラメータ0に施されることを示している。
The function model (4) defines the effect of execution of the function free () on the external of the function free (), and the operation k is applied to the first parameter of the argument list, that is, the
関数モデル(5)は、関数fgeps () を呼び出すことによって、(i)演算iがパラメータ0、即ち第1パラメータに施され、(ii)演算cがパラメータ1、即ち第2パラメータに施され、(iii)演算iがパラメータ2、即ち第3パラメータに施されることを示している。
In the function model (5), by calling the function fgeps (), (i) the operation i is applied to the
リソースリークの検出
リソースをモデル化しリソースと関数のエクスターナルとの関連を追跡することによって、開示するエラー検出機構は、リソースリークを検出する有用な機構を提供する。リソースは、ある関数がそのリソースを割り当てられた状態にしたまま終了するとき、即ち、その関数のどのエクスターナルによってもそのリソースがアクセスできなくなったとき、その関数によって“リーク”される。リークされると、そのリソースはリークを発生させた関数の実行が終了した後にはそのリソースを指定するポインタが保持されないため、使用することができなくなる。リソースが再使用可能な場合、例えば、動的に割り当てられるメモリ114(第1図)のような場合、関数の実行の終了前にリソースをフリーにしないと、他の関数がそのリソースを再使用することができなくなる。ある部分プロセスが動的に割り当てられるメモリを繰り返しリークさせると、遂にはその部分プロセス含むコンピュータプロセスに使用可能な全メモリが消耗される結果となり得る。
リソースリークの検出の例として、ソースコード抜粋(6)の関数example 2 () について考えてみる。
Resource Leak Detection By modeling resources and tracking the relationship between resources and function externals, the disclosed error detection mechanism provides a useful mechanism for detecting resource leaks. A resource is "leaked" by a function when it exits with the resource assigned to it, that is, when the resource becomes inaccessible by any external of the function. When leaked, the resource cannot be used because the pointer specifying the resource is not held after the execution of the function causing the leak is completed. If a resource is reusable, such as dynamically allocated memory 114 (FIG. 1), other functions reuse the resource if the resource is not freed before the end of function execution You can't. If a partial process repeatedly leaks dynamically allocated memory, it can eventually result in exhaustion of all available memory for the computer process that contains the partial process.
As an example of resource leak detection, the function example in the source code excerpt (6) 2 Think about ().
変数“str”は関数example 2 () のローカル変数であり、従って関数example 2 () 以外の関数にはアクセス可能でない。変数“str”が指定するメモリは、ソースコード抜粋(6)のライン25の“return”命令の前にフリーにされていないため、このメモリは関数example 2 () をその一部として含むコンピュータプロセス110が終了するまで使用することができず、開放または再割り当てをすることもできない。従って、このリソースはコンピュータプロセス110から“リーク”する。
The variable “str” is a function example. 2 () is a local variable, so the function example 2 Functions other than () are not accessible. Since the memory designated by the variable “str” is not freed before the “return” instruction in the line 25 of the source code excerpt (6), this memory has the function “example”. It cannot be used until the
関数のエクスターナルは関数の実行の終了後も存在する項目であるため、エクスターナルを通じて到達可能(reachable)な割り当てられたリソースはリークされない。特定のエクスターナルに関連付けられていないリソースも、ある場合には、エクスターナルを通じて到達可能である。例えば、項目の配列の特定のエレメントに関連付けられたリソースは、その項目の配列の別のエレメントであるエクスターナルを通じて到達可能である。これは、C言語によると、ある配列のエレメントのメモリ中の位置は、その配列の他のエレメントの位置から計算可能であるからである。 Since the function external is an item that exists even after the execution of the function ends, the allocated resources that are reachable through the external are not leaked. Resources that are not associated with a particular external are also reachable through the external in some cases. For example, a resource associated with a particular element of an array of items is reachable through an external that is another element of the array of items. This is because according to the C language, the position in memory of an element of an array can be calculated from the position of another element of the array.
リークは、関数のトラバース(traversal)の終了時にチェックされる。リークの検出については後により詳細に説明するので、ここでは簡単に要約する。エクスターナルを通じて到達可能な全てのリソースをマーク(印し付け)する。マークされず且つ割り当てられているリソースはリークされたものとして通知する。ライン25において変数“str”はリターンされないため、変数“str”はエクスターナルではない。従って、変数“str”によって指定されるメモリは、割り当てられており且つ関数example 2 () のトラバースの終了時にマークされていない。よって、変数“str”によって示されるメモリはリークされる。
関数example 2 () の解析によって、次のエラーメッセージが生成される。
Leaks are checked at the end of the function traversal. Since leak detection will be described in more detail later, it will be briefly summarized here. Mark all resources reachable through the external. Resources that are not marked and allocated are reported as leaked. Since the variable “str” is not returned in line 25, the variable “str” is not external. Thus, the memory specified by the variable “str” is allocated and the function example 2 Not marked at the end of () traverse. Therefore, the memory indicated by the variable “str” is leaked.
Function example 2 The analysis of () generates the following error message:
従来技術のスタティックチェッカは、リソースリークを検出することができない。従来技術のランタイムチェッカ(runtime checker)は、関数にリソースリークを発生させ得る全ての起こり得るイベントを考慮しないことがしばしばあり、一般に大きなコンピュータプログラムの文脈の外で単一の関数を解析してその単一の関数内のリソースリークを検出することはできない。対照的に、開示される本発明の実施例では、大きなコンピュータプログラムの単一の関数を解析することによって、リソースリークが効果的に検出される。以下により詳細に説明するように、開示するエラー検出機構は、関数がリソースリークを発生させるような起こり得るイベントを全て考慮する。従って、本発明は、従来技術に対して大幅に向上している。 Prior art static checkers cannot detect resource leaks. Prior art runtime checkers often do not consider all possible events that can cause a resource to leak into a function, generally analyzing a single function outside the context of a large computer program It is not possible to detect resource leaks within a single function. In contrast, in the disclosed embodiment of the present invention, resource leaks are effectively detected by analyzing a single function of a large computer program. As described in more detail below, the disclosed error detection mechanism considers all possible events that cause the function to cause a resource leak. Thus, the present invention is a significant improvement over the prior art.
エクスターナルの複合状態
以下に詳細に説明するように、関数の解析は、その関数の制御の流れを追い、その関数の個々のステートメントの実行をエミュレートし、エクスターナル及びリソースの状態を追跡することによってなされる。関数の制御の流れとは、その関数の特定の実行時に実行されるその関数のコンピュータ命令の特定の順番である。制御が第1コンピュータ命令から第2コンピュータ命令へと移るとき、第2コンピュータ命令は第1コンピュータ命令の実行に続いて実行される。関数の制御の流れは、しばしば本明細書中では、関数の制御流れ経路と呼ばれる。関数の制御の流れは、しばしば、コンピュータプロセスに於いてその関数によって定義される部分プロセスの実行中に発生する特定のイベントに依存する。
External Compound State As described in detail below, the analysis of a function follows the flow of control of that function, emulates the execution of individual statements of that function, and tracks the state of externals and resources. Made. The flow of control of a function is a specific order of the computer instructions for that function that are executed during the specific execution of that function. When control is transferred from the first computer instruction to the second computer instruction, the second computer instruction is executed following execution of the first computer instruction. A function control flow is often referred to herein as a function control flow path. The flow of function control often depends on the particular event that occurs during the execution of the partial process defined by the function in the computer process.
関数の解析においては、関数の全ての可能な制御流れ経路を考慮することが望ましい。従って、関数の制御流れ経路に影響を与えうる全てのイベントを考慮することが望ましい。従来技術のスタティックチェッカは、しばしば、制御流れ経路を全く考慮しない。ランタイムチェッカは、関数の制御流れ経路に影響を与えるイベントを操作することによって、コンピュータプロセスの実行中にそのコンピュータプロセスが各制御流れ経路をたどるようにユーザが強制し得る範囲に於いて、特定の関数の制御流れ経路を考慮するのみである。一方、開示されるエラー検出機構は、ユーザが介入することなく、自動的に関数の各制御流れ経路の解析を行う。更に、開示するエラー検出機構は、関数の解析をその関数を含むコンピュータプロセスまたはコンピュータプログラムの文脈の外で行うことができる。従って、個々の関数を、より大きな関数またはコンピュータプログラムまたはプロセス中に組み込む前にエラーに対してより完全にチェックすることができる。 In function analysis, it is desirable to consider all possible control flow paths of the function. Therefore, it is desirable to consider all events that can affect the control flow path of the function. Prior art static checkers often do not consider the control flow path at all. The run-time checker operates on events that affect the control flow path of a function to the extent that the user can force the computer process to follow each control flow path during execution of the computer process. It only considers the control flow path of the function. On the other hand, the disclosed error detection mechanism automatically analyzes each control flow path of the function without user intervention. Further, the disclosed error detection mechanism can perform the analysis of a function outside the context of a computer process or computer program that includes the function. Thus, individual functions can be more thoroughly checked for errors before being incorporated into a larger function or computer program or process.
例として、ソースコード抜粋(6)の関数example 2 () について考えてみる。関数example 2 () の正確な制御流れ経路は、関数example 2 () をコンピュータプロセス内で実行するまでは未知である。例えば、ライン14に於いて呼び出される関数malloc () がリクエストされた通りにメモリを割り当てるのに成功した場合、制御は、ライン16の“if”ステートメントからライン19の関数fopen () の呼び出しへと流れる。言い換えると、ライン14で呼び出されたとき関数malloc () がリクエストされた通りに正常にメモリを割り当てる場合、ライン19の関数fopen () の呼び出しは、ライン16の“if”ステートメントの実行の後に続く。逆に、メモリの割り当てが失敗した場合、制御はライン16の“if”ステートメントからライン17の“return”ステートメントへと流れる。ライン14に於いて呼び出されたとき関数malloc () によるメモリの割り当てが正常になされるかどうかは、通常、コンピュータプロセスに於いて関数example 2 () が実行されるまでわからない。 As an example, the function example in the source code excerpt (6) 2 Think about (). Function example 2 The exact control flow path of () is the function example 2 It is unknown until () is executed in a computer process. For example, if the function malloc () called on line 14 succeeds in allocating memory as requested, control passes from the "if" statement on line 16 to the call to the function fopen () on line 19. Flowing. In other words, if the function malloc (), when called on line 14, successfully allocates memory as requested, the call of the function fopen () on line 19 follows the execution of the "if" statement on line 16. . Conversely, if memory allocation fails, control flows from the “if” statement on line 16 to the “return” statement on line 17. Whether it is normally allocated by the function malloc () when called in line 14 is usually determined by the function example in the computer process. 2 I don't know until () is executed.
関数example 2 () の解析に於いて、関数example2 () の全ての制御流れ経路が考慮されることが望ましい。様々に仮定を変えて関数を何度もトラバースすることによって、複数の制御流れ経路が考慮される。例えば、関数example 2 () は、一度はライン14で呼び出される関数malloc () がリクエストされたメモリを正常に割り当てるという仮定の下で、一度は関数malloc () がリクエストされたメモリの割り当てに失敗するという仮定のもとでトラバースされる。 Function example In the analysis of 2 (), it is desirable to consider all control flow paths of the function example2 (). By traversing the function over and over with different assumptions, multiple control flow paths are considered. For example, the function example 2 () is the assumption that once the function malloc () called on line 14 successfully allocates the requested memory, the function malloc () fails to allocate the requested memory once. Traversed.
後に詳細に説明する本発明の一実施例では、一つの関数に対し繰り返しトラバースがなされ、各トラバースに於いて、ランダムに仮定が設定される。関数example 2 () の各トラバースは、関数example 2 () のエクスターナルの状態を追跡する。各エクスターナルは、関数example 2 () の複数回のトラバースの結果得られる各エクスターナルの幾つかの状態を反映する複合状態(composite state)を有する。 In one embodiment of the present invention, which will be described in detail later, a traversal is performed repeatedly for one function, and an assumption is set at random in each traverse. Function example 2 Each traverse of () is a function example 2 Track the external state of (). Each external uses the function example 2 (Composite state) reflecting several states of each external obtained as a result of multiple traverses of ().
エクスターナルは、複合RS、CP及びDK状態を有する。これらの複合状態は、2つの目的に用いられる。即ち、(i)関数の様々な制御流れ経路を考慮したとき不整合を生じるエクスターナルの使用を検出するため、(ii)関数の実行がその関数のエクスターナルに与える影響を記述する関数モデルを構築するため、に用いられる。構築された関数モデルは、その後、モデル化された関数を呼び出す他の関数を解析するのに用いることができる。 External has composite RS, CP and DK states. These composite states are used for two purposes. That is, (i) in order to detect the use of an external that causes inconsistencies when considering various control flow paths of the function, (ii) construct a function model that describes the effect of function execution on the external of the function. Therefore, it is used for. The constructed function model can then be used to analyze other functions that call the modeled function.
ある特定の関数の文脈内で、各エクスターナルはCP状態、DK状態、及びRS状態を有する。エスクターナルのCP状態は、使用される前にエクスターナルがチェックされるかどうかを判定するのに用いられる。“CP”という用語は、主として関心のある演算、即ち、演算p(エクスターナルのチェックを表す)の前の演算c(エスクターナルの使用を表す)、からきている。エクスターナルのDK状態は、関数によってエスクターナルの割り当て及び/または開放がなされるかどうかを判定するのに用いられる。“DK”という用語は、DK状態の目的、即ち、リソースがキル(“K”)される、即ち開放される前に定義(“D”)されるかどうかを判定するという目的から使用されている。エスクターナルのRS状態は、そのエクスターナルにリソースが関連付けられている場合に、関連付けられているリソースの状態である。“RS”という用語は、リソース(“R”)状態(“S”)からきている。 Within the context of a particular function, each external has a CP state, a DK state, and an RS state. The ecternal CP state is used to determine if the external is checked before being used. The term “CP” mainly comes from the operation of interest, ie the operation c (representing the use of external) before the operation p (representing an external check). The external DK state is used to determine whether the function assigns and / or releases ecternals. The term “DK” is used for the purpose of the DK state, ie, to determine whether a resource is killed (“K”), ie, defined (“D”) before being released. Yes. The RS state of the escalator is the state of the associated resource when the resource is associated with the external. The term “RS” comes from the resource (“R”) state (“S”).
ある関数の各エクスターナルは、その関数の複数回のトラバースの結果生じる複数のCP、DK、及びRS状態をそれぞれ反映する複合CP状態、複合DK状態、及び複合RS状態を有する。繰り返しなされる関数の各トラバースの後において、エクスターナルの新たな複合RS状態が求められるが、以下により詳細に述べるように、エクスターナルの新たな複合RS状態は、そのエクスターナルの前の複合RS状態と、その関数の最も新しいトラバースの結果生じるそのエクスターナルに関連付けられたリソースのRS状態とから求められる。同様に、以下により詳細に述べるように、新たな複合CP及びDK状態は、前の複合CP及びDK状態と、関数の最も新しいトラバースの結果生じるCP及びDK状態とからそれぞれ求められる。 Each external of a function has a composite CP state, a composite DK state, and a composite RS state that respectively reflect a plurality of CP, DK, and RS states resulting from multiple traversals of the function. After each traversal of the function to be repeated, an external new composite RS state is sought, as will be described in more detail below, the external new composite RS state is defined as: And the RS state of the resource associated with the external resulting from the most recent traversal of the function. Similarly, as described in more detail below, the new composite CP and DK states are determined from the previous composite CP and DK states and the CP and DK states that result from the most recent traversal of the function, respectively.
状態図350(第3B図)は、複合RS状態に対する状態及び状態遷移を表している。状態図350に於いて矢印は、関数のトラバースの結果生じるRS状態に基づく、前の複合RS状態からの複合RS状態遷移を表す。状態図350は表Eのようにまとめられる。 State diagram 350 (FIG. 3B) represents the states and state transitions for the composite RS state. The arrows in state diagram 350 represent a composite RS state transition from the previous composite RS state based on the RS state resulting from the function traversal. State diagram 350 is summarized as Table E.
状態図400(第4A図)は、エスクターナルのCP状態に対する状態及び状態遷移を表す。状態図400に於いて矢印は、演算を施した結果生じるCP状態遷移を表す。エクスターナルは次のCPまたは複合CP状態を有し得る。 A state diagram 400 (FIG. 4A) represents states and state transitions for the CP state of the estuary. In the state diagram 400, an arrow represents a CP state transition that occurs as a result of the operation. The external may have the following CP or composite CP state.
エスクターナルに施すことのできる演算は、表Bを参照して上記に示した通りである。状態図400は、以下の表Hにまとめられる。 The operations that can be performed on the escutial are as described above with reference to Table B. The state diagram 400 is summarized in Table H below.
状態図450(第4B図)は、エクスターナルの複合CP状態に対する状態及び状態遷移を表している。状態図450で使用されている矢印は、関数のトラバースの結果生じるCP状態に基づく、前の複合CP状態からの複合CP状態の遷移を表す。状態図450は以下の表Iにまとめられる。 State diagram 450 (FIG. 4B) shows the states and state transitions for the external composite CP state. The arrows used in state diagram 450 represent the transition of the composite CP state from the previous composite CP state based on the CP state resulting from the function traversal. The state diagram 450 is summarized in Table I below.
状態図500(第5A図)は、エスクターナルのDK状態に対する状態及び状態遷移を表している。状態図500に於いて矢印は、演算を施した結果生じるDK状態遷移を表すのに使用されている。エスクターナルは、エスクターナルに関連付けられるリソースに関数の実行が与える効果を反映する、以下のDKまたは合成DK状態を有し得る。 A state diagram 500 (FIG. 5A) shows states and state transitions with respect to the DK state of Escarnal. In the state diagram 500, the arrows are used to represent DK state transitions resulting from the operation. An escutral may have the following DK or composite DK state that reflects the effect that function execution has on the resources associated with the escalator.
エクスターナルに施すことのできる演算は、表Bを参照して上述した通りである。状態図500は以下の表Kにまとめられる。 The operations that can be performed externally are as described above with reference to Table B. The state diagram 500 is summarized in Table K below.
状態図550(第5B図)はエクスターナルの複合DK状態に対する状態及び状態遷移を表す。状態図550に於いて矢印は、関数のトラバースから生じるDK状態に基づく、前の複合DK状態からの複合DK状態遷移を表すのに使用されている。状態図550は以下の表Lにまとめられる。 State diagram 550 (FIG. 5B) represents the states and state transitions for the external composite DK state. Arrows in state diagram 550 are used to represent composite DK state transitions from previous composite DK states based on DK states resulting from function traversal. State diagram 550 is summarized in Table L below.
上記のソースコード抜粋(6)の関数example 2 () は、エクスターナルの複合状態の有用性を示す例となる。 Function example in the above source code excerpt (6) 2 () is an example showing the usefulness of the external composite state.
上述したように、関数example 2 () の制御の流れは、エミュレーションによる関数の実行時のイベントに関連して設定される仮定に依存して複数の経路の内の何れかを通る。例えば、変数“str”がNULLでない場合は、ライン16の“if”ステートメントの後に、ライン17の“return”ステートメントが続き、そうでない場合はライン19の式が続く。関数example 2 () の戻り値項目は、関数example 2 () のエクスターナルである。関数example 2 () の戻り値項目への代入は、関数example 2 () の特定のトラバースに於いて設定される特定の仮定にのみ基づいて、ソースコード抜粋(6)のライン17、ライン25またはライン29に於いてなされる。 As described above, the function example The control flow of 2 () passes through one of a plurality of paths depending on assumptions set in relation to events at the time of execution of functions by emulation. For example, if the variable “str” is not NULL, the “if” statement on line 16 is followed by the “return” statement on line 17; otherwise, the expression on line 19 follows. Function example 2 The return value item of () is the function example. 2 () is an external. Function example 2 The assignment to the return value item of () is the function example 2. Based on specific assumptions set in a specific traverse of (2), made at line 17, line 25 or line 29 of source code excerpt (6).
ライン17またはライン25では、戻り値項目にリソースは関連付けられない。従って、ソースコード抜粋(6)のライン17またはライン25の何れかを通って制御が流れるような関数example 2 () のトラバースの後において、戻り値項目を表すエスクターナルの複合RS状態は状態Uとなる。続いて、制御がライン29を通るように関数example−2 () をトラバースすると、戻り値項目を表すエクスターナルは、関数example 2 () 内で生成されたリソースに関連づけられ、適確に割り当てられる。即ち、状態Aとなる。ソースコード抜粋(6)のライン16乃至17により、関数malloc () の実行によってメモリが正常に割り当てられないというイベントに対して取られるべき動作が適切に記述されているため、リソースの適確な割り当てがなされるのである。 In line 17 or line 25, no resource is associated with the return value item. Therefore, a function example in which control flows through either line 17 or line 25 of the source code excerpt (6). After the traverse of 2 (), the complex RS state of the escaper representing the return value item becomes the state U. Subsequently, when the function example-2 () is traversed so that the control passes through the line 29, the external representing the return value item becomes the function example. 2 Associated with the resources created in () and allocated appropriately. That is, state A is entered. Lines 16 to 17 in the source code excerpt (6) adequately describe the action to be taken for the event that memory is not properly allocated by execution of the function malloc (), so that the resource An assignment is made.
状態図350(第3B図)に示されているように、前の複合RS状態が状態Uで次のRS状態が状態Aであるようなエクスターナルは、状態Qの新たな複合RS状態を有する。これは、関数example 2の実行によって、その戻り値項目が指定するメモリの割り当てがなされ得るが、必ずしも割り当てがなされるというわけではないということを反映している。従って、関数example 2の挙動を記述する関数モデルを形成するとき、関数example 2の戻り値項目は、初期状態が状態Qである新たに生成されるリソースに関連付けられるものとして記述される。 As shown in state diagram 350 (FIG. 3B), an external whose previous composite RS state is state U and the next RS state is state A has a new composite RS state of state Q. This is the function example The execution of 2 reflects that the memory specified by the return value item can be allocated, but is not necessarily allocated. Therefore, the function example When the function model describing the behavior of 2 is formed, the function example The return value item of 2 is described as being associated with a newly generated resource whose initial state is state Q.
また、複合状態を用いて、関数によるエクスターナルのつじつまのあわない使用を検出することができる。例えば、ある関数が、エクスターナルが割り当てられた状態、即ち状態AのRS状態で終了し、その関数のその後のトラバースに於いて、その関数が同じエクスターナルを開放した状態で、即ち状態KのRS状態で終了する場合、そのエスクターナルの複合RS状態は状態Eとなる。これはエラーとみなすことができる。なぜなら、一般に、呼び出し関数がある場合の実行においてはあるエクスターナルに関連付けられたリソースの割り当てをすることを求め、別の場合の実行においては同じエクスターナルに関連付けられたリソースを開放することを求めるということは考えられないからである。 In addition, using the composite state, it is possible to detect the inconsistent use of the external by the function. For example, a function terminates in an assigned external state, ie, an RS state in state A, and in a subsequent traverse of the function, the function releases the same external, ie, an RS state in state K. When the process ends, the complex RS state of the escalator becomes state E. This can be considered an error. This is because, in general, it is required to allocate resources associated with one external in the execution when there is a calling function, and to release resources associated with the same external in other cases. It is because it cannot be considered.
コンピュータプログラムの解析
コンピュータプログラム610(第6図)の解析は、本発明に基づいて、本明細書中に説明するように、コンピュータプログラム610によって定められたリソースの使用を解析するリソースチェッカ(resourcechecker)602によってなされる。開示する実施例では、リソースチェッカ602は、バス108を介してCPU102に接続されたメモリ104から読み出されてCPU102において実行されるコンピュータプロセスである。
Computer Program Analysis The analysis of the computer program 610 (FIG. 6) is based on the present invention, as described herein, a resource checker that analyzes the use of resources defined by the
コンピュータプログラム610の本発明に基づく解析を、論理流れ図900(第9図)に示す。プロセスはステップ902において開始される。例えばキーボード124(第1図)やマウス122を用いてユーザが入力するコマンドによって、コンピュータプログラム610が解析される環境特性が特定され、コンピュータプログラム610(第6図)の解析が開始される。ユーザによって変更可能な環境特性には、(i)検出するべきエラーのタイプ、(ii)通知するべきエラーの最大数、(iii)解析するべき関数の最大数、(iv)各関数のトラバースの繰り返しの最大回数、及び(v)関数の全ての可能な制御流れ経路をトラバースするための特定の方法などがある。
The analysis of
プロセスは、ステップ902(第9図)からステップ904に進み、そこでリソースチェッカ602(第6図)は、コンピュータプログラムによって使用される様々な関数の実行がリソースに与える影響を記述する関数モデルを初期化する。リソースチェッカ602はモデルパーザ702(第7図)を含んでおり、モデルパーザ702は、モデル記述ファイル604(第6図)からモデルを読み出し、読み出したモデルから後述する関数モデル構造体を構築する。リソースチェッカ602において関数モデル構造体を生成することによって、関数モデルが初期化される。
The process proceeds from step 902 (FIG. 9) to step 904, where the resource checker 602 (FIG. 6) initializes a function model that describes the effect of the execution of various functions used by the computer program on the resource. Turn into. The
ステップ904(第9図)については、後に論理流れ図904(第10図)を参照してより詳細に説明する。 Step 904 (FIG. 9) will be described in more detail later with reference to logic flow diagram 904 (FIG. 10).
プロセスはステップ904(第9図)からステップ906に進み、そこでリソースチェッカ602の一部であるプログラムパーザ704(第7図)は、コンピュータプログラム610(第6図)を読み出してきて、従来の技術を用いて、コンピュータプログラム610が従う言語に基づきパージング(parsing)を行う。プログラムパーザ704(第7図)はコンピュータプログラム610(第6図)をパージングして、より小さなプログラムコンポーネント、例えば関数、に分解する。ステップ906(第9図)では、1つの関数がコンピュータプログラム610(第6図)からパージングにより抽出され、抽出されたその関数を表す関数構造体が、後に詳述する動的検査エンジン(dynamic inspection engine)706に送られる。別の実施例では、後述するプリプロセッサがコンピュータプログラム610をパージングし、パージングにより抽出されたコンピュータプログラム610内の複数の関数を表現する複数の関数構造体が格納される。この別の実施例では、プログラムパーザ704は関数構造体を一つ取り出しては、取り出した関数構造体を動的検査エンジン706に送る働きをする。プロセスはステップ906(第9図)からステップ908に進む。
The process proceeds from step 904 (FIG. 9) to step 906, where the program parser 704 (FIG. 7), which is part of the
ステップ908において、リソースチェッカ602の一部である動的検査エンジン706(第7図)によって、“サブジェクト関数(subjectfunction)”、即ちステップ906(第9図)においてプログラムパーザ704によって動的検査エンジン706に送られた関数構造体によって表される関数、の解析がなされる。言い換えると、サブジェクト関数の実行の結果コンピュータプログラム610によって使用されるリソースに生じる効果が求められ、サブジェクト関数の実行によって影響される各リソースの状態遷移が解析される。これについては後により詳細に説明する。ステップ904において初期化された関数モデルが、サブジェクト関数のエクスターナル、リソースの状態及び状態遷移を解析するのに用いられる。検出された状態違反はプログミングエラーとして通知される。
In
サブジェクト関数の挙動が、そのエクスターナル及びリソースに関して定められると、モデルパーザ702はモデル記述ファイル604内にサブジェクト関数の挙動を記述する関数モデルを形成し格納する。ステップ908(第9図)については、論理流れ図908(第24図)を参照して後により詳細に説明する。
When the behavior of the subject function is defined with respect to its externals and resources, the
プロセスは、ステップ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図)。
The process proceeds from step 908 (FIG. 9) to test
モデルの初期化
論理流れ図900のステップ904(第9図)を参照して上述したように、関数の挙動を記述する関数モデルは初期化される。ステップ904を、論理流れ図904(第10図)に詳細に示す。プロセスはステップ1002において開始され、上述したような関数モデルを含むモデル記述ファイル604(第6図)が開かれる。
Model Initialization As described above with reference to step 904 (FIG. 9) of logic flow diagram 900, the function model describing the behavior of the function is initialized. Step 904 is shown in detail in logic flow diagram 904 (FIG. 10). The process begins at
一実施例では、関数モデルはテキスト形式で格納され、読み込まれ、そしてメモリ104(第1図)内の後に詳述するデータ構造内に格納される。関数モデルは、関数を識別する情報と、関数のエクスターナルに対するエクスターナルモデルのシングルリンクトリスト(singly−linkedlist)とを含む。関数を識別する情報には(i)関数名、(ii)関数が定義されているソースコードファイルの名前、(iii)関数の定義が始まるソースコードファイル中のテキストラインの番号、及び(iv)関数の簡単な説明が含まれる。ソースコードファイルは、メモリ104(第1図)(通常、磁気ディスクのような二次記憶装置)に格納された、コンピュータプログラム610のようなコンピュータプログラムを格納するファイルである。シングルリンクトリストの形態で格納されたエクスターナルモデルは、関数の実行が関数のエクスターナルに与える影響を、これらのエクスターナルに施される演算と、それらのエクスターナルに関連して生成されるリソースとに関して定めるものである。
In one embodiment, the function model is stored in text form, read and stored in a data structure detailed later in memory 104 (FIG. 1). The function model includes information identifying the function and a single-linked list of external models relative to the external of the function. Information identifying the function includes (i) the function name, (ii) the name of the source code file in which the function is defined, (iii) the number of the text line in the source code file where the function definition begins, and (iv) Contains a brief description of the function. The source code file is a file for storing a computer program such as the
エクスターナルモデルは、エクスターナルの型を特定する情報、エクスターナルを識別する情報、及び関数の実行がエクスターナルに与える影響を定める情報を含む。エクスターナルを識別する情報は、エクスターナルがパラメータの場合はパラメータ番号(parameter number)、エクスターナルがグローバルまたはスタティック変数の場合は変数名、エクスターナルが戻り値項目である場合はNULLである。関数の実行がエクスターナルに与える影響を定める情報には、(i)エクスターナルに施される演算のリスト、(ii)エクスターナルに関連して新たなリソースが生成されるかどうかを示すフラグ、及び(iii)新たなリソースが生成される場合、その新たなリソースの初期状態が含まれる。 The external model includes information that identifies the type of external, information that identifies the external, and information that defines the effect of function execution on the external. The information for identifying the external is a parameter number when the external is a parameter, a variable name when the external is a global or static variable, and NULL when the external is a return value item. Information defining the effect of function execution on the external includes (i) a list of operations performed on the external, (ii) a flag indicating whether a new resource is generated in relation to the external, and (iii) When a new resource is created, the initial state of the new resource is included.
モデル記述ファイル604(第6図)に格納されているモデルのテキスト書式は、以下の“Backus−Naur Form(BNF)”定義(8)に従う。“Backus−Naur Form”は形式的言語を記述するためのよく知られた書式である。 The text format of the model stored in the model description file 604 (FIG. 6) conforms to the following “Backus-Nour Form (BNF)” definition (8). “Backus-Nour Form” is a well-known format for describing formal languages.
関数モデルは、テキスト書式においては、BNF定義(8)のノンターミナル<function−spec>によって表される。BNFにおいて、ターミナル(terminal)とは、ある特定のBNF定義においてそれ以上拡張されない項目であり、一方ノンターミナル(non−terminal)とは更に拡張される項目である。ターミナル<function−name>は、関数に割り当てられる識別予、即ち関数モデルによって表された関数を他の関数が呼び出すとき使用する識別子である。ターミナル<function−name>は、関数の定義に使われるコンピュータ言語において有効な関数識別子であればどのようなものでもよい。ターミナル<defining−file>は、関数の定義がなされるソースコードファイルを英数字で識別するものである。このような英数字による識別として、例えばソースコードファイルのパスを記述してもよい。ターミナル<defining−line>は、負でない数字、即ち0乃至9の数字を用いたテキスト表現によって、ターミナル<defining−file>によって識別されるソースコードファイルのどのテキストラインにおいてモデル化される関数の定義が始まるのかを特定するものである。 In the text format, the function model is represented by a non-terminal <function-spec> of the BNF definition (8). In BNF, a terminal is an item that is not further expanded in a specific BNF definition, while a non-terminal is an item that is further expanded. The terminal <function-name> is an identifier to be used when another function calls a function to be identified, that is, a function represented by a function model. The terminal <function-name> may be any function identifier that is valid in the computer language used to define the function. The terminal <defining-file> identifies the source code file in which the function is defined with alphanumeric characters. As such alphanumeric identification, for example, the path of the source code file may be described. The terminal <defining-line> is a definition of a function that is modeled in any text line of the source code file identified by the terminal <defining-file> by means of a text representation using non-negative digits, i.e. digits 0-9. It is to specify whether or not.
BNFでは、オプション項目は、角型括弧(“[]”)で囲って表される。従って、ターミナル<function−prefix>、ターミナル<defining−file>、<defining−line>、及び<description>は、オプションである。また、連続したスラッシュ記号(“//”)はコメント文の開始を表すものであり、これらのスラッシュ、及びこれらのスラッシュの後にそのテキストラインの最後まで続くテキスト文は、BNF定義の一部とはみなされないことに注意されたい。 In BNF, an option item is represented by being enclosed in square brackets (“[]”). Accordingly, the terminals <function-prefix>, terminals <defining-file>, <defining-line>, and <description> are optional. A series of slash symbols (“//”) indicates the start of a comment sentence, and these slashes and the text sentence that continues to the end of the text line after these slashes are part of the BNF definition. Note that is not considered.
BNF定義(8)のターミナル<description>は、1または複数のキャラクタ(即ち、文字、数字、及び/またはシンボル)の並びである。ターミナル<description>はリソースチェッカ602(第6図)によっては使用されないが、テキスト書式で表されたモデルを読むユーザの便宜及び理解のために提供されるものである。BNF定義(8)のターミナル<param−number>は、0乃至9の数字を用いた負でない整数のテキスト表現であり、パラメータリスト中の特定のパラメータを指定するものである。パラメータゼロが、関数の呼び出しにおけるパラメータリストの中の最初の、即ち最も左側のパラメータである。後続のパラメータには順番に番号が付される。BNF定義(8)のターミナル<var−name>は、変数の識別子である。 The terminal <description> in the BNF definition (8) is a sequence of one or more characters (ie, letters, numbers, and / or symbols). The terminal <description> is not used by the resource checker 602 (FIG. 6), but is provided for the convenience and understanding of the user who reads the model expressed in the text format. The terminal <param-number> in the BNF definition (8) is a text expression of a non-negative integer using numbers from 0 to 9, and designates a specific parameter in the parameter list. Parameter zero is the first or leftmost parameter in the parameter list in the function call. Subsequent parameters are numbered sequentially. The terminal <var-name> in the BNF definition (8) is a variable identifier.
モデル記述ファイル604(第6図)から抽出される関数モデルは、それぞれ、各関数の実行がその関数のエクスターナルに及ぼす影響を記述する。プロセスはステップ1002(第10図)からループステップ1004に進み、モデル記述ファイル604(第6図)に格納されている各関数モデルは、ループステップ1004(第10図)とNEXTステップ1004とによって定められるループに従って取り出され処理される。ループの各繰り返しにおいて、処理されている関数モデルは、現関数モデル(current function model)と呼ばれる。ループステップ1004とNEXTステップ1014とによって定められるループに従って、モデル記述ファイル中に格納された全ての関数モデルの処理が完了すると、プロセスはループステップ1004からステップ1006に進み、モデル記述ファイル604(第6図)は閉じられ、論理流れ図904(第10図)に基づくプロセスは終了する。
Each function model extracted from the model description file 604 (FIG. 6) describes the effect of execution of each function on the external of the function. The process proceeds from step 1002 (FIG. 10) to
モデル記述ファイルから取り出される各関数モデルに対し、プロセスはループステップ1004からステップ1008に進み、そこで上述したBNF定義(8)のノンターミナル<function−prefix>に対応する現関数モデルの一部が、現関数モデルから分離される。プロセスはステップ1010に進み、そこで関数モデル構造体が初期化されて、ステップ1008において現関数モデルから分離された情報が関数モデル構造体に格納される。
For each function model retrieved from the model description file, the process proceeds from
関数モデル構造体1100(第11図)は、フィールド“name”1102、フィールド“file”1110、フィールド“line”1112、及びフィールド“description”1108を含んでいる。BNF定義(8)のターミナル<function−name>、<defining−file>、<defining−line>、及び<description>(これらは全てノンターミナル<function−prefix>の部分である)に対応する関数モデルの部分が関数モデルから抽出され、関数モデル構造体1100のフィールド“name”1102、フィールド“file”1110、フィールド“line”1112、及びフィールド“description”1108にそれぞれ格納される。プロセスはステップ1010(第10図)からループステップ1012に進む。
The function model structure 1100 (FIG. 11) includes a field “name” 1102, a field “file” 1110, a field “line” 1112, and a field “description” 1108. Function model corresponding to terminals <function-name>, <defining-file>, <defining-line>, and <description> of BNF definition (8) (all of which are part of non-terminal <function-prefix>) Are extracted from the function model and stored in a field “name” 1102, a field “file” 1110, a field “line” 1112, and a field “description” 1108 of the
ループステップ1012とNEXTステップ1028とによってループが定められており、その各繰返しにおいて、上述したBNF定義(8)のノンターミナル<extern−list>に対応する関数モデルの部分に示されたエクスターナルの処理がなされる。ループステップ1012とNEXTステップ1028とによって定められたループの各繰返しにおいて処理されているエクスターナルは、サブジェクトエクスターナルと呼ばれる。現関数モデル中に定められた全エクスターナルの処理がループステップ1012とNEXTステップ1028とによって定められたループに従って終了すると、プロセスはループステップ1012からNEXTステップ1014へ進む。プロセスはNEXTステップ1014からループステップ1004へと進み、モデル記述ファイル604(第6図)から取り出された別の関数モデルが更に処理されるか、あるいは全ての関数モデルが処理されている場合は、上述したように、プロセスはステップ1006(第10図)へと進む。
The loop is defined by the
BNF定義(8)のノンターミナル<extern−Iist>に対応する現関数モデルの部分に示された各エクスターナルに対し、プロセスはループステップ1012からステップ1016へと進む。ステップ1016では、例えばエクスターナルモデル構造体1200(第12図)のような、新たなエクスターナルモデル構造体が生成される。
For each external indicated in the part of the current function model corresponding to the non-terminal <extern-Iist> of the BNF definition (8), the process proceeds from
エクスターナルモデル構造体1200は、フィールド“equivalent”1202、フィールド“type”1204、フィールド“parameter number”1206、フィールド“name”1208、フィールド“next”1210、フィールド“number of operations”1212、フィールド“operations”1214、フィールド“new resource”1218、フィールド“initial state”1220、及びフィールド“description”1222を含んでいる。ステップ1016(第10図)では、BNF定義(8)のノンターミナル<external>の定義内のターミナル<param−number>に対応するサブジェクトエクスターナルモデルの部分が、サブジェクトエクスターナルモデルから取り出され、エクスターナルモデル構造体1200のフィールド“parameter number”1206(第12図)に格納される。
The
一実施例では、フィールド“equivalent”1202が用いられて、第2のエクスターナルモデル構造体が特定される。そうすることによって、エクスターナルモデル構造体1200が、第2のエクスターナルモデル構造体に関係付けられる。例えば、関数の戻り値項目が第1パラメータである場合、そのようにすることが適切であろう。本明細書中に開示する実施例では、フィールド“equivalent”1202は使用されず、従ってこのフィールドはNULL値に初期化される。ステップ1016(第10図)から、プロセスはステップ1018へと進む。
In one embodiment, the field “equivalent” 1202 is used to identify a second external model structure. By doing so, the
ステップ1018では、サブジェクトエクスターナルモデルによって表されたエクスターナルの型を定める、BNF定義(8)のノンターミナル<extern−type>に対応するサブジェクトエクスターナルモデルの部分が、サブジェクトエクスターナルモデルから抽出される。上記のBNF定義(8)に示されているように、エクスターナルモデルによって表されるエクスターナルは、戻り値項目、パラメータ、あるいはグローバル定義/スタティック変数であり得る。
In
サブジェクトエクスターナルモデルによって表されたエクスターナルの型を示すデータは、エクスターナルモデル構造体1200のフィールド“type”1204(第12図)に格納される。プロセスはステップ1018(第10図)からループステップ1020へと進む。
Data indicating the type of the external represented by the subject external model is stored in the field “type” 1204 (FIG. 12) of the
上記のBNF定義(8)に示されているように、関数の実行は、その関数の各エクスターナルに1または複数の影響または“結果(result)”を与え得る。各結果はBNF定義(8)においてノンターミナル<result>として表される。1または複数の結果がノンターミナル<result−list>に含まれる。ループステップ1020とNEXTステップ1024とによって定められるループにおいて、サブジェクトエクスターナルモデルのノンターミナル<result−list>のリスト内の各結果の処理がなされる。ループステップ1020とNEXTステップ1024とによって定められるループの繰返しにおいて、処理されている結果を、処理対象結果(subject result)と呼ぶ。以下に述べるように、サブジェクトエクスターナルモデルの全ての結果をループステップ1020とNEXTステップ1024とによって定められるループに基づいて処理すると、プロセスはループステップ1020からステップ1026へ進む。
As shown in the BNF definition (8) above, execution of a function may have one or more effects or “results” on each external of the function. Each result is represented as non-terminal <result> in the BNF definition (8). One or more results are included in the non-terminal <result-list>. In the loop defined by the
サブジェクトエクスターナルモデルに対する各結果に対し、プロセスはループステップ1020からステップ1022に進む。ステップ1022において、処理対象結果がサブジェクトエクスターナルモデルから抽出される。この結果は、エクスターナルモデル構造体1200(第12図)のようなエクスターナルモデル構造体に格納される。例えば、上記で定義した関数モデル(3)は、第1エクスターナル、即ち戻り値項目に対し1つの結果を、第2エクスターナル、即ちパラメータ0に対し1つの結果を定めている。戻り値項目の結果は‘(new Q“memory”)’と定められており、戻り値項目に対し新たなリソースが生成されること、そのリソースの初期状態は状態Qであることが示され、更に、そのリソースの簡単な説明として“memory(メモリ)”が与えられている。
For each result for the subject external model, the process proceeds from
従って、この戻り値項目に対するエクスターナルモデルをエクスターナルモデル構造体1200が表現する場合、(i)フィールド“new resource”1218が“true”のブール値に設定され、新たなリソースが生成されることが示され、(ii)新たなリソースの初期状態が状態Qであることを示すようにフィールド“initial state”1220がセットされ、(iii)テキスト“memory“がフィールド“despription”1222に格納される。
Accordingly, when the
第2の例として、上記の関数モデル(3)は、第2エクスターナル、即ちパラメータ0に対して結果“(op c)”を定めている。結果“(op c)”は、エクスターナルに演算Cが施されることを表す。従って、エクスターナルモデル構造体1200がパラメータ0に対するエクスターナルモデルを表す場合、初期値として0を有するフィールド“number of operations”1212がインクリメント(1増加)され、演算識別子“c”が、フィールド“number of operations”1212によって示される位置に対応するフィールド“operations”1214に格納される。この例では、フィールド“number of operations”1212は値1を格納し、フィールド“operations”1214内の最初の演算識別子は演算cの識別子となる。もし、第2の演算が第2のエクスターナルに施されるとすると、フィールド“number of operations”1212はもう一度インクリメントされ値2となり、フィールド“operations”1214内の第2の演算識別子が第2の演算の識別子となる。
As a second example, the function model (3) defines a result “(op c)” for the second external, ie,
プロセスはステップ1022(第10図)からNEXTステップ1024を介して上述したループステップ1020へ戻る。上述したようにプロセスは、サブジェクトエクスターナルモデルに対する全ての結果の処理が終了すると、ループステップ1020からステップ1026に進む。
The process returns from step 1022 (FIG. 10) via
ステップ1026では、サブジェクトエクスターナルモデルを表すエクスターナルモデル構造体が、現関数モデル構造体内のエクスターナルのシングルリンクトリストに加えられる。上記の関数モデル(3)の文脈において説明する。まず、関数モデル構造体1100Aのフィールド“first external”1004A及び“last external”1106Aにエクスターナルモデル構造体1200Aを指定するポインタを格納することによって、エクスターナルモデル構造体1200A(第13図)が関数モデル構造体1100Aに付け加えられる。続いて、エクスターナルモデル構造体1200Aのフィールド“next”1210A及び関数モデル構造体1100Aのフィールド“last external”1106Aに、第13図に示すようにエクスターナルモデル構造体1200Bを指すポインタを格納する(フィールド“last external”1106Aに前に格納されたポインタは取って代わられる)ことによって、第2エクスターナルモデル構造体1200Bが関数モデル構造体1100Aに加えられる。
In
プロセスはステップ1026(第10図)からNEXTステップ1028を介してループステップ1012へと進む。上述したように、全エクスターナルモデルが処理されていると、プロセスはループステップ1012からNEXTステップ1014を介してループステップ1004へ進む。上述したように、全関数モデルの処理が終了していると、プロセスはループステップ1004からステップ1006へ進み、上述したようにテキストフォーマットで記載された関数モデルを含むファイルが閉じられる。論理流れ図904に基づくプロセスは、ステップ1006の後終了する。
The process proceeds from step 1026 (FIG. 10) through
関数の内部表現
プログラムパーザ704(第7図)によってコンピュータプログラム610(第6図)のパージングがなされると、コンピュータプログラム610はメモリ104において一連の関数構造体によって表される。上述した別の実施例では、プログラムパーザ704は、コンピュータプログラム610から、例えばC言語のような特定のコンピュータ言語に従うソースコンピュータプログラムを予めパージングすることによって形成された関数構造体を取り出す働きをする。ソースコンピュータプログラムはソースコードプリプロセッサによってパージングされるが、このソースコードプリプロセッサは、ソースコンピュータプログラムが従うコンピュータ言語に基づいてソースコンピュータプログラムのパージングを行い、コンピュータプログラム610中にソースコンピュータプログラム内に定義された関数を表す関数構造体を形成し格納するものである。このソースコードプリプロセッサ(図示せず)はリソースチェッカ602とは別個のコンピュータプロセスである。
When the computer program 610 (FIG. 6) is parsed by the function internal representation program parser 704 (FIG. 7), the
この別の実施例では、ソースコードプリプロセッサはマサチューセッツ州、ケンブリッジ(Cambridge,Massachusetts)の“Free Software Foundation,Inc”から入手可能な“GNU C Compiler”に基づくものである。本明細書の一部であり、全体が本出願に引証として含まれる付録Bとして示されているコンピュータ命令のリストは、抽出されたコンピュータプログラムの関数を、ソースコードプロセッサから、抽出された関数を表すための後に詳述するデータ構造へと移すためのデータ構造及び関数を定義したものである。一実施例では、公知の上記した“GNU C Compiler”のような従来のコンパイラが用いられてコンピュータプログラムのパージングがなされ、パージングされたプログラムは、付録Bに定義されているようなデータ構造中に表される。 In this alternative embodiment, the source code preprocessor is based on the “GNU C Compiler” available from “Free Software Foundation, Inc” of Cambridge, Massachusetts. The list of computer instructions that are part of this specification and shown in Appendix B, which is hereby incorporated by reference in its entirety, shows the extracted computer program functions from the source code processor. It defines a data structure and a function for moving to a data structure described in detail later for representation. In one embodiment, a conventional compiler, such as the known “GNU C Compiler” described above, is used to parse the computer program, and the parsed program is stored in a data structure as defined in Appendix B. expressed.
以下に、関数構造体について説明する。関数構造体内のフィールド及び関係について理解を深めることによって、以下の動的検査エンジン706(第7図)の処理に対する説明がより容易となる。 The function structure will be described below. A better understanding of the fields and relationships within the function structure will make it easier to explain the processing of the dynamic inspection engine 706 (FIG. 7) below.
関数構造体1400(第14図)は、コンピュータプログラム610、または上述したような別の実施例ではソースコードプログラム、によって定められた関数を表すものであり、(i)フィールド“name“1402、(ii)フィールド“line”1404、(iii)フィールド“file”1406、(iv)フィールド“result”1408、(v)フィールド“externals”1410及び(vi)フィールド“statement”を含んでいる。関数構造体1400のフィールド“name”1402は、関数構造体1400によって表される関数の識別予を特定する。例えば、上記のソースコード抜粋(1)の関数example 1 () の識別子は“example 1”である。
The function structure 1400 (FIG. 14) represents a function defined by a
フィールド“file”1406及びフィールド“line”1404は、それぞれ、関数構造体1400によって表される関数が定義されるソースコードファイル及びそのファイル内のライン番号を示す。例えば、上記のソースコード抜粋(1)が、ファイル名“example 1.c”のソースコードファイルの全内容であるとした場合、関数example 1 () を表す関数構造体のフィールド“file”1406及びフィールド“line”1404は、それぞれ、テキスト“example 1.c”及び整数値7のデータを格納する。
A field “file” 1406 and a field “line” 1404 indicate a source code file in which a function represented by the
フィールド“result”1408は、宣言構造体1418を指定する。この宣言構造体1418は、以下に述べる宣言構造体1506と同様であり、関数構造体1400によって表される関数がリターンする結果(result)の型を規定する。例えば、上記のソースコード抜粋(1)の関数example 1 () は、ソースコード抜粋(1)のライン7に示されているように、整数型の結果をリターンする。即ち、型“int”のデータをリターンする。従って、関数構造体1400が関数example 1 () を表す場合、フィールド“result”1408は、整数データを規定する宣言構造体1418を指定する。
A field “result” 1408 specifies a
関数構造体1400のフィールド“externals”1410は、後により詳細に説明するエクスターナルリスト構造体1414を指定するポインタである。後に詳述するように、エクスターナルリスト構造体1414のようなエクスターナルリスト構造体は、複数のエクスターナルリスト構造体をシングルリンクトリスト(singly−linked list)を形成するようにリンクするのに用いられるポインタを含んでいる。従って、リストの長さが1の場合も含み、一つのエクスターナルリスト構造体を指定することは、エクスターナルリスト構造体のシングルリンクトリストを指定することである。関数構造体1400のフィールド“externals”1410によって指定されるこのようなシングルリンクトリストは、関数構造体1400によって表される関数のエクスターナルを表すエクスターナルリスト構造体を含む。
A field “externals” 1410 of the
関数構造体1400のフィールド“first stmt”1412は、後により詳細に説明するステートメント構造体1416を指定するポインタである。後により詳細に説明するように、ステートメント構造体1416のようなステートメント構造体は、複数のステートメント構造体をシングルリンクトリストを形成するようにリンクするのに用いられるポインタを含んでいる。従って、リストの長さが1の場合も含み、一つのステートメント構造体を指定することは、ステートメント構造体のシングルリンクトリストを指定することである。関数構造体1400のフィールド“first stmt”1412によって指定されるこのようなシングルリンクトリストは、関数構造体1400によって表される関数のステートメントを表すステートメント構造体を含む。
Field “first” of
エクスターナルリスト構造体
エクスターナルリスト構造体1414を第15図に詳細に示す。エクスターナルリスト構造体1414は、関数構造体1400(第14図)によって表される関数のエクスターナルを表すものであり、フィールド“first decl”1502(第15図)、フィールド“next”1504、及びフィールド“first external”1510を含んでいる。フィールド“first decl”1502は、後により詳細に説明するように、エクスターナルリスト構造体1414によって表されるエクスターナルのデータ型を規定する宣言構造体1506を指定するポインタである。フィールド“next”1504は、エクスターナルのシングルリンクトリストにおいてエクスターナルリスト構造体1414のすぐ後にエクスターナルリスト構造体1508が続く場合、エクスターナルリスト構造体1508を指定するポインタである。エクスターナルリスト構造体のシングルリンクトリストにおいてエクスターナルリスト構造体1414に続くエクスターナルリスト構造体がない場合、エクスターナルリスト構造体1414のフィールド“next”1504はNULLとなる。即ち、NULLデータを含む。フィールド“first external”1510は、後により詳細に説明するように、エクスターナルリスト構造体1414によって表されるエクスターナルの状態を示すエクスターナル状態構造体(図示せず)を指定するポインタである。
External List Structure The
宣言構造体
宣言構造体1506を第16図に詳細に示す。宣言構造体は、宣言される変数または関数、即ち宣言において規定される変数または関数を規定する構造体である。C言語の文脈中の宣言については周知であり、Cスタンダードにも示されている。宣言構造体1506は、フィールド“kind”1602、フィールド“name”1604、フィールド“type”1606、フィールド“item”1608、及びフィールド“model”1610を含んでいる。
The declaration
フィールド“kind”1602は、宣言される項目または関数が、グローバルに定義されるものであるか、スタティックなものであるか、あるいはローカルに定義されるものであるかを示すデータを含む。フィールド“name”1604は、項目または関数の識別子を特定するテキストデータを含む。上述したように、C言語の文脈において、項目または関数はテキスト形式の識別子によって識別され、識別子はCスタンダードのセクション6.1.2に述べられているような所定の書式に従わなければならない。 The field “kind” 1602 contains data indicating whether the item or function being declared is globally defined, static, or locally defined. The field “name” 1604 includes text data that identifies the identifier of the item or function. As mentioned above, in the C language context, an item or function is identified by a textual identifier, which must follow a predetermined format as described in section 6.1.2 of the C standard.
宣言構造体1506のフィールド“type”1606は、宣言される項目または関数によって表されるデータの特定の型を定める型構造体1612を指定するポインタである。型構造体1612については、後で説明する。フィールド“item”1608は、宣言される項目を表す項目構造体2700を指定するポインタである。宣言構造体1506が宣言される関数を表現する場合、フィールド“item”1608はNULLであり、従って項目構造体は指定されない。
A field “type” 1606 of the
宣言構造体1506のフィールド“model”1610は、宣言構造体1506が関数の宣言を表し、その関数のモデルが関数モデル構造体1100によって表される場合、関数モデル構造体1100を指定するポインタである。宣言構造体1506が関数の宣言を表さない場合、フィールド“model”1610はNULLであり、即ち、NULLデータを含む。従って関数モデル構造体は指定されない。また、宣言構造体1506が関数の宣言を表すが、その関数の関数モデル構造体が存在しない場合も、フィールド“model”1610はNULLとなる。
A field “model” 1610 of the
型構造体
第17図に型構造体1612を詳細に示す。型構造体1612のような型構造体は、整数、浮動小数点、英数文字、及び構造体のようなユーザ定義による型、のような特定のデータ型を規定する。型構造体1612は、フィールド“kind”702、フィールド“name”1704、フィールド“size”1706、フィールド“points to”1708、及びフィールド“fields”1710を含んでいる。フィールド“kind”1702は、型構造体1612によって表される型が、整数、実数(即ち浮動小数点数値データ)、ポインタ、配列、構造体(即ち、C言語に対しデータ型“struct”で定義されたもの)、あるいはユニオン(union)のいずれであるか特定するデータを含む。これらの各型は公知であり、Cスタンダードのセクション6.1.2.5及び6.5以降に述べられている。
Mold Structure FIG. 17 shows the
型構造体1612のフィールド“name”1704は、型構造体1612によって表される型がユーザ定義されるものである場合、その型の識別子を特定する英数字データを含む。型構造体1612によって表される型がC言語によって予め定められたものである場合、フィールド“name”1704はNULLである。
The field “name” 1704 of the
フィールド“size”1706は、型構造体1612によって表される型のサイズを規定する。型が配列でない場合、フィールド“size”1706は、型構造体1612によって表される型の項目に含まれるデータのビット数を示す。例えば、型が32ビット整数の場合、型構造体1612のフィールド“size”1706は値32を示す。型が配列の場合、フィールド“size”1706は配列全体に含まれるデータのビット数、即ちその配列のエレメントによって表されるその型の項目に含まれるデータのビット数にその配列全体に含まれるエレメントの数を掛けたものを表す。例えば、宣言“int array[10];”によって、10個のエレメントからなる配列が宣言されるとする。型“int”が32ビット整数の場合、宣言された配列のサイズは、10エレメント×32ビットとなる。従って、その配列のサイズは320ビットとなる。
The field “size” 1706 defines the size of the type represented by the
構造体1612によって表される型が別のデータ型を指定するポインタの場合、フィールド“points to”1708は別のデータ型を表す型構造体、即ち型構造体1712を指定するポインタである。型構造体1712は型構造体1612と同様である。逆に、型構造体1612によって表される型がポインタでない場合、フィールド“points to”1708はNULLとなる。
If the type represented by the
型構造体1612によって表される型が構造体型(即ちC言語の型“struct”)またはユニオン型の場合、フィールド“fields”1710は、それぞれ、その構造体型またはユニオン型の第1フィールドを表すフィールド構造体1714を指定するポインタとなる。後により詳細に説明するように、ある特定の構造体型またはユニオン型のフィールドに対応するフィールド構造体は、シングルリンクトリストを形成するようにリンクされる。型構造体1612によって表される型が構造体型でもユニオン型でもない場合、型構造体1612のフィールド“fields”1710はNULLとなる。
When the type represented by the
フィールド構造体
フィールド構造体1714を第18図に詳細に示す。フィールド構造体1714は、フィールド“name”1802、フィールド“size”1804、フィールド“offset”1806、及びフィールド“next”1808を含んでいる。フィールド構造体1714について、C言語に基づく以下の型定義の例の文脈において説明する。
The field
ソースコード抜粋(9)の型定義は、識別子が“point”であり2つのフィールドを有する構造体型を定義している。型“point”は従って構造体型である。各フィールドは型“int”であり、これは通常32ビット整数である。また、各フィールドは、識別子“x”または“y”を有している。 The type definition in the source code excerpt (9) defines a structure type having an identifier “point” and having two fields. The type “point” is thus a structure type. Each field is of type “int”, which is typically a 32-bit integer. Each field has an identifier “x” or “y”.
フィールド構造体1714のフィールド“name”1802は、フィールド構造体1714によって表されるフィールドの識別子を特定する英数字データを含む。例えば、ソースコード抜粋(9)に定義されている構造体の第1フィールドを表すフィールド構造体のフィールド“name”はテキスト“x”を含む。
Field “name” 1802 of
フィールド構造体1714のフィールド“size”1804は、フィールド構造体1714によって表されるフィールドに含まれるデータのビット数を示す。例えば、カリフォルニア州、マウンテンビュー(Mountain View)のサンマイクロシステムズ社(Sun Microsystems,Inc.)から販売されている“SunOS C compiler”によってコンパイルされるようなC言語の典型的な例では、型“int”の項目は32ビット長さである。ソースコード抜粋(9)の例では、各フィールドは32ビット整数であり、従って32ビットのデータを含む。従って、個々のフィールドを表す各フィールド構造体のフィールド“size”は整数値32を示す。
A field “size” 1804 of the
フィールド構造体1714のフィールド“offset”は、フィールド構造体1714によって表されるフィールドのデータまでの構造体の開始からのオフセットを表す。例えば、ソースコード抜粋(9)におけるフィールド“x”は型“point”の第1フィールドであるため、オフセットは0である。
The field “offset” of the
型“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を示す。
The type “point” is shown schematically in FIG. Field “x” of type “point” is 32 bits long and starts at offset 0. Field “y” of type “point” is 32 bits long and starts at offset 32. Therefore, the field “offset” 1806X (FIG. 20) of the field structure 1714X (which is exactly the same as the field structure 1714 (FIG. 18) and represents the field “x” of the type “point”). ) Indicates the
フィールド構造体1714のフィールド“next”1808(第18図)は、所与の構造体型のフィールド構造体のシングルリンクトリストにおける次のフィールド構造体を指定するポインタである。例えば、型“point”を表す型構造体1612Pのフィールド“fields”1710P(第20図)は、型“point”の第1フィールドであるフィールド“X”を表すフィールド構造体1710Xを指定する。型“point”の次のフィールドはフィールド“Y”である。従って、フィールド構造体1714Xのフィールド“next”1808Xは、型“point”のフィールド“y”を表すフィールド構造体1714Yを指定する。型“point”のフィールド“y”は、型“point”の最後のフィールドであり、その後に型“point”の他のフィールドはない。
従って、フィールド構造体1714Yのフィールド“next”1810YはNULLである。
A field “next” 1808 (FIG. 18) of the
Therefore, the field “next” 1810Y of the
ステートメント構造体
上述したように、関数構造体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。
Statement Structure As described above, the field “first” of the
ステートメント構造体1416のフィールド“kind”2102は、ステートメント構造体1416によって表されるステートメントの種類を表す。フィールド“kind”2102は、以下のステートメント種類のうちの1つを特定する:エラー、宣言、式、ブロック、“if”、“else”、“return”、ループ、“switch”、“break”、“continue”、及び“goto”。ステートメント構造体によるこれらのステートメント種類の各々の表現について、以下により詳細に説明する。
The field “kind” 2102 of the
ステートメント構造体1416のフィールド“line”2104は、関数構造体1400(第14図)によって表される関数を定義するソースコードファイル内において、ステートメント構造体1416によって表されるステートメントが現れる、即ち、ステートメント構造体1416によって表されるステートメントを含むテキストラインを表す。ステートメントが現れるラインは、エラーを生じさせる特定のステートメントが、検出されたエラーの通知によってユーザに特定されるようにするため、ステートメント構造体1416内に保持される。
The field “line” 2104 of the
ステートメント構造体1416のフィールド“next”2106(第21図)は、ステートメントのブロックにおいてステートメント構造体1416によって表されるステートメントのすぐ後に続くステートメントを表す別のステートメント構造体2112を指定するポインタである。このようにして、ステートメントブロックの全ステートメントが、シングルリンクトリストを形成するようにリンクされたステートメント構造体によって表される。ステートメント構造体1416(第21図)によって表されるステートメントがステートメントブロックの最後のステートメントの場合、フィールド“next”2106はNULLとなり、他のステートメント構造体を指定しない。
The field “next” 2106 (FIG. 21) of the
ステートメント構造体1416のフィールド“flags”2108は符号なし32ビット整数であり、その個々のビットはステートメント構造体1416によって表されるステートメントに関連するエラーがユーザに通知されたかどうかを示すフラグとして用いられる。エラーが通知されるときにはいつも、通知されるべきエラーに対応するフィールド“flags”2108のフラグがチェックされる。フラグがセットされている場合、そのフラグはステートメント構造体1416によって表されるステートメントの文脈において既にそのエラーの通知がなされていることを表すため、エラーは通知されない。フラグがセットされていない場合は、エラーは通知され、エラーの通知を反映するようにフラグがセットされる。このようにして、各タイプのエラーは、ある特定のステートメントに対して1回だけ通知される。
The field “flags” 2108 of the
ステートメント構造体1416のフィールド“pointers”2110は、ステートメント構造体1416によって表されるステートメントの各部分を表す構造体を指定する1または複数のポインタの配列である。この配列中のポインタの数は、ステートメント構造体1416によって表されるステートメントの特定の種類に依存する。
The field “pointers” 2110 of the
エラー、“break”、及び“continue”ステートメントは部分を有さず、従ってステートメント構造体1416がエラー、“break”、あるいは“continue”ステートメントを表す場合、フィールド“pointers”2110はNULLである。エラーステートメントとは、C言語に従わないステートメントである。“break”及び“continue”ステートメントは周知であり、それぞれCスタンダードのセクション6.6.6.3及び6.6.6.2に説明されている。
The error, “break”, and “continue” statements have no part, so if the
宣言ステートメントには、特定の型のデータを有する宣言される変数が含まれ、更に恐らくはその変数に対する初期値も含まれる。従って、ステートメント構造体1416が宣言ステートメントを表す場合、フィールド“pointers”2110は2つのポインタからなる配列となる。第1のポインタは宣言される変数を表す宣言構造体を指定する。初期値が定められる場合、第2のポインタは、宣言される変数の初期値を与えるべく評価される式を表す式構造体を指定する。宣言される変数に対し初期値が定められない場合は、第2のポインタはNULLである。
A declaration statement includes a declared variable that has a particular type of data, and possibly also an initial value for that variable. Therefore, if the
式ステートメント(expression statement)とは、それ自身が式であるステートメントである。式(expression)はC言語の公知のコンポーネントであり、1または複数の項目、関数に対する呼び出し、及び演算子の集まりである。C言語では、全ての式は値(value)を有する。式の評価の結果は、値がその式の値であるような項目となり、この項目はしばしば式の項目と呼ばれる。本明細書中では、しばしば、式の項目の値を式の値と言う。式の評価については、以下により詳細に説明される。 An expression statement is a statement that is itself an expression. An expression is a known component of the C language, which is a collection of one or more items, calls to functions, and operators. In C language, every expression has a value. The result of evaluating an expression is an item whose value is that of the expression, and this item is often referred to as an expression item. In this specification, the value of an item of an expression is often referred to as an expression value. Expression evaluation is described in more detail below.
ステートメント構造体1416が式ステートメントを表す場合、フィールド“pointers”2110は、式構造体2200(第22図)のような式構造体を指定する1つのポインタからなる配列となる。式構造体2200は、フィールド“kind”2202、フィールド“type”2204、フィールド“item”2206、フィールド“num operands”2208、及びフィールド“operands”2210を含んでいる。フィールド“kind”2202は、式構造体2200によって表される式の種類を特定する。式が演算子を含む場合、フィールド“kind”2202はその演算子を示す。
When the
フィールド“type”2204は、式のデータ型、即ち、その式の評価の結果を示す項目の型を表す型構造体2212を指定するポインタである。型構造体2212は、上述した型構造体1612と同様である。式構造体2200のフィールド“item”2206は、式の評価の結果を示す項目を表す項目構造体2214を指定するポインタである。項目構造体2214は上述した項目構造体2700(第27図)と同様である。式構造体2200によって表された式の評価の前においては、フィールド“item”2206はNULLである。
A field “type” 2204 is a pointer that designates a
式構造体2200によって表される式の中のオペランドの数はフィールド“num operands”2208によって示される。フィールド“operands”2210は式構造体の配列であり、その各々は式構造体2200によって表される式の一つのオペランドを表す。この配列の長さは、フィールド“num operands”2208に示されたオペランドの数に等しい。C言語において定義される式の様々な型、及び各型の式のオペランドの数及び型については周知であり、Cスタンダードにも記載されている。
The number of operands in the expression represented by the
ブロックステートメントとは、1または複数のステートメントをグループにまとめたステートメントである。ブロックステートメントの実行は、1または複数のステートメントの実行である。ブロックステートメントは部分、即ち、1または複数のステートメントを有する。ステートメント構造体1416(第21図)がブロックステートメントを表す場合、フィールド“pointers”2110はシングルポインタであり、このポインタは1または複数のステートメントの最初のステートメントを表すステートメント構造体を指定する。1または複数のステートメントを表すステートメント構造体は、上述したようにフィールド“next”2106を用いることによってシングルリンクトリストを形成するようにリンクされる。 A block statement is a statement in which one or more statements are grouped together. Execution of a block statement is the execution of one or more statements. A block statement has parts, ie one or more statements. If the statement structure 1416 (FIG. 21) represents a block statement, the field “pointers” 2110 is a single pointer, which specifies the statement structure that represents the first statement of one or more statements. Statement structures representing one or more statements are linked to form a single linked list by using field “next” 2106 as described above.
“if”ステートメントは、“if”ステートメントの述語としばしば呼ばれる式を評価して、その評価の結果が“true”のブール値になる場合は、第2のステートメントを実行させるものである。ステートメント構造体1416が“if”ステートメントを表す場合、フィールド“pointers”2110は2つのポインタからなる配列となる。第1のポインタは、その値によって第2ステートメントが実行されるか否かが判定される式を表す式構造体を指定する。第2ポインタは、第2ステートメントを表すステートメント構造体を指定する。
The “if” statement evaluates an expression often referred to as a “if” statement predicate and causes the second statement to be executed if the result of the evaluation is a Boolean value of “true”. If the
“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”のブール値となる場合にのみ実行される。
The “else” statement is placed immediately after the “if” statement, and if the evaluation of the predicate of the “if” statement is a Boolean value of “false”, the third statement is executed. If the
“return”ステートメントは、被呼び出し関数の実行を終了させ、制御を呼び出し関数に移すとともに、場合によっては呼び出し関数に戻り値項目を与える。呼び出し関数に制御を移すとともに、呼び出し関数に戻り値項目を与えることは、呼び出し関数に戻り値項目をリターンすると言われる。ステートメント構造体1416が“return”ステートメントを表す場合、フィールド“pointers”2110はシングルポインタであり、このポインタは式構造体を指定するかまたはNULLである。このポインタが式構造体を指定する場合、その式構造体によって表される式の評価の結果を示す項目が呼び出し関数にリターンされる。
The “return” statement terminates execution of the called function, transfers control to the calling function, and optionally provides a return value item to the calling function. Giving control to the calling function and giving the calling function a return value item is said to return the return value item to the calling function. If the
ループステートメントは、0回または1回以上実行される第2ステートメントを生成するものである。C言語におけるループステートメントの例として、“for”ステートメント、“do”ステートメント、及び“while”ステートメントがあるが、それらはCスタンダードのセクション6.6.5に記載されており広く知られている。ステートメント構造体1416がループステートメントを表す場合、フィールド“pointers”2110はシングルポインタであり、第2ステートメントを表すステートメント構造体を指定する。
The loop statement generates a second statement that is executed zero or more times. Examples of loop statements in the C language are the “for” statement, the “do” statement, and the “while” statement, which are well known and described in section 6.6.5 of the C standard. If the
“switch”ステートメントは、式を評価し、式の評価の結果を示す値に応じてブロックステートメント内の制御をそのブロックステートメント内の特定のステートメントへ移す。式は、しばしば“switch”ステートメントの述語と呼ばれる。ステートメント構造体1416が“switch”ステートメントを表す場合、フィールド“pointers”2110は2つのポインタからなる配列となる。第1のポインタは、その値に応じて制御が移行する式を表す式構造体を指定する。第2のポインタは、ブロックステートメントを表すステートメント構造体を指定する。
A “switch” statement evaluates an expression and transfers control within a block statement to a specific statement within that block statement in response to a value indicating the result of the expression evaluation. Expressions are often referred to as “switch” statement predicates. If the
“goto”ステートメントは第2ステートメントへの制御の移行を発生させる。一実施例では、ステートメント構造体1416が“goto”ステートメントを表す場合、フィールド“pointers”2110は、第2ステートメントを表すステートメント構造体を指定するシングルポインタからなる配列である。より簡略化された実施例では、“goto”ステートメントは被呼び出しルーチンの実行を終了させるものとして取り扱われる。この実施例では“goto”ステートメントは部分を有さず、フィールド“pointers”2110はポインタを含まない配列である。
The “goto” statement causes a transfer of control to the second statement. In one embodiment, if the
このようにして、関数構造体1400(第14図)は動的検査エンジン706によって解析されるべき関数を表現する。
In this manner, the function structure 1400 (FIG. 14) represents a function to be analyzed by the
関数の解析
上述したように、動的検査エンジン706(第7図)は、ステップ908(第9図)においてコンピュータプログラム610(第6図)のパージングの結果得られた各関数構造体を解析する。ステップ908は論理流れ図908(第24図)に、より詳細に示されている。ステップ908の実行において、処理されている関数構造体はサブジェクト関数構造体と呼ばれる。同様に、サブジェクト関数構造体によって表される関数は、サブジェクト関数と呼ばれる。論理流れ図908のステップ2404及び2408において、サブジェクト関数は様々な仮定のもとで解析される。
Analysis of Function As described above, the dynamic inspection engine 706 (FIG. 7) analyzes each function structure obtained as a result of parsing the computer program 610 (FIG. 6) in step 908 (FIG. 9). . Step 908 is shown in more detail in logic flow diagram 908 (FIG. 24). In performing
上記において詳しく説明したように、ある特定の関数の制御流れ経路は、しばしばその関数が実行されるまでは未知であるイベントに依存する。実行後でも、その関数のある実行時に生じたイベントがその関数の全ての実行においても常に発生するとは限らない。そのため、制御の流れが未知のイベントに依存するような関数の解析は、それらの未知のイベントについての様々な仮定の下で繰り返しなされる。 As explained in detail above, the control flow path of a particular function often depends on events that are unknown until the function is executed. Even after execution, an event that occurs during the execution of the function does not always occur in all executions of the function. Therefore, the analysis of a function whose control flow depends on unknown events is repeated under various assumptions about those unknown events.
一実施例では、関数の全ての可能な制御流れが決定され解析される。例えば、制御は、関数内の全ての“if”ステートメントに対して2つの可能な経路の一方に沿って流れ得るし、また、関数内の全ての“switch”ステートメントに対して複数の可能な経路の内の1つに沿って流れ得る。“switch”ステートメントの場合、可能な経路の数は、その“switch”ステートメントに関連する“case”ステートメントの数に等しい。これには、存在する場合には、“default”ステートメントも含まれる。いったん関数の全ての可能な制御流れ経路が決定されると、その関数の各制御流れ経路が1回ずつ用いられるようにして、その関数は繰り返し解析される。このようにして、その関数の制御の流れに影響を与え得る全ての可能なイベントを考慮して関数の解析がなされる。 In one embodiment, all possible control flows of the function are determined and analyzed. For example, control may flow along one of two possible paths for all “if” statements in the function, and multiple possible paths for all “switch” statements in the function. Can flow along one of the In the case of a “switch” statement, the number of possible routes is equal to the number of “case” statements associated with that “switch” statement. This includes "default" statements, if present. Once all possible control flow paths of a function have been determined, the function is repeatedly analyzed so that each control flow path of the function is used once. In this way, the function is analyzed considering all possible events that can affect the control flow of the function.
より簡略化された実施例では、関数の特定の制御流れ経路がその関数内の各“if”ステートメント及び各“switch”ステートメントにおけるイベントに関してランダムな仮定を設定することによってランダムに選択される。関数は様々な制御流れ経路がランダムに選択されるようにして繰り返し解析される。関数を解析する回数は、関数の全ての可能な制御流れ経路が解析される可能性が十分高くなるように選択されるか、あるいは別の方法として1つのルーチンを解析するのに費やされる労力を制限するように選択することもできる。 In a more simplified embodiment, a particular control flow path of a function is randomly selected by setting random assumptions about the events in each “if” statement and each “switch” statement in the function. The function is iteratively analyzed with various control flow paths selected at random. The number of times the function is analyzed is chosen so that all possible control flow paths of the function are likely to be analyzed, or alternatively, the effort spent analyzing one routine. You can also choose to restrict.
ステップ2404及び2408(第24図)は、後者のより簡略化された方の実施例を例示したものである。ステップ2404において、サブジェクト関数が解析される回数が決定される。ステップ2404は、論理流れ図2404(第25図)としてより詳細に示されている。ステップ2502において、サブジェクト関数内で“if”ステートメントが使用される回数が決定される。詳述すると、実行エンジン802(第8図)によって、関数構造体1400のフィールド“first−statement”1412(第14図)により直接的または間接的に指定されたステートメント構造体のシングルリンクトリスト内の各ステートメント構造体のフィールド“kind”2102(第21図)が、“if”ステートメントを示すデータと比較される。ステートメント構造体のフィールド“kind”と“if”ステートメントを示すデータとが整合する回数が、“if”ステートメントがそのサブジェクト関数内で使用される回数として記録される。
ステップ2502から、プロセスはステップ2504に進み、そこでサブジェクト関数が解析される回数が決定される。一実施例では、サブジェクト関数が解析される回数は、“if”ステートメントがサブジェクト関数内で使用される回数に対応する。その例を表Mに示す。
From
ステップ2504の後、論理流れ図2404に基づくプロセス、従ってステップ2404(第24図)は、終了する。プロセスはステップ2404からステップ2408へ進み、サブジェクト関数は上述したステップ2404で決定された数だけ繰り返し解析される。ステップ2408の一回の繰返し、即ち、サブジェクト関数の1回の解析は、論理流れ図2600(第26図)に示される。
After
サブジェクト関数の1回の繰返しの解析は、ステップ2602で開始され、そこで、各エクスターナルに対するエクスターナル状態構造体が初期化される。エクスターナル状態構造体は、まずそのエクスターナル状態構造体に対応する、即ちそのエクスターナル状態構造体によって表される状態を有するエクスターナルに対応する項目構造体を生成し、続いてそのエクスターナルのDK及びCP状態を状態Oに設定することによって初期化される。項目構造体は、項目を表すメモリ104(第1図)内の構造体である。
Analysis of one iteration of the subject function begins at
項目構造体2700(第27図)は、以下のフィールドを含んでいる。
即ち、フィールド“resource”2702、フィールド“external”2704、フィールド“value”2706、フィールドfirst in bunch2708、フィールド“size of bunch”2710、フィールド“type code”2712、フィールド“initialized”2714、フィールド“head in bunch”2716、フィールド“known bunch size”2718、及びフィールド“invalid pointer”2720を含んでいる。
Item structure 2700 (FIG. 27) includes the following fields:
That is, field "resource" 2702, field "external" 2704, field "value" 2706, field first in
各項目は、リソース及び/若しくはエクスターナルに関連付けられ得る。項目構造体2700により表現される項目がリソースの1つと関連している場合、項目構造体2700のフィールド“resource”2702が、そのリソースを表現するリソース状態構造体を指定する。逆に、その項目がリソースと関連していない場合、フィールド“resource”2702は、そのことを示すべくNULLにされる。項目構造体2700により表現される項目がエクスターナルの1つと関連している場合、項目構造体2700のフィールド“external”2704が、そのエクスターナルを表現するエクスターナル状態構造体を指定する。逆に、その項目がエクスターナルと関連していない場合、フィールド“external”2704は、そのことを示すべくNULLにされる。
Each item may be associated with a resource and / or an external. If the item represented by the
項目構造体2700のフィールド“value”2706は、項目構造体2700によって表現される項目の実際の値を定めるデータを含んでいる。つまり、フィールド“value”2706に格納されたデータは、メモリ104(第1図)における、項目構造体2700(第27図)によって表現された項目によって指定された位置に格納された実際のデータを表現する。項目構造体2700のフィールド“type code”2712は、その項目のメモリ位置に格納されたデータの型を指定する。ここに開示する実施例において支援されているデータの型には、long、pointer、及びdoubleがある。最近のC言語の実装においては、“long”は32ビットの符号付き整数、“pointer”はメモリ104のようなメモリにおけるアドレスを指定する値、また、“double”は64ビットの浮動小数点である。フィールド“value”2706内には各データの型に対応するサブフィールドがある。使用されるのはただ1つのサブフィールドである。即ちフィールド“type code”2712で指定されたデータの型に対応するサブフィールドのみが使用される。
The field “value” 2706 of the
項目構造体2700のフィールド“initialized”2714は、項目構造体2700により表現されたその項目が初期化されているか否か、即ち項目構造体2700によって表現される項目が既知の値を有するか否かを示す。項目構造体2700のフィールド“invalid pointer”2720は、項目構造体2700によって表現される項目が無効ポインタであるか否かを示す。C言語においては、ポインタがメモリ104(第1図)における有効な位置を指定している場合、そのポインタは有効である。そうでない場合、そのポインタは無効である。NULLポインタは、C言語の多くの実装において0に選択される特定の無効ポインタである。一実施例においては、フィールド“initialized”2714及び“invalid pointer”2720は、それぞれ1つのビットよりなる。
The field “initialized” 2714 of the
フィールド“first in bunch”2708、“size of bunch”2710、“head in bunch”2712、及び“known bunch size”2718は、メモリの集群(bunch)を解析するのに用いられる。メモリの集群については、後に詳しく説明する。 Field "first" in “bunch” 2708, “size” of “bunch” 2710, “head” in Bunch ”2712 and“ known ” bunch The size “2718” is used to analyze a memory cluster. The memory cluster will be described in detail later.
ステップ2602(第26図)において、ひとたびこのサブジェクト関数のエクスターナルが初期化されると、処理はステップ2604に進む。ステップ2604において、サブジェクト関数の各ステートメントが評価される。ステートメントの評価は、そのステートメントの実行をエミュレートすることによって行われる。ステートメントの評価により、エクスターナル及び/若しくはリソースに対して施した演算の結果が得られ、エクスターナル及び/若しくはリソースのそれぞれの状態の変化が生ずる。後に詳しく説明するが、各ステートメントの評価は論理流れ図2800(第28図)に従って個別に行われる。
In step 2602 (FIG. 26), once the subject function external is initialized, the process proceeds to step 2604. In
ひとたびサブジェクト関数の各ステートメントが評価されると、処理はステップ2604(第26図)からステップ2606に進む。ステップ2606においてはサブジェクト関数の様々なリソースの状態のリーク(leak)がチェックされる。ステップ2606の詳細は論理流れ図2606(第41図)に示されており、これについては後に説明する。ステップ2606から処理はステップ2608に進み、ここでサブジェクト関数の各エクスターナルが更新される。エクスターナルの更新は、エクスターナルのDK及びCP状態、及びそのエクスターナルに関連付けられたリソースのRS状態に基づいて、エクスターナルの複合DK、CP、及びRS状態を更新することによって行われる。これらの状態はサブジェクト関数の現反復的解析(current iterative analysis)から得られる。1つのエクスターナルの更新は、論理流れ図4200(第42図)に示されており、後に完全に説明する。
Once each statement of the subject function is evaluated, processing proceeds from step 2604 (FIG. 26) to step 2606. In
ステップ2608(第26図)が終了すると、論理流れ図2600に従った処理、即ちサブジェクト関数の反復的解析の1回分が終了する。
ステートメントの評価 上述のように、サブジェクト関数の各ステートメントは論理流れ図2800(第28図)に従って個別に評価される。処理はテストステップ2802から開始されるが、このステップでは実行エンジン802(第8図)が、そのステートメント、すなわちサブジェクトステートメントの構造体を表すステートメント構造体のフィールド“kind”2102(第21図)を検索することによって、そのステートメントが式であるか否かを判定する。そのステートメントはサブジェクトステートメント構造体によって表されるサブジェクトステートメントである。即ち、その時点で論理流れ図2800(第28図)に従って評価されているステートメントをサブジェクトステートメントと称する。
When step 2608 (FIG. 26) is completed, the process according to the logic flow diagram 2600, that is, one iteration of the subject function, is completed.
Statement Evaluation As described above, each statement of the subject function is evaluated individually according to logic flow diagram 2800 (FIG. 28). Processing begins at
サブジェクトステートメントが式である場合、すなわちフィールド“kind”2102が、サブジェクトステートメントが式であることを示している場合には、処理はテストステップ2802(第28図)からステップ2804に進み、そこで実行エンジン802(第8図)が式、すなわちサブジェクトステートメントの評価を行う。実行エンジン802は、その式に含まれる項目上の関数及び演算子の実行をエミュレートすることによって式の評価を行う。ステップ2804(第28図)は論理流れ図2900(第29図)に従って実行されるが、これについては後に詳述する。
If the subject statement is an expression, ie, the field “kind” 2102 indicates that the subject statement is an expression, processing proceeds from test step 2802 (FIG. 28) to step 2804 where the execution engine 802 (FIG. 8) evaluates an expression, ie a subject statement. The
後に詳しく述べるように、論理流れ図2900に従う処理は、式の評価の結果得られた項目に対して演算を施し得る。ステップ2804の文脈に於いては、式の項目に対して施される演算は無い。テストステップ2802(第28図)に於いて、サブジェクトステートメントが式でない場合は、処理はテストステップ2806に進む。
As will be described in detail later, the process according to logic flow diagram 2900 may perform operations on items obtained as a result of expression evaluation. In the context of
テストステップ2806に於いては、実行エンジン802(第8図)がサブジェクトステートメント構造体のフィールド“kind”2102とそのサブジェクトステートメントが宣言であることを示すデータとを比較する。defining宣言は、項目を生成させるC言語に従ったステートメントである。declaring宣言は、その項目があたかも特定の型であるかのようにその項目を取り扱うようCPU102(第1図)に指示するC言語に従ったステートメントである。ここで述べたもの以外の場合には、宣言はdefining宣言となる。サブジェクトステートメントが宣言である場合、処理はテストステップ2806(第28図)からステップ2808に進み、ここでその宣言が処理される。これについては後に詳しく述べる。逆に、サブジェクトステートメントが宣言でない場合は、処理はテストステップ2806からテストステップ2810に進む。
In
テストステップ2810に於いては、実行エンジン802(第8図)が、サブジェクトステートメント構造体のフィールド“kind”2102(第21図)と、サブジェクトステートメントが“if”ステートメントであることを示すデータとを比較する。そのステートメントが“if”ステートメントである場合は、処理はテストステップ2810(第28図)からステップ2812に進み、ここでそのサブジェクトステートメントが処理される。ステップ2812は後に説明する論理流れ図2812(第35図)により詳細に示されている。逆に、サブジェクトステートメントが“if”ステートメントでない場合は、処理はテストステップ2810(第28図)からテストステップ2814に進む。
In
テストステップ2814に於いては、実行エンジン802(第8図)が、サブジェクトステートメント構造体のフィールド“kind”2102(第21図)
と、そのサブジェクトステートメントが“return”ステートメントであることを示すデータとを比較する。サブジェクトステートメントが“return”ステートメントである場合は、処理はテストステップ2814(第28図)からステップ2816に進み、ここでそのステートメントが処理される。ステップ2816は後に説明する論理流れ図2816(第39図)により詳細に示されている。逆に、そのサブジェクトステートメントが“return”ステートメントでない場合は、処理はテストステップ2814(第28図)からテストステップ2818に進む。
In the
And data indicating that the subject statement is a “return” statement. If the subject statement is a “return” statement, processing proceeds from test step 2814 (FIG. 28) to step 2816, where the statement is processed.
テストステップ2818に於いては、実行エンジン802(第8図)が、そのサブジェクトステートメントのフィールド“kind”2102(第21図)と、そのサブジェクトステートメントがループ若しくはブロックステートメントであることを示すデータとを比較する。サブジェクトステートメントがループ若しくはブロックステートメントである場合には、処理はテストステップ2818(第28図)からステップ2820に進み、そのステートメントが処理される。ステップ2820は後に説明する論理流れ図2820(第40図)により詳細に示されている。逆に、そのサブジェクトステートメントはループステートメントでもブロックステートメントでもない場合には、処理はテストステップ2818(第28図)からテストステップ2822に進む。
In
テストステップ2822に於いては、実行エンジン802(第8図)が、サブジェクトステートメントのフィールド“kind”2102(第21図)と、そのサブジェクトステートメントが“goto”ステートメントであることを示すデータとを比較する。そのサブジェクトステートメントが“goto”ステートメントである場合には、処理はテストステップ2822(第28図)からステップ2824に進み、そこで実行エンジン802(第8図)が、後に詳述するように“return”条件を示すデータを制御レコード内に格納する。この制御レコードは、後に詳述するようにそのサブジェクト関数の実行のエミュレーション時に適切な制御の流れを与えるために用いられる。“return”条件は、サブジェクト関数の反復的解析を終了させる。
In
サブジェクトステートメントが“goto”ステートメントでない場合には、処理は論理流れ図2800に従って終了する。 If the subject statement is not a “goto” statement, processing ends according to logic flow diagram 2800.
ステップ2804、2808、2812、2816、2820、または2824のいずれかが実行されれた後、処理は論理流れ図2800に従って終了する。従って、実行エンジン802(第8図)によるステートメントの評価は、そのステートメントが式であるか、宣言であるか、“if”ステートメントであるか、“return”ステートメントであるか、ブロックステートメントであるか、ループステートメントであるか、若しくは“goto“ステートメントであるかによって、それぞれステップ2804(第28図)、ステップ2808、2812、2816、2820、2824、若しくは2828において行われるのである。
After any of
式の評価
上述のように、式は論理流れ図2900(第29図)に従って評価されるが、この場合実行エンジン802(第8図)が、動的検査エンジン706の一部であるステートマシン804をして、実行エンジン802によって指定された演算がある場合にはその演算をその式の項目に施すようにする。上述のように、ステップ2804(第28図)の文脈に於いては、実行エンジン802(第8図)はこのような演算の指定を行わない。ここに開示する本発明の実施例では、式を評価することで、式であるステートメント若しくは式を含むステートメントの実行によりその式のオペランドである項目に及ぼす効果を判断している。
Expression Evaluation As described above, expressions are evaluated according to logic flow diagram 2900 (FIG. 29), where execution engine 802 (FIG. 8) uses
論理流れ図2900(第29図)に従う処理は、ステップ2902から開始されるが、ここでは式の評価を行うために、その式に於ける演算子によって指定された処理が実行される。上述のように、式は、動的検査エンジン706(第7図)内に於いて式構造体2200(第22図)のような式構造体によって表現される。式構造体2200のフィールド“kind”2202はその式の演算子の種類を指定し、またフィールド“operands”2210はその演算子の演算が施されるオペランドを含む。
Processing according to logic flow diagram 2900 (FIG. 29) begins at
このサブジェクト関数の解析は、コンピュータプロセス内に於けるそのサブジェクト関数の実行の文脈内で行われるので、このサブジェクト関数のエクスターナルの初期値は未知である。従って、このサブジェクト関数に於ける式は、既知の値に評価しなくてもよい。従って、ステップ2902(第29図)での実行エンジン802(第8図)による式の評価により、式の評価により既知の若しくは部分的に既知の値が生成される場合には項目が生成され、そうでない場合にはNULLが生成される。後に詳述するように、項目は、「部分的に既知」の値を有し得る。例えば、項目が0でない値を有していることは知ることはできるが、項目の正確な値はまだ知ることができず、この場合その項目の値は「部分的に既知」であるという。ステップ2902は論理流れ図2902(第33a図、第33b図、第33c図、第33d図、及び第33e図)に詳しく示されており、後に詳細に説明する。ステップ2902(第29図)から、処理はテストステップ2904に進み、ここで実行エンジン802(第8図)が、式の評価によりNULLでなく項目が生成されたか否か、及びステートマシン804によりその項目に演算が施されるか否かを判定する。その式の評価により項目が生成されない場合、若しくはその項目に演算が施されない場合には、処理はテストステップ2904(第29図)から後に説明するステップ2908に進む。逆に、その式の評価により項目が生成されその項目に演算が施される場合には、処理はテストステップ2904からステップ2906に進み、そこでステートマシン804(第8図)がその項目に演算を施す。
Since the analysis of the subject function is performed in the context of execution of the subject function in a computer process, the initial value of the subject function external is unknown. Therefore, the expression in this subject function need not evaluate to a known value. Accordingly, when the expression is evaluated by the execution engine 802 (FIG. 8) in step 2902 (FIG. 29), a known or partially known value is generated by the evaluation of the expression. Otherwise, a NULL is generated. As will be described in detail later, an item may have a “partially known” value. For example, it can be known that an item has a non-zero value, but the exact value of the item is not yet known, in which case the value of that item is “partially known”.
評価された式の項目に演算を施すために、ステートマシン804は、その項目にエクスターナル及びリソースがそれぞれ関連付けられている場合には、その項目に関連付けられたエクスターナル及びリソースに対して演算を施す。例えば、項目構造体2700(第27図)のフィールド“external”2704が、項目構造体によって表現された項目に関連付けられたエクスターナルを表現するエクスターナル状態構造体を指定する。同様に、項目構造体2700のフィールド“resource“2702が、そのアイテムに関連付けられたリソースを表現するリソース状態構造体を指定する。
In order to perform an operation on an item of the evaluated expression, when an external and a resource are associated with the item, the
エクスターナルに施される演算には、例えばエクスターナル状態構造体3000のフィールド“DK”3004(第30図)及び“CP”3008の更新がある。このエクスターナル状態構造体3000は、そのエクスターナルを表現するエクスターナル状態構造体である。フィールド“DK”3004の更新は、そのエクスターナルに施される演算に従って、また上述の状態図500(第5a図)に従って行われる。例えば、フィールド“DK”3004(第30図)が状態Oを示しており、そのエクスターナルに演算mが施される場合、フィールド“DK”3004は状態Qを示すように更新される。フィールド“CP”3008の更新は、状態図400(第4a図)に従って行われる。
The operations performed on the external include, for example, updating the fields “DK” 3004 (FIG. 30) and “CP” 3008 of the
リソースに施される演算には、例えば、リソース状態構造体3100のフィールド“state”3102(第31図)及び“modified”3108の更新がある。このリソース状態構造体は、そのリソースを表現するリソース状態構造体である。フィールド“state”3102は、上述の状態図300(第3A図)に従って更新される。フィールド“modified”3108(第31図)は、現在行を指定するデータをフィールド“modified”3108に格納することによって更新され、最後にリソースを修正したステートメントを示すようにされる。この現在行とは、コンピュータプログラム610(第6図)上のそのサブジェクトステートメントが存在する行を指す。リソースに関連するプログラミングエラーを知らせると共に、最後にリソースを修正したステートメントをユーザに対して示すことによって、サブジェクト関数の開発者がプログラミングエラーを除去する助けとなる。
The operation performed on the resource includes, for example, updating the fields “state” 3102 (FIG. 31) and “modified” 3108 of the
後に詳しく説明するが、エクスターナル状態構造体3000のフィールド“DK”3004(第30図)若しくは“CP”3008の更新、またはリソース状態構造体3100のフィールド“state”3102(第31図)の更新によって、状態図300、400、または500(第3A図、第4図、及び第5図)に基づくエラーが生じた場合には、このエラーはユーザに通知される。式の評価により生成された項目も、論理流れ図3200(第32図)に基づいて状態違反を調べられる。
As will be described in detail later, by updating the field “DK” 3004 (FIG. 30) or “CP” 3008 of the
テストステップ3202(第32図)においては、ステートマシン804(第7図)が項目構造体2700のフィールド“initialized”2714(第27図)を調べて、項目構造体2700によって表現された項目が初期化されたか否かを判定する。その項目が初期化されていない場合には、処理はテストステップ3202(第32図)からステップ3204に進み、ここでエラーが報告される。論理流れ図3200の各ステップの実行はステップ2906(第29図)内においてのみ実行されることから、演算が施されるのは論理流れ図3200(第32図)における項目に対してである。従って、その項目が初期化される場合、演算の適用で示されるように、初期化される前にその項目が使用され、これがエラーとなる。
In test step 3202 (FIG. 32), state machine 804 (FIG. 7) examines field “initialized” 2714 (FIG. 27) of
その項目が初期化された場合には、処理はテストステップ3202からテストステップ3206に進む。テストステップ3206においては、ステートマシン804(第8図)が、項目構造体2700のフィールド“invalid pointer”2720(第27図)を検査することによりその項目が無効ポインタであるか否かを判定するとともに、施される演算と、演算i、即ち間接演算とを比較する。その項目が有効ポインタで、演算iが施される場合には、処理はステップ3208(第32図)に進み、そこでエラーが通知される。逆に、その項目が有効ポインタでなく、若しくは演算i以外の演算が施される場合には、処理はステップ3206からテストステップ3210に進む。
If the item is initialized, processing proceeds from
テストステップ3210において、ステートマシン804(第7図)は、その項目が、テストステップ3206に関して上述したのと同様に無効ポインタであるか否かを判定し、施される演算と演算kとを比較する。C言語の文脈においては、無効ポインタを解放することは、ファイル及び動的に割振られるメモリを管理するのに使用するデータ構造をライブラリ関数が損なうことになり得るために、エラーとなる。NULLポインタを解放することは一般的にはエラーではないが、不手際なプログラム作成方法と一般に考えられ、エラーとして通知される。
In
その項目が無効ポインタであり、演算kがその項目に施される場合には、処理はステップ3212に進み、そこでエラーの通知がなされる。逆にその項目が無効ポインタでないか、若しくは演算k以外の演算が施される場合には、処理は論理流れ図3200に従って終了する。また、ステップ3204、3208、及び3212の終了後も、処理は論理流れ図3200に従って終了する。
If the item is an invalid pointer and operation k is performed on the item, the process proceeds to step 3212 where an error is notified. Conversely, if the item is not an invalid pointer or an operation other than operation k is performed, processing ends according to logic flow diagram 3200. Also, after
従って、ステップ2906(第29図)において、項目及びそれに関連するリソースまたはエクスターナルに演算が施され、何らかのエラーが検出されてそれがユーザに通知される。ステップ2906から、処理はステップ2908に進む。また、式の評価により生成された項目が存在しない場合、若しくは上述のようにその式に対して施される演算が無い場合は、処理はテストステップ2904から直接ステップ2908に進む。ステップ2908においては、実行エンジン802は、式、即ち、サブジェクトステートメントを含んでおり、更に、項目が生成された場合にはその項目を、生成されなかった場合には数値がNULLである項目を含んでいる。詳述すると、実行エンジン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(第22図)と、式が定数であることを示すデータとを比較することによってこの判定を行う。定数は、その値がコンピュータプロセスの実行中に変化しない項目である。例えば、式“10”は、整数であり、その値が常に10である定数である。
Therefore, in step 2906 (FIG. 29), an operation is performed on the item and its associated resource or external, and any error is detected and notified to the user. From
Constants As described above, in step 2902 (FIG. 29), shown in detail in logic flow diagram 2902 (FIGS. 33A-33E), execution engine 802 (FIG. 8) is controlled by an operator in the expression. Process the expression as specified. The
その式が定数でない場合には、処理は後に述べるテストステップ3303(第33A図)に進む。逆に、式が定数である場合には、処理はテストステップ3301からステップ3302に進む。ステップ3302においては、実行エンジン802(第8図)が定数を表現する項目構造体を生成し、その項目構造体を、その定数の値を有するように初期化する。ステップ3302の終了後、処理は論理流れ図2902及びステップ2902(第29図)に従って終了する。
If the expression is not a constant, the process proceeds to test step 3303 (FIG. 33A) described later. Conversely, if the expression is a constant, processing proceeds from test step 3301 to step 3302. In
変数
上述のように、その式が定数でない場合には、処理はテストステップ3301(第33A図)からテストステップ3303に進む。テストステップ3303においては、実行エンジン802(第8図)が、その式を表現する式構造体のフィールド“kind”2202(第22図)と、その式が変数であることを示すデータとを比較することによって、その式が変数であるか否かを判定する。変数である式は、その変数の項目の現項目値に評価される。例えば、サブジェクト関数の以前に処理されたステートメントが、識別子が“i”、即ち型が“int”、即ち整数である変数“i”である変数を宣言する場合には、式“i”は、変数“i”の項目の現項目値に評価される。式が変数でない場合には、処理は後に説明するテストステップ3305(第33A図)に進む。逆に、その式が変数である場合には、処理はテストステップ3303からステップ3304に進む。
Like the variable described above, if the expression is not a constant, the process proceeds from test step 3301 (No. 33A charts) to test step 3303. In test step 3303, execution engine 802 (FIG. 8) compares the field “kind” 2202 (FIG. 22) of the expression structure representing the expression with data indicating that the expression is a variable. To determine whether the expression is a variable. An expression that is a variable evaluates to the current item value of that variable's item. For example, if the previously processed statement of the subject function declares a variable whose identifier is “i”, ie, type “int”, ie, variable “i” that is an integer, the expression “i” is The current item value of the item of variable “i” is evaluated. If the expression is not a variable, the process proceeds to test step 3305 (FIG. 33A) described later. Conversely, if the expression is a variable, processing proceeds from test step 3303 to step 3304.
ステップ3304においては、実行エンジン802(第8図)が変数iの項目を検索する。式構造体2300(第23図)がその式を表現する場合、即ち変数を表現する場合には、(i)フィールド“num operands”2308が、1つのオペランドを指定する値1を有し、(ii)フィールド“operands”2310が宣言構造体2310を指定する1つのポインタの配列となる。宣言構造体2316のフィールド“item”2324は、式2300の値として検索される。宣言構造体2316に関連付けられた項目が存在しない場合には、フィールド“item”2324はNULLとなる。従って、存在する項目構造体またはNULLの何れかが、ステップ3304(第33A図)において取り出されるのである。ステップ3304の終了後、処理は論理流れ図2902即ちステップ2902(第29図)に従って終了する。
In
2項演算子
上述のように、その式が宣言でない場合には、処理はテストステップ3303(第33A図)からテストステップ3305に進む。テストステップ3305において、実行エンジン802(第8図)は、その式を表現する式構造体のフィールド“kind”2202(第22図)と2項演算子を示すデータとを比較することによって、その式の演算子が2項演算子であるか否かを判定する。2項演算子は2つのオペランドに対して演算を施す演算子であって、関係演算子ではない演算子である。例えば、式“a+b”には、加算を指定する2項演算子“+”が含まれている。関係演算子については後に説明する。
Binary Operator As described above, if the expression is not a declaration, processing proceeds from test step 3303 (FIG. 33A) to test
論理流れ図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)の評価も行われることになり得るのである。このような再帰的プログラミングは周知の技術である。
If the operator of the expression processed according to logic flow diagram 2902 (FIG. 33A) is not a binary operator, processing proceeds from
2項演算子は、左側のオペランドと共に、右側のオペランド、即ち“rhs”を有する。例えば、式“(a+b)*c”は、lhs“(a+b)”と、rhs“c”とを有する。というのはこの式の中で最も優先順位の高いものは、演算子“*”、即ち乗算演算子だからである。2つのオペランドを有し、式構造体2200(第22図)によって表現される式のrhsは、フィールド“operands”2210の第2要素の式構造体によって表現される。ステップ3306(第33A図)において式のlhsが評価された後、処理はステップ3307に進み、ここで実行エンジン802(第8図)が、論理流れ図2900(第29図)に従ってこの式のrhsの評価を行うとともに、演算cを施す。演算cは、式のlhs及びrhsの双方に施されるが、これはそれぞれが計算において使用されるからである。このような計算において、式のlhs若しくはrhsの何れかを不適切に使用している場合は、上述のように演算を施すことによってエラーメッセージが生成される。 A binary operator has a right operand, or “rhs”, along with a left operand. For example, the expression “(a + b) * c” has lhs “(a + b)” and rhs “c”. This is because the highest priority in this expression is the operator “*”, that is, the multiplication operator. The rhs of the expression having two operands and represented by the expression structure 2200 (FIG. 22) is represented by the expression structure of the second element of the field “operands” 2210. After the expression lhs is evaluated in step 3306 (FIG. 33A), processing proceeds to step 3307 where the execution engine 802 (FIG. 8) determines the rhs of this expression according to logic flow diagram 2900 (FIG. 29). While performing evaluation, the calculation c is performed. The operation c is applied to both lhs and rhs of the formula because each is used in the calculation. In such a calculation, if either lhs or rhs of the expression is inappropriately used, an error message is generated by performing the calculation as described above.
ステップ3307(第33A図)から、処理はステップ3308に進み、ここでその式の2項演算子を用いて式の評価が行われる。この式のlhs及びrhsのデータの型は演算子によって呼び出される演算の型に影響する。C言語において、特定の演算子が特定の型のオペランドに対して実行する演算の型は、Cスタンダードのセクション6.3他に記載されており、周知である。 From step 3307 (FIG. 33A), processing proceeds to step 3308 where the expression is evaluated using the binary operator of the expression. The type of lhs and rhs data in this expression affects the type of operation invoked by the operator. In the C language, the types of operations that specific operators perform on specific types of operands are well known and described in section 6.3 of the C standard.
式の演算子は、Cスタンダードに記載された所定の演算子の適用方法に従って式のオペランドに適用される。例えば、演算子が算術加算演算子(即ち“+”)である場合には、演算子を2つのオペランドに適用した結果、2つのオペランドの算術和が得られる。第2の例として、演算子が、一方の値が他方より大きいことを表す関係演算子(即ち、“>”)である場合には、この演算子は2つのオペランド、即ちlhsとrhsとに適用することにより、lhsの値がrhsの値より大きい場合にはブール値“true(真)”が得られ、逆の場合にはブール値“false(偽)”が得られる。 Expression operators are applied to the operands of the expression according to a predetermined operator application method described in the C standard. For example, if the operator is an arithmetic addition operator (ie, “+”), applying the operator to two operands results in an arithmetic sum of the two operands. As a second example, if the operator is a relational operator (ie, “>”) indicating that one value is greater than the other, this operator is divided into two operands, ie, lhs and rhs. By applying, a Boolean value “true” is obtained if the value of lhs is greater than the value of rhs, and a Boolean value “false” is obtained in the opposite case.
コンピュータプログラム610におけるリソースの不適切な使用を検出するリソースチェッカ602(第6図)のために、実行エンジン802(第8図)によりC言語の全ての演算子が適切に適用される必要は必ずしもない。式が実行エンジン802(第8図)によって適用され得ない演算子を含む場合、この式はNULLに評価され、その式の評価により値が未知の項目が生成されることが示される。しかし、実行エンジン802が、できる限り多くのC言語の演算子を適用して、リソースチェッカ602によって検出されたリソースの不適切な使用を正しく改善し得るのは好ましいことである。
For the resource checker 602 (FIG. 6) to detect improper use of resources in the
ステップ3308(第33A図)の後、処理は論理流れ図2902、即ちステップ2902(第29図)に従って終了する。 After step 3308 (FIG. 33A), processing ends according to logic flow diagram 2902, step 2902 (FIG. 29).
関係演算子
上述のように、式の演算子が2項演算子でない場合には、処理はテストステップ3305(第33A図)からテストステップ3309に進む。テストステップ3309においては、実行エンジン802(第8図)が、その式の演算子が関係演算子であるか否かを判定する。関係演算子は2つのオペランド、即ちlhs及びrhsに対して演算を行い、演算結果として2つのオペランドの値を比較したブール値に対応する数値を有する項目を生成する演算子である。ブール値は、“true”若しくは“false”の何れかである。関係演算子の具体例には、“==”(等しい)、“>=”(大きいか若しくは等しい)、“<=”(小さいか若しくは等しい)、及び“!=”(等しくない)がある。
Relational Operator As noted above, if the expression operator is not a binary operator, processing proceeds from test step 3305 (FIG. 33A) to test
この式の演算子が関係演算子でない場合は、処理はテストステップ3309(第33A図)から、後に説明するテストステップ3313に進む。逆に式の演算子が関係演算子である場合は、処理はテストステップ3309からステップ3310に進む。ステップ3310においては、実行エンジン802(第8図)が、論理流れ図2900(第29図)に従って式のlhsを式として評価するとともに、演算pを適用する。ステップ3310(第33A図)から、処理はステップ3311へ進み、ここで実行エンジン802(第8図)が論理流れ図2900(第29図)に従って、式のrhsの評価を行うとともに、演算pを適用する。演算pは式のlhs及びrhsの双方に適用されるが、これはそれぞれが比較のために使用されるからである。このような比較処理において、式のlhs若しくはrhsの何れかが不適切に使用されている場合には、上述のように演算が適用されることによりエラーメッセージが生成される。
If the operator of this expression is not a relational operator, the process proceeds from test step 3309 (FIG. 33A) to test
処理はステップ3311(第33A図)からステップ3312に進み、ここで式の関係演算子が用いられて式の評価が行われる。ステップ3312は、前に説明したステップ3302に類似している。ステップ3312の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。
Processing proceeds from step 3311 (FIG. 33A) to step 3312, where the relational operator of the expression is used to evaluate the expression.
単項演算子
上述のように、この式の演算子が関係演算子でない場合には、処理はテストステップ3309(第33A図)からテストステップ3313に進む。テストステップ3313においては、実行エンジン802(第8図)が、式の演算子が単項演算子であるか否かを、その式を表現する式構造体のフィールド“kind”2202(第22図)と、単項演算子を示すデータとを比較することによって判定する。単項演算子は、ただ1つのオペランドを有する演算を特定する演算子である。例えば、式“−a”は、ただ1つのオペランド“a”と、オペランド“a”に対して数値を負にする演算を特定する単項演算子“−”とを有する。式が1つのオペランドを有し、かつ式構造体2200によって表現されている場合には、その式のただ1つのオペランドが、フィールド“operands”2210の第1の要素である式構造体によって表現される。
Unary operator As noted above, if the operator in this expression is not a relational operator, processing proceeds from test step 3309 (FIG. 33A) to test
式の演算子が単項演算子でない場合には、処理はテストステップ3313(第33B図)から、後に説明するテストステップ3313(第33B図)に進む。逆に、式の演算子が単項演算子である場合には、処理はテストステップ3313(第33B図)からステップ3314に進む。ステップ3314においては、実行エンジン802(第8図)が、論理流れ図2900(第29図)に従って式のオペランドを式として評価するとともに、演算cを適用する。演算cは、式のオペランドに適用されるが、これはこのオペランドが計算において使用されるからである。このような計算において式のオペランドが不適切に使用されている場合には、上述のように、演算を適用することによりエラーメッセージが生成される。
If the operator of the expression is not a unary operator, the process proceeds from test step 3313 (FIG. 33B) to test step 3313 (FIG. 33B) described later. Conversely, if the expression operator is a unary operator, processing proceeds from test step 3313 (FIG. 33B) to step 3314. In
処理はステップ3314(第33B図)からステップ3315に進み、ここでは式の単項演算子が式の評価のために用いられる。ステップ3315は上述のステップ3308に類似している。ステップ3315の終了後、処理は論理流れ図2902、即ちステップ2902(第29図)に従って終了する。 Processing proceeds from step 3314 (FIG. 33B) to step 3315, where the unary operator of the expression is used to evaluate the expression. Step 3315 is similar to step 3308 described above. After step 3315 ends, processing ends according to logic flow diagram 2902, step 2902 (FIG. 29).
特定の演算子による処理
上述のように、式の演算子が単項演算子でない場合には、処理はテストステップ3313(第33B図)からテストステップ3317(第33B図)に進む。更に上述したように、論理流れ図2902における上述のステップでは、式の演算子の型に従って式の処理が行われる。テストステップ317及びそれに続くステップにおいて、式の演算子の型がテストステップ3301(第33A図)、3303、3305、3309及び3313で判定される演算子の型の中に入っていない場合に、実行エンジン802(第8図)が、式の特定の演算子に従って式の処理を行う。
Processing by Specific Operator As described above, when the operator of the expression is not a unary operator, the processing proceeds from test step 3313 (FIG. 33B) to test step 3317 (FIG. 33B). As further described above, in the above-described steps in logic flow diagram 2902, processing of the expression is performed according to the type of operator of the expression. Executed in the test step 317 and subsequent steps if the expression operator type is not among the operator types determined in the test step 3301 (FIG. 33A), 3303, 3305, 3309 and 3313 Engine 802 (FIG. 8) processes the expression according to a specific operator of the expression.
インクリメント演算子またはデクリメント演算子
ステップ3317(第33B図)においては、実行エンジン802(第8図)が、式の演算子とインクリメント演算子及びデクリメント演算子とを比較する。つまり、式構造体2200(第22図)がその式を表現している場合、実行エンジン802は、フィールド”kind”2202(第22図)と、インクリメント演算子若しくはデクリメント演算子を指定するデータとを比較する。インクリメント演算子若しくはデクリメント演算子は、1つのオペランドに対してそのオペランドを1つずつ増減させる演算を施す。その式の演算子がインクリメント演算子でもデクリメント演算子でもない場合には、処理は、後に説明するテストステップ3320(第33B図)に進む。逆に、式の演算子がインクリメント演算子またはデクリメント演算子である場合には、処理はテストステップ3317からステップ3318に進む。
In an increment or decrement operator step 3317 (FIG. 33B), the execution engine 802 (FIG. 8) compares the expression operator with the increment and decrement operators. That is, when the expression structure 2200 (FIG. 22) expresses the expression, the
ステップ3318においては、実行エンジン802(第8図)が、論理流れ図2900(第29図)に従ってそのオペランドを評価し、演算cを適用する。演算cを適用するのは、このオペランドが計算において使用されるからである。上述のように、演算cをそのオペランドに対して適用することにより生じた何らかのエラーは検出され通知される。
In
処理はステップ3318(第33B図)からステップ3319に進み、ここでは式のインクリメント演算子またはデクリメント演算子が用いられて、その式の評価が行われる。ステップ3319は、上述のステップ3308(第33A図)に類似している。ステップ3319(第33B図)の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。 Processing proceeds from step 3318 (FIG. 33B) to step 3319, where the expression is evaluated using an increment or decrement operator. Step 3319 is similar to Step 3308 (FIG. 33A) described above. After step 3319 (FIG. 33B), processing ends according to logic flow diagram 2902, ie, step 2902 (FIG. 29).
“Not”演算子
上述のように、式の演算子がインクリメント演算子でもデクリメント演算子でもない場合には、処理はテストステップ3317(第33B図)からテストステップ3320に進む。テストステップ3320においては、実行エンジン802(第8図)が、その式を表す式構造体のフィールド“kind”2202(第22図)と“Not”演算子を指定するデータとを比較することによって、C言語の“Not”演算子と式の演算子とを比較する。“Not”演算子は、ただ1つのオペランドに対して演算を施し、そのオペランド自体をブール値項目として取り扱って、オペランドの論理的否定のブール値に対応する値を有する項目を生成する。ブール値項目は、真若しくは偽の何れかのブール値に対応する値を有する項目である。
“Not” operator As described above, if the operator of the expression is neither an increment operator nor a decrement operator, processing proceeds from test step 3317 (FIG. 33B) to test
その式の演算子が“Not”演算子でない場合は、処理はテストステップ3320(第33B図)からテストステップ3323に進む。逆に式の演算子が“Not”演算子である場合は、処理はテストステップ3320から3321に進む。ステップ3321においては、実行エンジン802(第8図)が、論理流れ図2900(第29図)に従ってオペランドの評価を行うとともに、演算pを施す。演算pを施すのは、このオペランドは真理値計算を行うのに使用されるからである。上述のように、オペランドに演算pを適用することによって生じたエラーは全て通知される。
If the operator of the expression is not a “Not” operator, processing proceeds from test step 3320 (FIG. 33B) to test
処理はステップ3321(第33B図)からステップ3322に進み、ここで“Not”演算子がその式を評価するのに用いられる。ステップ3322は、前に説明したステップ3308(第33A図)に類似している。ステップ3322(第33B図)の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。
Processing proceeds from step 3321 (FIG. 33B) to step 3322, where the “Not” operator is used to evaluate the expression.
“And”演算子及び“Or”演算子
上述のように、式の演算子が“NOt”演算子でない場合には、処理はテストステップ3320(第33B図)からテストステップ3323に進む。テストステップ3323において、実行エンジン802(第8図)は、その式を表現する式構造体のフィールド“kind”2202(第22図)と、“And”演算子及び“Or”演算子を指定するデータとを比較することによって、C言語の“And”演算子及び“Or”演算子と式の演算子との比較を行う。この“And”演算子及び“Or”演算子は2つのオペランド、即ちlhs及びrhsに演算を施し、そのオペランドをブール値項目として取り扱ってそのブール値の論理積及び論理和のブール値を有する項目を生成する。
“And” Operator and “Or” Operator As described above, when the operator of the expression is not the “NOt” operator, the process proceeds from the test step 3320 (FIG. 33B) to the
式の演算子が“And”演算子でも“Or”演算子でもない場合には、処理はテストステップ3323(第33B図)からテストステップ3327に進む。逆に、式の演算子が“And”演算子または“Or”演算子である場合には、処理はテストステップ3323からステップ3324に進む。
If the expression operator is neither the “And” operator nor the “Or” operator, processing proceeds from test step 3323 (FIG. 33B) to test
ステップ3324においては、実行エンジン802(第8図)が論理流れ図2900(第29図)に従って、その式のlhsをその式そのものとして評価するとともに、演算pを施す。ステップ3324(第33B図)から、処理はステップ3325に進み、ここでは実行エンジン802(第8図)が、論理流れ図2900(第29図)に従って式のrhsの評価を行うと共に、演算pを適用する。演算pは式のlhs及びrhsの双方に施されるが、これはそれぞれが真理値計算に用いられるからである。このような真理値計算において式のlhsまたはrhsの何れかを不適切に用いた場合には、上述のように演算pを適用することによってエラーメッセージが生成される。
In
処理はステップ3325(第33B図)からステップ3326に進み、ここで式の“And”演算子または“Or”演算子が用いられて、式の評価が行われる。ステップ3326は、前述のステップ3308(第33A図)に類似している。ステップ3326(第33B図)の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。 Processing proceeds from step 3325 (FIG. 33B) to step 3326 where the expression “And” or “Or” is used to evaluate the expression. Step 3326 is similar to Step 3308 (FIG. 33A) described above. After completion of step 3326 (FIG. 33B), processing ends according to logic flow diagram 2902, ie, step 2902 (FIG. 29).
複合演算子
上述のように、式の演算子が“And”演算子でも“Or”演算子でもない場合には、処理はテストステップ3323(第33B図)からテストステップ3327に進む。テストステップ3327において、実行エンジン802(第8図)は、その式の演算子が複合演算子(compound operator)であるか否かを、その式を表現する式構造体のフィールド“kind”2202(第22図)と、複合演算子を指定するデータとを比較することによって判定する。C言語においては、複合演算子、即ちカンマ(“,”)は、2つのオペランド、即ち式のlhs及びrhsに対して演算を施し、演算結果としてrhsを評価した値を有する項目を生成する。つまり、2つのオペランドは個別に評価され、式のrhsを評価した値が式の値になるのである。
Compound Operator As described above, if the operator of the expression is neither the “And” operator nor the “Or” operator, the process proceeds from the test step 3323 (FIG. 33B) to the
式の演算子が複合演算子でない場合には、処理はテストステップ3327(第33C図)からテストステップ3330に進む。逆に、式の演算子が複合演算子である場合には、処理はテストステップ3327からステップ3328に進む。ステップ3328においては、実行エンジン802(第8図)が論理流れ図200(第29図)に従って式のlhsをその式として評価し、また演算の適用は行わない。ステップ3328(第33C図)から処理はステップ3329に進みここでは実行エンジン802(第8図)が論理流れ図2900(第29図)に従って式のrhsを評価する。論理流れ図2900に従って、複合演算子を含む式を評価する場合に施される演算は、ステップ3329(第33C図)においてrhsを評価するときにrhsに施される演算と類似したものである。式のrhsの評価によって生成される項目は、その式そのものの項目として戻される。
If the expression operator is not a compound operator, processing proceeds from test step 3327 (FIG. 33C) to test
ステップ3329(第33C図)の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。 After step 3329 (FIG. 33C), processing ends according to logic flow diagram 2902, ie, step 2902 (FIG. 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要素の値を参照するものである。
Indirect Operator As noted above, if the operator of the expression is not a compound operator, processing proceeds from test step 3327 (FIG. 33C) to test
その式の演算子が間接演算子でない場合には、処理はテストステップ3330(第33C図)からテストステップ3335に進む。逆に、その式の演算子が間接演算子である場合には、処理はテストステップ3330からテストステップ3331に進む。
If the operator of the expression is not an indirect operator, processing proceeds from test step 3330 (FIG. 33C) to test
テストステップ3331においては、実行エンジン802(第8図)がそのオペランドが配列であるか否かを判定する。式構造体2220(第22図)がそのオペランドを表現している場合には、フィールド“type”2204(第22図)がそのオペランドの型を指定する型構造体を指定する。例えば、型構造体1612(第17図)が式構造体2220のフィールド“type”2204(第22図)によって指定されている場合には、実行エンジン802(第8図)がそのオペランドが配列であるか否かを、フィールド“kind”1702(第17図)と配列を指定するデータとを比較することによって判定する。
In
そのオペランドが配列である場合には、処理はテストステップ3331(第33C図)からステップ3332に進み、ここで実行エンジン802(第8図)が、論理流れ図2900(第29図)に従って、そのオペランドをその式として評価し、かつ演算は適用しないが、その演算子を、配列の間接アドレス指定手段として、即ち上述の“*(array+1)”の型式の配列の1つの要素の参照要素として取り扱う。逆に、オペランドが配列でない場合には、処理はテストステップ3331(第33C図)からステップ3333に進み、ここでは実行エンジン802(第8図)が、論理流れ図2900(第29図)に従ってその式のオペランドを評価するとともに、演算iを適用し、かつその演算子を間接アドレスを指定するポインタ、即ち上述の式“*a”のためのものとして取り扱う。 If the operand is an array, processing proceeds from test step 3331 (FIG. 33C) to step 3332, where execution engine 802 (FIG. 8) executes the operand according to logic flow diagram 2900 (FIG. 29). Is evaluated as an expression and no operation is applied, but the operator is treated as an array indirect addressing means, ie as a reference element of one element of an array of the type "* (array + 1)" described above. Conversely, if the operand is not an array, processing proceeds from test step 3331 (FIG. 33C) to step 3333, where execution engine 802 (FIG. 8) performs its expression according to logic flow diagram 2900 (FIG. 29). And the operation i is applied, and the operator is treated as a pointer for specifying an indirect address, that is, for the above-described expression “* a”.
処理はステップ3332(第33C図)またはステップ3333の何れかから、ステップ3334に進み、ここでは実行エンジン802(第8図)が、そのオペランドをデリファレンスする。オペランドのデリファレンスにおいて、その式の評価により、オペランドが指定する項目が生成される。オペランドが項目を指定していない場合には、式はNULLに評価される。ステップ3334(第33C図)の終了後、論理流れ図2902に従って、即ちステップ2902(第29図)に従って処理は終了する。
Processing proceeds from either step 3332 (FIG. 33C) or
コンポーネント参照演算子
上述のように、式の演算子が間接演算子でない場合には、処理はテストステップ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”が指定する項目の整数フィールド項目に評価される。
Component Reference Operator As noted above, if the expression operator is not an indirect operator, processing proceeds from test step 3330 (FIG. 33C) to test
式の演算子がコンポーネント参照演算子でない場合には、処理はテストステップ3335(第33C図)からテストステップ3338(第33D図)に進む。逆に式の演算子がコンポーネント参照演算子である場合には、処理はテストステップ3335(第33C図)からステップ3336に進む。 If the expression operator is not a component reference operator, processing proceeds from test step 3335 (FIG. 33C) to test step 3338 (FIG. 33D). Conversely, if the expression operator is a component reference operator, processing proceeds from test step 3335 (FIG. 33C) to step 3336.
ステップ3336においては、実行エンジン802(第8図)が論理流れ図2900(第29図)に従って式のlhsを評価し、また演算は施されない。ステップ3336(第33C図)から、処理はステップ3337に進み、ここで実行エンジン802(第8図)が、式のrhsによって指定されるフィールドを検索する。ステップ3337の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。
In step 3336, execution engine 802 (FIG. 8) evaluates the expression lhs according to logic flow diagram 2900 (FIG. 29) and no operation is performed. From step 3336 (FIG. 33C), processing proceeds to step 3337, where execution engine 802 (FIG. 8) retrieves the field specified by the expression rhs. After
配列参照演算子
上述のように、式の演算子がコンポーネント演算子でない場合には、処理はテストステップ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)と称されることもある。
Array Reference Operator As described above, if the expression operator is not a component operator, processing proceeds from test step 3335 (FIG. 33C) to test step 3338 (FIG. 33D). In the
C言語においては、配列参照演算子は、非配列ポインタからのオフセットを参照するためにも使用されうる。例えば、“datum”が型“int”である変数である場合、式“datum[2]”は、メモリ104(第1図)の、変数“datum”を表現する項目から2メモリ位置だけオフセットした位置に格納されたデータに評価される。2メモリ位置は、変数“datum”の型、即ちデータの型“int”の変数2つ分の長さに等しい。上述のように、C言語の文脈においては、“array[i]”及び“*(array+i)”は、等価な式である(Cスタンダードのセクション6.3、2.1参照)。 In the C language, the array reference operator can also be used to reference an offset from a non-array pointer. For example, if “datum” is a variable of type “int”, the expression “datum [2]” is offset by two memory locations from the item representing the variable “datum” in the memory 104 (FIG. 1). It evaluates to the data stored at the location. The two memory locations are equal to the length of the variable “datum”, ie the length of two variables of the data type “int”. As described above, in the context of C language, “array [i]” and “* (array + i)” are equivalent expressions (see sections 6.3 and 2.1 of the C standard).
その式の演算子が配列参照演算子でない場合は、処理はテストステップ3338(第33D図)からテストステップ3344に進む。逆に、この式の演算子が配列参照演算子である場合には、処理はテストステップ3338からステップ3339に進む。
If the operator of the expression is not an array reference operator, processing proceeds from test step 3338 (FIG. 33D) to test
ステップ3339において、実行エンジン(第8図)は、論理流れ図2900(第29図)に従ってその式の指標を評価し、また演算cを施す。演算cを施すのは、この指標は計算に使用されるからである。ステップ3339(第33D図)から、処理はテストステップ3340に進み、ここで実行エンジン802(第8図)が、lhsが配列であるか否かを、テストステップ3331(第33C図)に関連して前に説明した方法で判定する。lhsが配列である場合には、処理はテストステップ3340(第33D図)からステップ3341に進み、ここで実行エンジン802(第8図)が、論理流れ図2900(第2図)に従ってその式のrhsを指標として評価する。このとき演算は施されない。逆に、lhsが配列でない場合には、処理はテストステップ3340(第33D図)からステップ3342に進み、ここで実行エンジン802(第8図)が論理流れ図2900(第29図)に従ってその式のrhsをポインタとして評価し、かつ演算iを施す。
In
処理はステップ3341(第33D図)若しくはステップ3342の何れかから、ステップ3343に進み、ここで実行エンジン802(第8図)が、lhsによって特定された配列の、rhsによって指定された要素を検索する。ステップ3343(第33D図)の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。 Processing proceeds from either step 3341 (FIG. 33D) or step 3342 to step 3343, where the execution engine 802 (FIG. 8) searches for the element specified by rhs in the array specified by lhs. To do. After completion of step 3343 (FIG. 33D), processing ends according to logic flow diagram 2902, ie, step 2902 (FIG. 29).
アドレス演算子
上述のように、その式の演算子が配列演算子でない場合には、処理はテストステップ3338(第33D図)からテストステップ3344に進む。テストステップ3344においては、実行エンジン802(第8図)が、その式の演算子がアドレス演算子であるか否かを、その式を表現する式構造体のフィールド“kind”2202と、アドレス演算子を指定するデータとを比較することによって判定する。C言語においては、アドレス演算子(即ち“&”)は、1つのオペランドに対して演算を施し、演算結果としてオペランドのアドレスがその値である項目を生成する。例えば、式“&a”は、メモリ、即ちメモリ104内の、項目“a”が格納されているアドレスをその値とする項目に評価される。
Address Operator As described above, if the operator of the expression is not an array operator, processing proceeds from test step 3338 (FIG. 33D) to test
その式の演算子がアドレス演算子でない場合には、処理はテストステップ3344(第33D図)からテストステップ3347に進む。逆に、その式の演算子がアドレス演算子である場合には、処理はテストステップ3344からステップ3345に進む。
If the operator of the expression is not an address operator, processing proceeds from test step 3344 (FIG. 33D) to test
ステップ3345においては、実行エンジン802(第8図)が、論理流れ図2900(第29図)に従ってオペランドの評価を行い、このとき他の演算は施されない。ステップ3345(第33D図)から、処理はテストステップ3346に進み、ここでこのアドレス演算子はその式を評価するのに使用される。つまり、オペランドのアドレスが決定されるのである。ステップ3346は、前に説明したステップ3308(第33A図)に類似している。ステップ3346(第33D図)が終了した後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。
In
関数の呼出し
上述のように、式の演算子がアドレス演算子でない場合には、処理はテストステップ3344(第33D図)からテストステップ3347に進む。テストステップ3347においては、実行エンジン802(第8図)が、その式の演算子が関数の呼出しであるか否かを、その式を表現する式構造体のフィールド“kind”2202(第22図)と、関数の呼出しを指定するデータとを比較することによって判定する。C言語においては、関数演算子(即ち“ () ”)は、関数の呼出しを意味する。関数の呼出しは、その関数の戻り値項目(returned item)に評価される。例えば、式“abc () ”は、識別子が“abc”である関数の実行の呼出しを行う。同様に、式“xyz(d,e,f)”は、その識別子が“xyz”である、パラメータとして項目d,e,及びfが与えられている関数を呼び出す。
Invocation of a function As described above, if the operator of the expression is not an address operator, processing proceeds from test step 3344 (FIG. 33D) to test
式の演算子が関数の呼出しでない場合には、処理はテストステップ3347(第33E図)からテストステップ3353に進む。逆に、式の演算子が関数の呼出しである場合には、処理はテストステップ3347からループステップ3348に進む。ループステップ3348、ステップ3349、及びNEXTステップ3350は、各パラメータの評価が行われるループを形成する。ステップ3349において、実行エンジン802(第8図)は、論理流れ図2900(第29図)に従ってパラメータの評価を行い、また演算は施さない。式構造体2200(第22図)がその式を表現している場合、即ち関数の呼出しを表現している場合には、(i)フィールド“num operands”2208が呼び出された関数のパラメータの数をオペランドの数として特定し、(ii)フィールド“operands”2210は式構造体の配列であり、この式構造体の各要素は呼び出された関数のパラメータを表現する式構造体である。
If the expression operator is not a function call, processing proceeds from test step 3347 (FIG. 33E) to test
各パラメータの評価は、フィールド“operands”2210の各要素を評価することによって行われる。呼び出された関数のパラメータを表現する項目の配列は、ループステップ3348、ステップ3349、及びNEXTステップ3350によって形成されたループにおいて構成され、後に(第46図に関連して)詳しく説明するように、ステップ3352において呼び出された関数の実行をエミュレートするのに用いられる。
Each parameter is evaluated by evaluating each element of the field “operands” 2210. The array of items representing the parameters of the called function is organized in the loop formed by
ひとたび呼出される関数の各パラメータが評価されると、処理はループステップ3348(第33E図)からステップ3351に進む。ステップ3351においては、実行エンジン802(第8図)が、呼び出される関数のエクスターナルにおける実行の効果を表現する関数モデル構造体を抽出する。関数モデル構造体は、第11図〜第13図に関連して以前に説明してある。ステップ3351(第33E図)から、処理はステップ3352に進み、ここで実行エンジン802(第8図)が、呼び出される関数の実行のエミュレートについては後に詳しく説明する。ここで簡単に説明すると呼び出される関数のエミュレートは、上述の関数モデル(3)、(4)、及び(5)から形成される関数モデル構造体のような関数モデル構造体において特定された演算を適用することによって行われる。この呼び出された関数に対応する関数モデル構造体は、呼び出される関数のエクスターナルにおける実行の効果を表現する演算を特定する。ステップ3352(第33E図)の終了後、処理は、論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。 Once each parameter of the called function is evaluated, processing proceeds from loop step 3348 (FIG. 33E) to step 3351. In step 3351, the execution engine 802 (FIG. 8) extracts a function model structure that represents the effect of execution on the external of the called function. The function model structure has been previously described in connection with FIGS. From step 3351 (FIG. 33E), processing proceeds to step 3352, where the execution engine 802 (FIG. 8) emulates the execution of the called function, which will be described in detail later. Briefly described here, the function to be called emulates an operation specified in a function model structure such as the function model structure formed from the function models (3), (4), and (5) described above. Is done by applying The function model structure corresponding to the called function specifies an operation that expresses the effect of execution on the external of the called function. After completion of step 3352 (FIG. 33E), processing ends according to logic flow diagram 2902, ie, step 2902 (FIG. 29).
代入
上述のように、その式の演算子が関数の呼出しでない場合には、処理はテストステップ3347(第33E図)からテストステップ3353に進む。テストステップ3353においては、実行エンジン802(第8図)が、その関数の演算子が代入演算子であるか否かをその式を表現する式構造体のフィールド“kind”2202(第22図)と、代入演算子を指定するデータとを比較することによって判定する。C言語においては、代入演算子(即ち“=”)が、2つのオペランド、即ちlhs及びrhsに対して演算を施し、rhsの値をlhsに移す。代入は、移された値を有する項目に評価される。例えば、式“a=b”は、項目“b”の値を項目“a”に移し、項目“a”の新たな値を有する項目に評価される。
Substitution As noted above, if the expression operator is not a function call, processing proceeds from test step 3347 (FIG. 33E) to test
式の演算子が代入演算子でない場合には、処理は論理流れ図2902(第33A図〜第33E図)に従って、即ちステップ2902(第29図)に従って終了し、論理流れ図2902に従って処理された式はNULL値に評価される。NULL値は、有効値を持たない状態を示すために用いられる。 If the expression operator is not an assignment operator, processing ends according to logic flow diagram 2902 (FIGS. 33A-33E), ie, step 2902 (FIG. 29), and the expression processed according to logic flow diagram 2902 is Evaluates to a NULL value. The NULL value is used to indicate a state that does not have a valid value.
実行エンジン802(第8図)が、コンピュータプロセス内におけるサブジェクト関数の実行の文脈を欠いた式を適切に評価することができない場合には、式はNULL値に評価される。最も重要なことは、式の適切な評価ではなく、エクスターナル及びリソースのそれぞれの状態変化を追跡することである。この状態の正確な追跡を確実に行うために、式の評価はできる限り多く行われる。 If the execution engine 802 (FIG. 8) cannot properly evaluate an expression that lacks the subject function execution context in the computer process, the expression evaluates to a NULL value. The most important thing is not to properly evaluate the expression, but to track each external and resource state change. In order to ensure accurate tracking of this state, as many expressions are evaluated as possible.
逆にテストステップ3353(第33E図)において、式の演算子が代入演算子である場合には、処理はステップ3353に進む。ステップ3353においては、実行エンジン802(第8図)は、論理流れ図2900(第29図)に従って式のlhsを式そのものとして評価し、また演算は施さない。ステップ3354(第33E図)から、処理はステップ3355に進み、ここでは実行エンジン802(第8図)が論理流れ図2900(第29図)に従って式のrhsの評価を行い、また演算は施さない。処理はステップ3355(第33E図)からステップ3356に進み、ここでは実行エンジン802(第8図)が、式のrhsの評価によって生成された項目の値を、式のlhsの評価によって生成された項目に代入する。ステップ3356については、後に論理流れ図3356(第45図)に関連して詳細に説明する。ステップ3356(第33E図)の終了後、処理は論理流れ図2902に従って、即ちステップ2902(第29図)に従って終了する。
Conversely, in test step 3353 (FIG. 33E), if the expression operator is an assignment operator, processing proceeds to step 3353. In
従って、ステップ2804(第28図)においては、実行エンジン802(第8図)が、論理流れ図2900(第29図)に従って式の評価を行う。式の評価においては、実行エンジン802(第8図)が、前に詳しく説明したように、必要な場合にはエクスターナル及びリソースのそれぞれの状態に対して演算を施す。前に説明したように、式の評価に際しての演算の適用によって生ずる何らかの状態違反は、コンピュータプログラム610におけるエラーとしてユーザに通知される。
Accordingly, in step 2804 (FIG. 28), the execution engine 802 (FIG. 8) evaluates the expression according to the logic flow diagram 2900 (FIG. 29). In the expression evaluation, the execution engine 802 (FIG. 8) performs operations on the external and resource states as necessary, as described in detail above. As previously described, any state violation caused by the application of an operation in evaluating an expression is notified to the user as an error in the
宣言の処理
上述のように、宣言ステートメントはステップ2808(第28図)において処理されるが、このステップ2808は論理流れ図2808(第34図)において詳細に示されている。宣言ステートメントは、そのフィールド“pointers”が2つのポインタの配列であるステートメント構造体1416(第21図)のようなステートメント構造体によって表現される。上述のように、宣言ステートメントを表現するステートメント構造体の第1ポインタは宣言構造体1506(第16図)のような宣言構造体を指定し、第2ポインタは宣言された項目の初期値を定める式構造体を指定する。
Declaration Processing As described above, the declaration statement is processed in step 2808 (FIG. 28), which is shown in detail in logic flow diagram 2808 (FIG. 34). A declaration statement is represented by a statement structure such as a statement structure 1416 (FIG. 21) whose field “pointers” is an array of two pointers. As described above, the first pointer of the statement structure representing the declaration statement specifies a declaration structure such as the declaration structure 1506 (FIG. 16), and the second pointer defines the initial value of the declared item. Specifies an expression structure.
論理流れ図2808(第34図)に従った処理は、ステップ3402から開始され、このステップでは、項目構造体2700(第27図)のような項目構造体が、宣言された項目に対して生成される。生成された項目構造体を指定するポインタは、宣言構造体1506のフィールド“item”1608(第16図)に格納される。フィールド“type code”2712(第27図)は、宣言において指定されたデータの型に従って、即ち宣言構造体1506のフィールド“type”1606(第16図)に従って設定される。フィールド“initialized”2714(第27図)は、その項目が初期化されていないことを示すように設定される。
Processing according to logic flow diagram 2808 (FIG. 34) begins at
処理はステップ3402(第34図)からテストステップ3404に進み、ここでは実行エンジン802(第8図)が、その宣言ステートメントが、宣言された項目のための初期値を特定しているか否か、即ちその宣言ステートメントを表現するステートメント構造体の第2ポインタが、式構造体を指定しているか、若しくはNULL値であるか判定する。その宣言ステートメントが初期値を特定していない場合、即ち第2ポインタがNULLである場合には、処理は論理流れ図2808(第34図)に従って終了する。逆にその宣言ステートメントが初期値を特定する式を含んでいる場合、即ち第2ポインタが式ステートメントを指定している場合には、処理はテストステップ3404からステップ3406に進む。ステップ3406において、実行エンジン802(第8図)が、前に詳しく説明したように、論理流れ図2900(第29図)に従って式構造体によって表現された式を評価する。論理流れ図2900に従って式を評価するときに、演算は施されない。処理はステップ3406(第34図)からステップ3408に進み、そこでは式が評価される項目が宣言された項目に代入される。更に、宣言された項目を表現する項目構造体のフィールド“initialized”2714(第27図)が、その項目が初期化されたことを示すように設定される。
Processing proceeds from step 3402 (FIG. 34) to test
ステップ3408(第34図)の終了後、処理は論理流れ図2808に従って、ステップ2808(第28図)に従って終了する。従ってステップ2808においては、新たな項目が生成され、初期値が指定される場合にはその新たな項目がその初期値を有するように初期化される。
After step 3408 (FIG. 34) ends, processing ends according to logic flow diagram 2808 and step 2808 (FIG. 28). Accordingly, in
決定処理
上述のように、実行エンジン802(第8図)は、ステップ2812(第28図)において決定処理、即ち“if”ステートメントの処理を行う。ここでステップ2812は論理流れ図2812(第35図)に詳細に示されている。処理はステップ3502から開始されるが、ここでは実行エンジン802(第8図)が、論理流れ図2900(第29図)に従って“if”ステートメントの述語である式の評価を行い、演算pを適用する。C言語においては、“if”ステートメントは述語及び第2ステートメントを含む。
Determination Process As described above, the execution engine 802 (FIG. 8) performs the determination process, that is, the process of the “if” statement in step 2812 (FIG. 28). Here
この述語は、第2ステートメントが実行されるか否かを決定するブール値項目に評価される式である。例えば、ステートメント“if(a==b)ci1;”は、述語、即ち式“a==b”が、その値が“true”であるブール値項目に評価される場合、即ち項目“a”が項目“b”と等しい場合にのみ、第2ステートメント、即ちステートメント“ci1”が実行されるという処理を特定する。項目“a”が項目“b”と等しくない場合には、ステートメント“ci1”は実行されない。 This predicate is an expression that evaluates to a Boolean item that determines whether the second statement is executed. For example, the statement “if (a == b) ci1;” is a predicate, ie the expression “a == b”, evaluates to a Boolean item whose value is “true”, ie the item “a”. Specifies that the second statement, i.e. the statement "ci1", is executed only if is equal to the item "b". If item “a” is not equal to item “b”, statement “ci1” is not executed.
処理はステップ3502(第35図)からテストステップ3504に進み、ここでは実行エンジン802(第8図)が、述語が既知の値を有する項目に評価されたか否かを判定する。実行エンジン802はこの判定を、述語の評価によって生成された項目とNULLとを比較することによって行う。上述のように、実行エンジン802が式の評価を適切に行うことができない場合には、式はNULLに評価される。述語が既知の値を有する項目に、即ちNULL以外の値に評価された場合には、処理はテストステップ3504(第35図)からテストステップ3506に進む。
Processing proceeds from step 3502 (FIG. 35) to test
テストステップ3506においては、実行エンジン802(第8図)が、述語の評価によって生成された項目の値とブール値“true”とを比較する。述語が、“true”のブール値を有するブール値項目に評価された場合には、処理はステップ3508(第35図)に進み、そこで実行エンジン802(第8図)が、“if”ステートメントの第2ステートメントを実行する。第2ステートメントは、前に詳しく説明したように論理流れ図2800(第28図)に従って処理される。従って、論理流れ図2800は再帰的に実行される。
In a
一方、述語がブール値“false”に評価された場合には、処理はテストステップ3506(第28図)からステップ3510に進み、そこで実行エンジン802(第8図)が、後に詳述する制御レコードに、“else”条件を示すデータを格納する。制御レコードは、後に詳しく述べるように、サブジェクト関数の実行のエミュレーションにおいて適切な制御の流れを与えるために用いられる。ステップ3508(第35図)またはステップ3510の何れかが終了した後、処理は論理流れ図2812に従って、即ちステップ2812(第28図)に従って終了する。
On the other hand, if the predicate evaluates to the Boolean value “false”, processing proceeds from test step 3506 (FIG. 28) to step 3510, where execution engine 802 (FIG. 8) controls the control record described in detail later. The data indicating the “else” condition is stored. The control record is used to provide an appropriate control flow in the emulation of subject function execution, as will be described in detail later. After either step 3508 (FIG. 35) or
上述のように、実行エンジン802(第8図)は、テストステップ3504(第35図)において、述語が既知の値に評価された否かを判定する。述語が既知の値に評価されない場合、即ちNULLに評価されるか、未知の値を有する項目に評価された場合には、処理はテストステップ3504からステップ3512に進む。ステップ3512において、実行エンジン802(第8図)はその述語が評価されうるブール値をシミュレートする。一実施例においては、実行エンジン812(第8図)は、ブール値“true”またはブール値“false”からランダムに選択を行う。ステップ3512(第35図)から、処理はステップ3514に進む。
As described above, the execution engine 802 (FIG. 8) determines in the test step 3504 (FIG. 35) whether or not the predicate has been evaluated to a known value. If the predicate does not evaluate to a known value, i.e., evaluates to NULL or evaluates to an item with an unknown value, processing proceeds from
ステップ3514において、実行エンジン802(第8図)は、ステップ3512(第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”演算子との比較を行う、即ちその式を表現する式構造体のフィールド“kind”2202(第22図)と、“Not”演算子を特定するデータとの比較を行う。“Not”演算子(即ち“!”)は、1つのオペランドに対して演算を施し、演算結果としてそのオペランドの値の論理的否定をその値とする項目を生成する。例えば、式“!a”は、オペランド、即ち式“a”の否定である。
In
“Not” operator
Processing according to logic flow diagram 3600 begins at
式の演算子が“Not”演算子でない場合には、処理はテストステップ3602(第36図)から、以下に説明するテストステップ3606に進む。逆に、式の演算子が“Not”演算子である場合には、処理はテストステップ3602からステップ3606に進む。ステップ3606においては、実行エンジン802(第8図)が論理流れ図3600(第36図)に従ってオペランドを処理し、推定値の論理的否定を推定する。例えば、式“!(a&&b)”、即ちNOT(a AND b)が、“true”と推定された場合には、式“a&&b”が“false”と推定される。即ち、論理流れ図3600に従った処理は再帰的に実行される。ステップ3604の終了後、処理は論理流れ図3600に従って終了する。
If the expression operator is not a “Not” operator, processing proceeds from test step 3602 (FIG. 36) to test
“And”演算子または“Or”演算子
上述のように、式の演算子が“Not”演算子でない場合には、処理はテストステップ3602(第36図)からテストステップ3606に進む。テストステップ3606においては、実行エンジン802(第8図)が、式の演算子と“And”演算子及び“Or”演算子とを比較する。つまり、実行エンジン802は、その式を表現する式構造体のフィールド“kind”2202(第22図)と“And”演算子及び“Or”演算子を指定するデータとの比較を行うのである。上述のように、“And”演算子及び“Or”演算子(即ち“&&”及び“||”)は、2つのオペランド、即ちlhs及びrhsに演算を施し、演算結果として2つのオペランドの値の論理積及び論理和をその値とする項目を生成する。式の演算子が“And”演算子でも“Or”演算子でもない場合には、処理はテストステップ3606(第36図)から、後に説明するテストステップ3610に進む。逆に、式の演算子が“And”演算子、若しくは“Or”演算子の何れかである場合には、処理はテストステップ3606からステップ3608に進む。
“And” Operator or “Or” Operator As described above, when the operator of the expression is not the “Not” operator, the process proceeds from the test step 3602 (FIG. 36) to the
ステップ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図)の終了後、処理は論理流れ図3608に従って、即ちステップ3608(第36図)に従って終了する。
In
上述のように、演算子が“And”演算子でなく、若しくは推定値が“true”でない場合には、処理はテストステップ3702(第37図)からテストステップ3706に進む。テストステップ3706においては、実行エンジン802(第8図)が、式の演算子と“Or”演算子との比較を行い、かつ推定値とブール値“false”との比較を行う。式の演算子が“Or”演算子でなく、若しくは推定値が“false”でない場合には、処理は論理流れ図3608に従って、即ちステップ3608(第36図)に従って終了する。逆に、演算子が“Or”演算子であり、推定値が“false”である場合には、処理はテストステップ3706(第37図)からステップ3708に進む。
As described above, when the operator is not the “And” operator or the estimated value is not “true”, the process proceeds from the test step 3702 (FIG. 37) to the
ステップ3708において、各オペランド、即ち式のlhs及びrhsのそれぞれが、論理流れ図3600(第36図)に従って、推定値“false”と共に1つの式として処理される。このようなlhs及びrhsが“false”であるという推測は適切である。というのは、表現“a||b”が“false”である場合には、両オペランド、即ち“a”及び“b”が共に“false”でなければならないからである。上述のように、C言語の演算子“||”は、論理和演算を意味する。ステップ3708(第37図)の終了後、処理は論理流れ図3608に従って、即ちステップ3608(第36図)に従って終了する。
ステップ3608の終了後、処理は論理流れ図3600に従って終了する。
In
After
関係演算子
上述のように、式の演算子が“And”演算子でも、“Or”演算子でもない場合には、処理はテストステップ3606からテストステップ3610に進む。テストステップ3610においては、実行エンジン802(第8図)が式の演算子と、以下の関係演算子との比較を行う。その関係演算子とは即ち、より小さい(“<”)、より小さいか若しくは等しい(“<=”)、より大きい(“>”)、より大きいか若しくは等しい(“>=”)、等しい(“==”)、及び等しくない(“!=”)という関係を表す演算子である。詳述すると、実行エンジン802は、その式を表現する式構造体のフィールド“kind”2202(第22図)と、これらの関係演算子のそれぞれを指定するデータとの比較を行うのである。上述のように、関係演算子は、2つのオペランド、即ち式のlhs及びrhsに演算を施し、演算結果として、lhsとrhsとの関係に対応する値を有するブール値項目を生成する。式の演算子が関係演算子でない場合には、処理はテストステップ3610(第36図)から、後に説明するテストステップ3614に進む。逆に式の演算子が関係演算子である場合には、処理はテストステップ3610からステップ3612に進む。
Relational Operator As noted above, if the expression operator is neither the “And” operator nor the “Or” operator, processing proceeds from
ステップ3612においては、実行エンジン802(第8図)が、関係演算子の評価を行う。ステップ3612(第36図)は、ステップ3802から処理が開始される論理流れ図3612(第38図)に詳細が示されている。ステップ3802においては、実行エンジン802(第8図)が、lhs及びrhsの双方が既知であるか否か即ち既知の値を有する項目に評価されるか否かということ、及びlhs及びrhsの双方が未知であるか否か、即ち未知の値を有する項目に評価されるか否かということを判定する。項目構造体2700(第27図)によって表現される項目が未知の値を有する場合には、フィールド“type code”2712が項目の型が未知であることを表す。式のlhs及びrhsの双方が既知であるか、若しくはその双方が未知の場合には、論理流れ図3612(第38図)に従って、即ちステップ3612(第36図)に従って処理が終了するが、これは両オペランドが既知である場合には推測すべきものがなく、また両オペランドが共に未知の場合には推測し得るものがないからである。逆に、オペランドの一方が既知で他方が未知の場合には、処理はテストステップ3802(第38図)からテストステップ3804に進む。
In
テストステップ3804においては、実行エンジン802(第8図)が、何れかのオペランドが未定義であるか否かを判定する。オペランドが項目構造体によって表現される項目に評価されない場合、即ちオペランドがNULL値に評価される場合にはそのオペランドは未定義である。このような場合においては、推測値を代入すべき項目は存在しない。従って、一方のオペランドが未定義である場合には、処理は論理流れ図3612(第38図)に従って、即ちステップ3612(第36図)に従って終了する。逆に両オペランドが共に定義されている場合には、処理はテストステップ3804(第38図)から、テストステップ3806に進む。
In
テストステップ3806においては、実行エンジン802(第8図)が、式の演算子と“=”演算子及び“not equal”演算子とを比較し、推定値とブール値“true”及び“false”との比較を行う。(i)式の演算子が“=”演算子であり、推定値が“true”であるという条件、及び(ii)式の演算子が“not equal”演算子であり、推定値が“false”であるという条件の双方が満たされていない場合には、処理はテストステップ3806(第38図)から後に説明するテストステップ3814に進む。逆に、(i)式の演算子が“=”演算子であり、推定値が“true”であるという条件、及び(ii)式の演算子が“not equal”演算子であり、推定値が“false”であるという条件の何れか一方が満たされている場合には、処理はテストステップ3806からテストステップ3808に進む。
In
テストステップ3808において、1つのオペランドが既知の値であり、他方のオペランドは未知の値を有する。その値が既知であるオペランドは、“known item”に評価される。その値が未知のオペランドは“unknown item”に評価される。更に、テストステップ3808においては、2つのオペランドが等しい値を有することが推定される。テストステップ3808において、実行エンジン802(第8図)は、既知の項目がNULL値を有するか否かを判定する。(i)項目の型が、フィールド“type code”で、即ち項目構造体2700のフィールド“type code”2712(第27図)で指定されているように、“long”または“pointer”の何れかであることを示しているという条件、及び(ii)項目の値が、フィールド“value”において、即ち項目構造体2700のフィールド“value”2706において指定されているように、0であることを示しているという条件の双方が満たされている場合には、その項目はNULL値を有する。
In
既知の項目がNULL値を有する場合、処理はテストステップ3808(第38図)からステップ3810に進み、ここでは演算xを施すことにより、その末知の項目に関連するリソースに、無効という印付けがなされる。リソースが関連付けられた未知の項目の値が、その値がNULLである既知の項目に等しいと推定されることから、即ちそのリソースに対するポインタがNULLであると推定されることから、このリソースは無効である。 If the known item has a NULL value, processing proceeds from test step 3808 (FIG. 38) to step 3810, where an operation x is applied to mark the resource associated with the lesser known item as invalid. Is made. The resource is invalid because the value of the unknown item with which the resource is associated is presumed to be equal to a known item whose value is NULL, ie the pointer to the resource is presumed NULL It is.
処理はステップ3810からステップ3812に進む。更に、既知の項目がNULL値を有していない場合、処理はテストステップ3808から直接ステップ3812に進む。ステップ3812においては、既知の項目の値が、以下に詳しく説明する方法で未知の値に代入される。従って、既知の項目の値は、その既知の項目と未知の項目とが等しいと推定される場合には既知の項目の値から推測される。ステップ3812が終了した後、処理は論理流れ図3612に従って、即ちステップ3612(第36図)に従って終了する。
Processing proceeds from
上述のように、(i)式の演算子が、“=”演算子であり、推定値が“true”であるという条件、及び(ii)式の演算子が“not equal”演算子であり、推定値が“false”であるという条件の双方が満たされない場合には、処理はテストステップ3806(第38図)からテストステップ3814に進む。テストステップ3814においては、実行エンジン802(第8図)が、(i)式の演算子が“not equal”演算子であり、推定値が“true”であるという条件を満たすか否か、または(ii)式の演算子が“=”演算子であり、推定値が“false”であるという条件を満たすか否かということを判定する。条件(i)も、条件(ii)も何れもが満たされない場合には、論理流れ図3612に従って、即ちステップ3612(第36図)に従って処理が終了する。そうでない場合、即ち条件(i)若しくは条件(ii)の何れかが満たされる場合には、処理はテストステップ3814(第38図)からテストステップ3816に進む。
As described above, the condition that the operator of the expression (i) is the “=” operator and the estimated value is “true”, and the operator of the expression (ii) is “not”. If both the “equal” operator and the condition that the estimated value is “false” are not satisfied, the process proceeds from the test step 3806 (FIG. 38) to the
テストステップ3816においては、実行エンジン802(第8図)が2つのオペランド、即ちlhs及びrhsが互いに等しくないことを推測する。既知の項目がNULL値を有する場合は、未知の項目が非NULL値を有するものと推測される。C言語の様々なインプリメンテーションの文脈においては、NULLは値ゼロである。従って、未知の項目は非ゼロ値を有するものと推測される。テストステップ3816(第38図)においては、実行エンジン802(第8図)が、既知の項目の値とNULLとを比較する。既知の項目の値がNULLでない場合には、処理は論理流れ図3612(第38図)に従って終了する。逆に、既知の項目の値がNULLである場合は、処理はテストステップ3818に進む。
In
テストステップ3818においては、実行エンジン802(第8図)が、状態Qにあるリソースが既知の項目に関連付けられているか否かを判定する。上述のように、リソースが割り当てられた状態、割り当てられていない状態、または無効状態の何れにあるかが未知である場合には、リソースは状態Qにある。未知の項目が状態Qにあるリソースと関連付けられている場合には、処理はステップ3820(第38図)に進み、ここでは演算aが、その未知の項目に関連付けられたリソースに対して施される。リソースが関連付けられている項目がNULLと等しくないことが推定されていることから、そのリソースを明確に割り当てられた状態におくために演算aが施されるのである。ステップ3820から、処理はステップ3822に進む。更に、未知の項目が状態Qにあるリソースに関連付けられていない場合には、処理はテストステップ3818から直接ステップ3822に進む。
In
ステップ3822において、その未知の項目を表現する項目構造体のフィールド“type code”2712(第27図)は、その項目が非ゼロであることを示すように設定され、その未知の項目を表現する項目構造体のフィールド“invalid pointer”2720は、その未知の項目は無効ポインタ、即ちNULL値を有していないことを示すように設定される。ステップ3822の終了後、処理は論理流れ図3612に従って終了する。
In
従って、論理流れ図3612に従って、即ちステップ3612(第36図)に従って、その式のオペランドの1つが既知であり、他のオペランドが既知ではなくかつ両オペランドが等しいと推定されるとき、若しくは等しくないと推定されているときには推測がなされる。推測がなされるのは、式の両オペランドの値、及び式のオペランドに関連するリソースの状態の双方についてである。ステップ3612が終了した後、処理は論理流れ図3600に従って終了する。
Thus, according to logic flow diagram 3612, ie, according to step 3612 (FIG. 36), when one of the operands of the expression is known and the other operand is not known and both operands are assumed to be equal or not equal. When it is estimated, a guess is made. The guess is made for both the value of both operands of the expression and the state of the resource associated with the operand of the expression. After
複合演算子
上述のように、式の演算子が関係演算子でない場合には、処理はテストステップ3610からテストステップ3614に進む。テストステップ3614において、実行エンジン802(第8図)は、式の演算子と複合演算子(“,”)とを比較する。つまり、実行エンジン802は、その式を表現する式構造体のフィールド“kind”2202(第22図)と、複合演算子を指定するデータとの比較を行うのである。複合演算子は2つのオペランド、即ちlhs及びrhsに対して演算を施す。ここでlhs及びrhsの双方が評価され、式はrhsに評価される。例えば、式“a,b”の評価では、オペランド“a”とオペランド“b”の双方の評価を行った上で、その式“a,b”が“b”に評価される。
Compound Operator As noted above, if the expression operator is not a relational operator, processing proceeds from
演算子が複合演算子である場合には、処理はステップ3616(第36図)に進み、そこでは実行エンジン802(第8図)が論理流れ図3600(第36図)に従って処理を行い、推定値として、その式が評価されると推定されるブール値を与える。rhsの値はその式の推定値から推測されるが、これはその式がrhsに評価されるからである。例えば、式“a==b,c==d”が真であると推定される場合には、rhS、即ち式“c==d”が真であると推測される。従って、処理は論理流れ図3600に従って、ステップ3616において、処理は論理流れ図3600に従って再帰的に式のrhsに施される。ステップ3616の終了後、処理は論理流れ図3600に従って終了する。演算子が複合演算子でない場合には、処理は論理流れ図3600に従って終了し、またステップ3616はスキップされる。
If the operator is a compound operator, processing proceeds to step 3616 (FIG. 36), where execution engine 802 (FIG. 8) performs processing according to logic flow diagram 3600 (FIG. 36) to provide an estimate. Gives a Boolean value that is estimated to evaluate the expression. The value of rhs is inferred from the estimated value of the expression because the expression evaluates to rhs. For example, if the expression “a == b, c == d” is estimated to be true, then rhS, that is, the expression “c == d” is estimated to be true. Accordingly, processing is performed recursively on the rhs of the expression according to logic flow diagram 3600 and at
従って、上述のように、論理流れ図3600に従って、式及び部分式(subexpression)を再帰的に処理することによって、実行エンジン802(第8図)はステップ3514(第35図)において実行し得る限り、式の推定値から式の項目及び式の項目に関連するリソースについての推測を行う。処理はステップ3514から前に説明したテストステップ3506に進む。
Thus, as described above, as long as execution engine 802 (FIG. 8) can execute in step 3514 (FIG. 35) by recursively processing expressions and subexpressions according to logic flow diagram 3600, Estimate the items related to the formula item and the formula item from the estimated value of the formula. Processing proceeds from
従って、ステップ2812(第28図)において、論理流れ図3812に従い、実行エンジン802(第8図)は“if”ステートメントにおける決定処理を行うのである。
Accordingly, in step 2812 (FIG. 28), the execution engine 802 (FIG. 8) performs the decision process in the “if” statement according to the
戻り(return)処理
上述のように“return”ステートメントはステップ2816において処理される。“return”ステートメントは、関数の実行を終了し、戻り値項目が定義されている場合にはその関数の戻り値項目に値を代入する。ステップ2816は、処理がステップ3902から開始される論理流れ図2816(第39図)に詳細に示されている。
Return Processing As described above, the “return” statement is processed in
ステップ3902においては、実行エンジン802(第8図)が、“return”ステートメントが戻り値項目を指定しているか否かを判定する。“return”ステートメントは、それが式を含んでいる場合、戻り値項目を指定する。例えば、ステートメント構造体1416(第21図)が“return”ステートメントを表現している場合、フィールド“pointers”2110は、式構造体を指定する1つのポインタであるか、若しくはNULLである。“return”ステートメントが戻り値項目を指定する場合、即ちフィールド“pointers”2110が式構造体を指定している場合、処理はテストステップ3902(第39図)からステップ3904に進み、ここで“return”ステートメントの式が論理流れ図2900(第29図)に従って評価され、また、演算は施されない。ステップ3904(第39図)において“return”ステートメントの式の評価において演算は施されないが、前にステップ3306、3307、及び3314(第33A−B図)に関連して説明したように、式のオペランドに何らかの演算を施すことも可能である。ステップ3904(第39図)から処理はステップ3906に進み、ここでは実行エンジン802(第8図)がステップ3904(第39図)において式の評価を行うことにより生成された項目を、サブジェクト関数の戻り値項目を表現する項目構造体に代入する。1つの項目の値を他の項目に代入することに関しては、後に詳しく説明する。
In
処理はステップ3906からステップ3908に進む。また、“return”ステートメントが戻り値項目を指定していない場合、処理はテストステップ3902から、直接ステップ3908に進む。ステップ3908においては、実行エンジン802(第8図)が、後に詳述するように、サブジェクト関数の実行のエミュレーション時においてサブジェクト関数を通る制御の流れを与えるのに用いられる“return”条件を示すデータを、制御レコード内に格納する。ステップ3908(第39図)の後、処理は論理流れ図2816に従って、即ちステップ2816(第28図)に従って終了する。
Processing proceeds from
ブロック処理
多くの関数においては、ステートメントのブロックがその関数の挙動を規定する。C言語の文脈においては、ステートメントのブロックは、それ自体がブロックステートメントである始め括弧、即ち“{”と、終わり括弧、即ち“}”との間に囲まれている。C言語で規定される関数においては、一般的にステートメントの第1ブロックが、ステートメントの第2ブロックを含んでいる。例えば、ソースコードの抜粋(1)は、第9行から第32行までのステートメントの第1ブロックの中に、第16行から第21行までのステートメントの第2ブロックを含んでいる。このとき、ステートメントの第1ブロックは、ステートメントの第2ブロックのスーパーブロックであり、ステートメントの第2ブロックはステートメントの第1ブロックのサブブロックである。
Block processing In many functions, a block of statements defines the behavior of the function. In the context of the C language, a block of statements is enclosed between an opening parenthesis, “{”, and an closing parenthesis, “}”, which is itself a block statement. In a function defined in the C language, a first block of statements generally includes a second block of statements. For example, the source code excerpt (1) includes the second block of statements from the 16th line to the 21st line in the first block of statements from the 9th line to the 32nd line. At this time, the first block of the statement is a superblock of the second block of the statement, and the second block of the statement is a sub-block of the first block of the statement.
(p118b)上述のように、ブロックステートメント構造体は、ステートメント構造体、即ちブロックの第1ステートメントを表現しているステートメント構造体1416(第21図)を指定するポインタを含む。ステートメント構造体1416は上述のように、ブロックの各ステートメントを表現するステートメント構造体のシングルリンクトリスト(singly−linked list)を維持するために用いられるフィールド“next”2106を含んでいる。上述のように、ブロックステートメントはステップ2820(第28図)において処理され、このステップ2820については論理流れ図2820(第40図)にその詳細が示されており、またこの論理流れ図は、ブロックのステートメントの実行のエミュレーションのためのステートメントのブロックのステートメント構造体の処理について説明している。
(P118b) As described above, the block statement structure includes a pointer that points to the statement structure, ie, the statement structure 1416 (FIG. 21) representing the first statement of the block. The
ステップ4002においては、実行エンジン802(第8図)が、ブロックの第1ステートメントを表現するステートメント構造体を検索する。上述のように、そのブロックの第1ステートメントを表現するステートメント構造体は、ブロックステートメント構造体によって指定されている。検索されたステートメント構造体は、現ステートメント構造体である。処理はステップ4002(第40図)からテストステップ4004に進む。
In
テストステップ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”に評価される。現ステートメント構造体が“else”ステートメントを表現していないか、若しくは制御レコードが“else”条件を示していない場合には、処理はテストステップ4004(第40図)からステップ4006に進み、ここで現ステートメント構造体によって表現されたステートメントの実行が、上述のように、論理流れ図2800(第28図)に従ってエミュレートされる。逆に、現ステートメント構造体が“else”ステートメントを表現し、かつ制御レコードが“else”条件を示していない場合には、処理はテストステップ4004(第40図)から以下に説明するステップ4014に進み、ステップ4006はバイパスされる。
In
上述のように、ステートメントのブロックはサブブロックを含み得る。また、上述のように、ステップ4006において、現ステートメント構造体は論理流れ図2800(第28図)に従って処理される。従って、ステップ4006(第40図)におけるブロックステートメントの実行により、ステップ2820(第28図)が再帰的に実行され、従って論理流れ図2820(第40図)の各ステップが再帰的に実行されて、サブブロックの実行のエミュレーションが行われる。ひとたびサブブロックのステートメントが論理流れ図2820に従って処理されると、ステップ4006におけるブロックステートメントの処理は完了し、サブブロックのステートメントの論理流れ図2820に従った処理は続行される。処理はステップ4006からテストステップ4008に進む。
As described above, a block of statements can include sub-blocks. Also, as described above, at
テストステップ4008においては、実行エンジン802(第8図)が、論理流れ図2800(第28図)に関連して上述したようにステートメントの実行のエミュレーションによって設定された制御レコードと、“return”条件、“exit”条件、若しくは“long jump”条件を示すデータとの比較を行う。ステップ3908(第39図)に関連して上述したように、ステップ4006(第40図)において、“return”ステートメントの実行のエミュレーション時に、制御レコードは“return”条件を示すように設定される。“exit”条件は、実行エンジン802(第8図)がライブラリ関数exit () の呼出しを処理するときに生起する。このライブラリ関数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に進む。
In
テストステップ4010においては、実行エンジン802(第8図)が制御レコードと、“break”条件若しくは“continue”条件を示すデータとを比較する。ステップ4006においては、“break”ステートメント若しくは“continue”ステートメントの実行のエミュレーション時に、制御レコードが、“break”条件若しくは“continue”条件を示すように設定される。制御レコードが“break”条件若しくは“continue”条件の何れかを示すように設定されている場合、処理はステップ4010に進み、ここで制御レコードが“next”条件を示すように設定され、処理は論理流れ図2820に従って終了する。
In a
“next”条件は、ブロックの“next”ステートメントの実行がエミュレートされる場合の一般的な処理条件である。従って、ステートメントの現ブロックが“break”ステートメントを実行する場合、現ブロックの処理は終了し、処理は現ブロックのスーパーブロック内における現ブロックのすぐ後に続くステートメントに進む。これに対して、“return”条件は制御レコードをリセットしない。従って、ステップ4006における“return”ステートメントの実行のエミュレーションにより、上述のテストステップ4008を通した現ブロックの処理が終了し、同様に現ブロックの任意のスーパーブロックの処理も終了する。
The “next” condition is a general processing condition when the execution of the “next” statement of the block is emulated. Thus, if the current block of statements executes a “break” statement, processing of the current block ends and processing proceeds to the statement immediately following the current block in the superblock of the current block. In contrast, the “return” condition does not reset the control record. Therefore, the emulation of the execution of the “return” statement in
一方、制御レコードが“break”条件も“continue”条件をも示していない場合には、処理はテストステップ4010からステップ4014に進む。更に、現ステートメント構造体が“else”ステートメントを表現し、制御レコードが上述のように“else”条件を示していない場合には、処理はテストステップ4004から4014に進む。ステップ4014においては、実行エンジン802(第8図)が現ステートメント構造体のフィールド“next”2106(第21図)を検索し、検索されたステートメント構造体を現ステートメント構造体にして、前の現ステートメント構造体を置き換える。
On the other hand, if the control record indicates neither a “break” condition nor a “continue” condition, the process proceeds from
処理はステップ4014(第40図)からテストステップ4016に進み、ここで実行エンジン802(第8図)が、現ステートメント構造体を指定するポインタとNULLとを比較する。現ステートメント構造体を指定するポインタがNULLである場合には、ステートメントのブロックの最終ステートメントが論理流れ図2820(第40図)に従って処理され、処理は論理流れ図2820に従って終了する。逆に、現ステートメント構造体を指定するポインタがNULLでない場合には、処理はテストステップ4016から、上述のテストステップ4004に進む。
Processing proceeds from step 4014 (FIG. 40) to test
従って、ステートメントのブロックの実行はエミュレートされ、ステートメントのブロックにおける制御の流れは、論理流れ図2820(第40図)の通りに流れることになる。 Accordingly, execution of the block of statements is emulated and the flow of control in the block of statements flows as shown in logic flow diagram 2820 (FIG. 40).
リークの処理
上述のように、サブジェクト関数のステートメントの実行がひとたびエミュレートされると、ステップ2606(第26図)においてリーク(leak)が検出される。ステップ2606については論理流れ図2606(第41図)にその詳細が示されている。処理は論理流れ図2606に従ってループステップ4102から開始される。ループステップ4102及びNEXTステップ4106はループを形成し、その中でサブジェクト関数の各エクスターナルがステップ4104に従って処理される。ステップ4104においては、実行エンジン802(第8図)が、エクスターナルが到達可能な全てのリソースに印付けを行う(mark)。そのリソースがエクスターナル若しくはそのエクスターナルを含む集群(bunch)における任意の項目に関連付けられている場合には、そのリソースはエクスターナルが到達可能なリソースである。集群については以下に詳しく説明する。説明のための例を用いると、集群型である配列の要素が関連付けられたリソースは、その配列の任意の要素から到達可能である。
Leak Processing As described above, once execution of a subject function statement is emulated, a leak is detected in step 2606 (FIG. 26). Details of
リソース、即ちリソース状態構造体3100(第31図)によって表現されたリソースは、リソース状態構造体3100のフィールド“mark”3114を、それを示すように設定することによって印付けされる。各エクスターナルによって到達可能な各リソースが、ループステップ4102(第41図)及びNEXTステップ4106によって形成されたループの中でひとたび印付けされると、処理はループステップ4106からループステップ4108に進む。
The resource, ie the resource represented by the resource state structure 3100 (FIG. 31), is marked by setting the field “mark” 3114 of the
ループステップ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に進む。
In the
更に、処理はステップ4112からNEXTステップ4114へ進む。処理はNEXTステップ4114からループステップ4108に進み、そこで次のリソースが上述のように処理されて、最終的に全てのリソースが処理される。ひとたび各リソースが、ループステップ4108及びNEXTステップ4114が形成するループにおいて処理されると、論理流れ図2606に従って、即ちステップ2606(第26図)に従って処理は終了する。
Further, processing proceeds from
従って、リークは検出され、論理流れ図2606に従って、即ちステップ2606(第26図)に従ってそれが通知される。 Thus, a leak is detected and notified according to logic flow diagram 2606, ie according to step 2606 (FIG. 26).
エクスターナルの構築
上述のように、ステップ2608において、各エクスターナルは論理流れ図4200(第42図)に従って構築される。論理流れ図4200に従った処理はテストステップ4202から開始されるが、このステップでは実行エンジン802(第8図)が、リソースがそのエクスターナルに関連付けられているか否かを判定する。説明のための例を用いて、エクスターナルリスト構造体1414(第15図)によって表現されたエクスターナルにリソースが関連付けられているか否かの判定について以下説明する。フィールド“first decl”1502は宣言構造体1506を指定しこの宣言構造体はフィールド“item”1608を含む。フィールド“item”1608は項目構造体、即ち項目構造体2700を指定する。項目構造体2700のフィールド“resource”2702(第27図)が、リソース状態構造体を指定している場合、エクスターナルリスト構造体1414(第15図)によって表現されたエクスターナルに、リソースは関連付けられている。そのエクスターナルが、例えばリソース状態構造体3100(第31図)によって表現されたリソースに関連付けられている場合、処理はテストステップ4202(第42図)からステップ4204に進み、ここでフィールド“state”3102(第31図)が検索される。処理はステップ4204から後に説明するステップ4210に進む。
External Construction As described above, in
そのエクスターナルに関連付けられたリソースが存在しない場合には、処理はテストステップ4202からテストステップ4206に進む。テストステップ4206においては、実行エンジン802(第8図)が、そのエクスターナルが無効ポインタであるか否かを判定する。エクスターナルの型は、そのエクスターナルに関連付けられた項目を表現する項目構造体のフィールド“type code”2712(第27図)によって指定され、それがVALUE TYPE NON ZEROである場合には、そのエクスターナルは無効ポインタである。型VALUE TYPE NON ZEROは、その項目がゼロ以外の値を有することを示す。そのエクスターナルに関連付けられた項目を表す項目構造体のフィールド“invalid pointer”、即ちフィールド“invalid pointer”2720がそれを示している場合、若しくはそのエクスターナルの値が0または−1である場合には、エクスターナルは無効ポインタである。
If there are no resources associated with the external, processing proceeds from
そのエクスターナルが無効ポインタである場合には、処理はテストステップ4204(第42図)からステップ4208に進み、そこでそのエクスナルのリソースの状態が状態Xに設定される。例えば、リソース状態構造体3100(第31図)によって表現されるリソースが、エクスターナル状態構造体3000(第30図)によって表現されたエクスターナルに関連付けられている場合には、状態Xを示すデータがフィールド“state”3102(第31図)に格納される。ステップ4208(第42図)から、処理はステップ4210に進む。更に、処理は、上述のようにステップ4204から、またエクスターナルが無効ポインタでない場合にはテストステップ4206からステップ4210に進む。
If the external is an invalid pointer, processing proceeds from test step 4204 (FIG. 42) to step 4208 where the state of the resource of the external is set to state X. For example, if the resource represented by the resource state structure 3100 (FIG. 31) is associated with the external represented by the external state structure 3000 (FIG. 30), the data indicating the state X is the field. It is stored in “state” 3102 (FIG. 31). From step 4208 (FIG. 42), processing proceeds to step 4210. Further, processing proceeds from
ステップ4210において、エクスターナルの複合RS,DK及びCP状態が更新される。状態の構成は、第3B図、第4B図、及び第5B図に関連して前に詳しく説明した。ステップ4210の終了後、処理は論理流れ図4200に従って終了する。
In
関数の出力モデル
上述のように、モデルマシン808(第8図)は、ステップ2412(第24図)においてサブジェクト関数のモデルを生成し、格納する。ステップ2412は、論理流れ図2412(第43図)に詳細が示されている。処理はステップ4302から開始され、ここではモデルマシン808(第8図)が関数モデル構造体1100(第11図)のような関数モデル構造体の割り当て及び初期化を行う。関数モデル構造体1100は、一実施例においては、フィールド“name”1102、フィールド“description”1108、フィールド“file”1110、フィールド“line”1112、及びフィールド“automated”1106に、(i)その挙動が関数モデル構造体1100においてモデル化されている関数の識別子、(ii)その関数のテキスト形式の記述、(iii)ソースコードファイルの名称、(iv)その関数が定義されているソースコードファイル内の行、及び(v)その関数が自動的にモデル化されたことを示すブール値を、それぞれ格納することによって初期化される。その関数のモデルがモデルマシン808(第8図)によって生成された場合、関数は自動的にモデル化される。逆に、その関数のモデルが、ユーザがコンピュータ100(第1図)においてテキストエディタ(図示せず)を用いて生成した場合、その関数は手動でモデル化される。例えば、ライブラリ関数fopen () 、malloc () 、及びfree () は、手動でモデル化される。関数モデル構造体のフィールド“automated”1116(第11図)は、上述のようにステップ904(第9図)においてモデル記述ファイル604(第6図)から呼出しを行うが、これはその関数が手動でモデル化されるということを示すように設定される。
Function Output Model As described above, the model machine 808 (FIG. 8) generates and stores a model of the subject function in step 2412 (FIG. 24).
ステップ4306(第43図)から、処理はステップ4304に進み、そこでエクスターナルモデル構造体1200(第12図)のようなエクスターナルモデル構造体が、そのサブジェクト関数の各エクスターナルに対して生成され、対応する関数モデル構造体におけるエクスターナルモデル構造体のシングルリンクトリストに挿入される。例えば、フィールド“first external”1104(第11図)及びフィールド“last external”1106は、上述のように、関数モデル構造体1100をエクスターナルモデル構造体のシングルリンクトリストに関連付けるために用いられる。1つのエクスターナルの処理は、ステップ4304(第43図)に従って行われるが、この処理は論理流れ図4400(第44図)に示されている。
From step 4306 (FIG. 43), processing proceeds to step 4304, where an external model structure, such as external model structure 1200 (FIG. 12), is generated for and corresponding to each external of the subject function. It is inserted into the single linked list of the external model structure in the function model structure. For example, the field “first external” 1104 (FIG. 11) and the field “last external” 1106 are used to associate the
論理流れ図4400に従って処理はステップ4402から開始されるが、ここではモデルマシン808(第8図)がエクスターナルの型、即ちそのエクスターナルがパラメータであるか、戻り値項目であるか、若しくは項目(即ち、グローバルに定義された項目またはスタティックな項目)であるかを判定する。そのエクスターナルがパラメータである場合は、モデルマシン808(第8図)はサブジェクト関数の定義におけるパラメータの位置を判定する。第1パラメータはパラメータ番号ゼロであって、最終パラメータの番号は、サブジェクト関数に対して定義されたパラメータ番号より1小さい。そのエクスターナルが項目である場合には、モデルマシン808(第8図)がその項目の識別子を判定する。そのエクスターナルの型は、上述のように、エクスターナルモデル構造体1200(第12図)のフィールド“type”1204に格納される。同様に、パラメータ番号が求められた場合には、そのパラメータ番号はフィールド“parameter number”1206に格納され、項目が求められた場合には、その項目の識別子がフィールド“name”1208に格納される。
Processing begins at
処理はステップ4402からステップ4404に進み、そこではモデルマシン808(第8図)が演算の数を判定し、サブジェクト関数の実行のエミュレーション時に、エクスターナルに施される特定の演算を判定する。ステップ4404においては、演算及び施される演算の数が、そのエクスターナルの複合DK状態に従って判定される。次の表Nはエクスターナルの複合DK状態から導かれる演算及び演算の数の概要を示したものである。
Processing proceeds from
従って、例えば、エクスターナルの複合DK状態が状態Aである場合には、サブジェクト関数の実行のエミュレーションにおいて、演算aがそのエクスターナルに施される。また、エクスターナルの複合DK状態が状態KQである場合には、サブジェクト関数の実行のエミュレーションにおいて、演算kが、次いで演算mがそのエクスターナルに施される。上述のように、エクスターナルの複合状態は、サブジェクト関数の実行の多重エミュレーションの包括的な効果を特定する。従って、エクスターナルの複合状態から導かれた演算は、そのエクスターナル上でのサブジェクト関数の実行の累積的な効果のエッセンス(distillation)を表現する。 Therefore, for example, when the external composite DK state is the state A, the operation a is performed on the external in the emulation of the execution of the subject function. Also, when the external composite DK state is the state KQ, in the emulation of the execution of the subject function, the operation k and then the operation m are performed on the external. As noted above, the external composite state identifies the global effect of multiple emulation of subject function execution. Thus, operations derived from the composite state of the external represent the essence of the cumulative effect of executing the subject function on that external.
処理は、ステップ4404からテストステップ4406に進み、このステップではモデルマシン808(第8図)がそのエクスターナルに施される演算の数とゼロとの比較を行う。そのエクスターナルに施される演算の数がゼロに等しい場合には、処理はステップ4408(第44図)に進み、そこでモデルマシン808(第8図)が演算の数を判定し、かつそのエクスターナルの複合CP状態に従ったサブジェクト関数のエミュレーション時にそのエクスターナルに施される特定の演算を求める。以下の表Oは、エクスターナルの複合CP状態から導かれる演算及び演算の数の概要を示したものである。
Processing proceeds from
従って、エクスターナルの複合DK状態による、そのエクスターナル上でサブジェクトルーチンの実行の累積的効果に関する情報の供給が不十分である場合には、そのエクスターナルの複合CP状態が、サブジェクト関数の実行の累積的効果を判定するために用いられる。説明のための例を用いると、エクスターナルの複合CP状態が状態iである場合、サブジェクト関数のエミュレーションにより、そのエクスターナルに演算iが施される。ステップ4404(第44図)またはステップ4408の何れかにおいて、そのエクスターナルに施される演算及び演算の数は、エクスターナルモデル構造体120のフィールド“operations”1214(第12図)及び“number of operations”1212にそれぞれ格納される。処理はステップ4408(第44図)からステップ4410に進む。更に、モデルマシン808(第8図)が、テストステップ4406(第44図)において、ステップ4404において判定されたようにそのエクスターナルに施される演算の数がゼロであると判定された場合、処理はテストステップ4406から直接ステップ4410に進む。
Thus, if the external composite DK state does not provide enough information on the cumulative effect of subject routine execution on the external, the external composite CP state is the cumulative effect of subject function execution. Is used to determine Using an example for explanation, when the composite CP state of the external is the state i, the operation i is performed on the external by emulation of the subject function. In either step 4404 (FIG. 44) or
ステップ4410において、モデルマシン808(第8図)は、エクスターナルの複合RS状態から、そのエクスターナルに関連付けられたリソースの初期状態を判定する。つまり、そのエクスターナルの複合RS状態はエクスターナルモデル構造体1200のフィールド“initial state”1220(第12図)に格納される。エクスターナルの複合RS状態は、そのエクスターナルに関連するリソースに対するサブジェクト関数の実行の累積的効果を反映する。処理はステップ4410(第44図)からテストステップ4412に進み、そこではモデルマシン808(第8図)が、そのエクスターナルの複合RS状態と、そのエクスターナルに関連付けられたリソースが存在しないことを示す状態NONEとを比較する。そのエクスターナルに関連付けられたリソースが存在しない場合、処理はテストステップ4412(第44図)からステップ4414に進み、そこではブール値“false”が、エクスターナルモデル構造体1200のフィールド“new resource”1218(第12図)に格納される。逆に、リソースがそのエクスターナルに関連付けられている場合、即ちそのエクスターナルの複合RS状態がNONE以外である場合には、処理はテストステップ4412(第44図)からステップ4416に進む。ステップ4416においては、モデルマシン808(第8図)がエクスターナルモデル構造体1200のフィールド“new resource”1218(第12図)にブール値“true”を格納し、サブジェクト関数のエミュレーションにより、そのエクスターナルに関連付けられた新たなリソースが生成されることを示すようにする。
In step 4410, the model machine 808 (FIG. 8) determines the initial state of the resource associated with the external from the external composite RS state. That is, the external composite RS state is the field “initial” of the
処理はステップ4414(第44図)、若しくはステップ4416の何れかからステップ4418に進み、そこでモデルマシン808(第8図)がエクスターナルモデル構造体1200(第12図)を、関数モデル構造体1100(第11図)のエクスターナルモデル構造体のシングルリンクトリストに挿入する。ステップ4418(第44図)の終了後、処理は論理流れ図4400に従って終了する。
Processing proceeds from either step 4414 (FIG. 44) or
サブジェクト関数の各エクスターナルが、ステップ4304(第43図)において論理流れ図4400に従って処理された後、処理はステップ4306に進み、そこでサブジェクト関数を表現する関数モデル構造体1100(第11図)が、全ての関数モデル構造体を含むデータ構造体に格納される。ステップ4306の終了後、処理は論理流れ図2412に従って、即ちステップ2412(第24図)に従って終了する。次いで、格納された関数モデル構造体によって表現される関数モデルが、後に詳しく説明するようにサブジェクト関数の呼出しを行う他の関数の解析を行うときに、そのサブジェクト関数の実行をエミュレートするために用いられ得る。
After each external of the subject function has been processed in step 4304 (FIG. 43) according to logic flow diagram 4400, processing proceeds to step 4306 where a function model structure 1100 (FIG. 11) representing the subject function is all Are stored in a data structure including a function model structure. After
1つの項目の値の他の項目への代入
上述のように、ステップ3356(第33C図)において、一方の項目、即ちrhsの値が、他の項目、即ちlhsに代入される。ステップ3356は、論理流れ図3356(第45図)に詳細に示されており、ここでは、処理がテストステップ4502から開始される。テストステップ4502においては、実行エンジン802(第8図)が、lhs及びrhsが項目によって表現されるか否かを判定する。上述のように、lhs若しくはrhs等の式は、実行エンジン802がその式を評価するための十分な情報を有している場合には1つの項目に評価され、他の場合にはNULL値に評価される。式が1つの項目に評価される場合には、その式はその項目によって表現される。lhs若しくはrhsの何れかが1つの項目によって表現されない場合には、処理はテストステップ4502(第45図)から、以下に説明するテストステップ4510に進む。逆にlhs及びrhsの双方が1つの項目によって表現される場合には、処理はテストステップ4502からステップ4504に進む。
Substitution of the value of one item into another item As described above, in step 3356 (FIG. 33C), the value of one item, ie, rhs, is assigned to the other item, ie, lhs.
ステップ4504においては、lhsを表現する項目、即ちlhs項目のフィールドが、それに対応するrhsを表現する項目、即ちrhs項目と等しく形成される。詳述すると、項目構造体2700フィールド“resource”2702(第27図)、“external”2704、“value”2706、“type code”2712、“initialized”2714、及び“invalid pointer”2720のそれぞれに対応するrhs項目のフィールドに、データが格納される。処理はステップ4504(第45図)からテストステップ450に進み、そこでは実行エンジン802(第8図)がrhsが初期化されたか否かを判定する。実行エンジン802は、項目構造体270のフィールド“initialized”2714(第27図)に対応するrhs項目のフィールドと、ブール値“false”とを比較することによってこのような判定を行う。
In
rhsが初期化されている場合、即ち項目構造体2700のフィールド”initialized”2714(第27図)に対応するrhs項目のフィールドが、ブール値“true”を有している場合には、処理は論理流れ図3356に従って、即ちステップ3356(第33E図)に従って終了する。逆に、rhsが初期化されていない場合、即ち項目構造体2700のフィールド“initialized”2714(第27図)に対応するrhs項目のフィールドがブール値“false”を有している場合には、処理はテストステップ4506(第45図)からステップ4508に進む。ステップ4508においては、上述のようにエラーメッセージがエラーログファイル及び/若しくはビデオモニタ118上のディスプレイに対して送られて、初期化されていないデータが使用されていることを警告する。フィールド“initialized”2714(第27図)に対応するrhs項目のフィールドが、上述のようにステップ4504において、lhs項目における対応するフィールドにコピーされることから、lhs項目も初期化されていない旨の印付けがなされる。ステップ4508(第45図)が終了した後、論理流れ図3356に従って、即ちステップ3356(第33C図)に従って処理を終了する。
If rhs is initialized, that is, if the field of the rhs item corresponding to the field “initialized” 2714 (FIG. 27) of the
上述のように、lhs若しくはrhsの何れかが項目によって表現されない場合、処理はテストステップ4502(第45図)からテストステップ4510に進む。テストステップ4510において、実行エンジン802(第8図)が、rhs及びlhsが個別に項目によって表現されるか否かを判定する。lhsが項目によって表現され、rhsが項目によって表現されない場合には、処理はテストステップ4510(第45図)からステップ4512に進む。そうでない場合には、処理は論理流れ図3356に従って、即ちステップ3356(第33E図)に従って終了する。
As described above, if either lhs or rhs is not represented by an item, the process proceeds from test step 4502 (FIG. 45) to test
ステップ4512(第45図)においては、実行エンジン802(第8図)がlhs項目に未知なものとしての印付けを行う。例えば、項目構造体2700(第27図)がlhs項目を表現する場合、実行エンジン802(第8図)が、(i)未知のデータの型を示すデータをフィールド“type code”2712(第27図)に格納し、(ii)lhs項目が初期化されていないことを示すデータをフィールド“initialized”2714に格納し、(iii)lhsがエクスターナル若しくはリソースと関連付けられていないことを示すべくフィールド“resource”2702及び“external”2704にNULLを格納することによって、lhsが既知でないという印付けを行う。 ステップ4512(第45図)の終了後、処理は論理流れ図3356に従って、即ちステップ3356(第33E図)に従って終了する。 In step 4512 (FIG. 45), the execution engine 802 (FIG. 8) marks the lhs item as unknown. For example, if the item structure 2700 (FIG. 27) represents an lhs item, the execution engine 802 (FIG. 8) (i) stores data indicating the type of unknown data in the field “type”. code ”2712 (FIG. 27), (ii) data indicating that the lhs item is not initialized is stored in the field“ initialized ”2714, and (iii) lhs is not associated with an external or resource To indicate that lhs is not known by storing NULL in the fields “resource” 2702 and “external” 2704. After step 4512 (FIG. 45), processing proceeds according to logic flow diagram 3356. That is, the process ends according to step 3356 (FIG. 33E).
従って、ステップ3356において、rhsを表現する項目の値はlhsを表現する項目に代入される。上述のように、実行エンジン802(第8図)が、ステップ3408(第34図)において式の評価によって得られた項目の値を、宣言された項目に代入する。ステップ3408におけるこの代入は、論理流れ図3356(第45図)に関連して上述したrhs項目のlhs項目への代入に類似したものである。ステップ3812(第38図)に関して上述したように、実行エンジン802(第8図)は、既知の項目の値を未知の項目に代入する。ステップ3812(第38図)における既知の項目の未知の項目への代入は、論理流れ図3356に関連して上述したrhs項目のlhs項目への代入に類似したものである。上述のように、実行エンジン802(第8図)は、ステップ3906(第39図)において、式の評価によって得られた項目の値を戻り値項目に代入する。ステップ3906におけるこの代入処理は、論理流れ図3356(第45図)に関連して上述したrhs項目のlhs項目への代入に類似したものである。
Accordingly, in
関数のエミュレーション
上述のように、実行エンジン802(第8図)は、ステップ3352(第33E図)において、関数の実行をエミュレートすることにより関数の呼出しを評価する。ステップ3352は論理流れ図3352(第46図)に詳細に示されており、ここでは処理がステップ4602から始まる。関数の呼出しの実行は、呼び出される関数の挙動を表現する関数モデル構造体に従ってエミュレートされる。テストステップ4602において、実行エンジン802(第8図)は、呼び出される関数の挙動を表現する関数モデル構造体が、メモリ104(第1図)に格納されているか否かを判定する。上述のように、関数モデル構造体1100(第11図)は、関数モデル構造体1100によってその挙動が表現される関数の識別子を表現するデータを含んでいるフィールド“name”1102を有する。各関数の挙動を表現する様々な関数モデル構造体の対応するフィールドは、サブジェクト関数がその関数を呼び出すのに用いる識別子と比較されるが、これは全ての関数モデル構造体がチェックされるまでか、若しくはそのフィールド“name”が識別子と一致する関数モデル構造体が見つけられるまで続けて行われる。
Function Emulation As described above, the execution engine 802 (FIG. 8) evaluates function calls by emulating function execution in step 3352 (FIG. 33E).
その識別子と一致するフィールド“name”を有する関数モデル構造体が見つけられない場合は、処理はテストステップ4602(第46図)からステップ4604に進み、ここで呼び出される関数の実行のエミュレーションを評価することによって得られる項目としてNULLが生成される。上述のように、実行エンジン802(第8図)がその式を適切に評価するための十分な情報を有していないときには、式はNULLに評価される。ステップ4604(第46図)の実行の後、処理は論理流れ図3352に従って、即ちステップ3352(第33E図)に従って終了する。 If a function model structure with field “name” matching the identifier is not found, processing proceeds from test step 4602 (FIG. 46) to step 4604, where the emulation of the execution of the called function is evaluated. NULL is generated as an item obtained by this. As described above, when the execution engine 802 (FIG. 8) does not have enough information to properly evaluate the expression, the expression evaluates to NULL. After execution of step 4604 (FIG. 46), processing ends according to logic flow diagram 3352, ie, step 3352 (FIG. 33E).
一方、そのフィールド“name”が、サブジェクト関数が関数の呼出しに用いる識別子と一致するような関数モデル構造体、即ち呼び出される関数の挙動を表現する関数モデル構造体が見つけられた場合には、処理はテストステップ4602(第46図)からループステップ4606に進む。ループステップ4606及びNEXTステップ4630はループを形成し、このループの中で呼び出される関数の関数モデル構造体内のエクスターナルモデル構造体によって表現される各エクスターナルが処理される。第13図に関連して以前に説明したように、関数モデル構造体1100Aのような関数モデル構造体は、エクスターナルモデル構造体のシングルリンクトリストにおける第1エクスターナルモデル構造体を指定するフィールド“first external”1104Aを含む。呼び出される関数の関数モデル構造体のエクスターナルモデル構造体のシングルリンクトリストの各エクスターナルに対して、処理はループステップ4606(第46図)からテストステップ4608に進む。呼び出される関数の関数モデル構造体のエクスターナルモデル構造体のシングルリンクトリストの各エクスターナルが処理された後、処理はループステップ4606から以下に詳細に説明するステップ4632に進む。
On the other hand, when a function model structure whose field “name” matches the identifier used by the subject function for calling the function, that is, a function model structure expressing the behavior of the called function is found, processing is performed. Advances from test step 4602 (FIG. 46) to loop step 4606. Loop step 4606 and
以下のステップ4608〜4628の説明の文脈においては、ループステップ4606及びNEXTステップ4630により形成されるループに従って処理されるエクスターナルモデル構造体には、エクスターナルモデル構造体の処理の説明のための例として、エクスターナルモデル構造体1200(第12図)を用いるものとする。テストステップ4608(第46図)において、実行エンジン802(第8図)が、エクスターナルモデル構造体1200(第12図)がパラメータを表現しているか否かを、フィールド“type”1204とパラメータを示すデータとを比較することによって判定する。エクスターナルモデル構造体1200がパラメータを表現していない場合には、処理はテストステップ4608(第46図)から以下に詳細に説明するテストステップ4612に進む。逆に、エクスターナルモデル構造体1200(第12図)がパラメータを表現している場合には、処理はテストステップ4608(第46図)からステップ4610に進む。
In the context of the description of steps 4608-4628 below, the external model structure processed according to the loop formed by loop step 4606 and
ステップ4610においては、実行エンジン802(第8図)がそのパラメータを表現する項目を検索する。ループステップ3348(第33E図)、ステップ3349、及びNEXTステップ3350に関連して以前に説明したように、実行エンジン802(第8図)は、呼び出される関数のパラメータを表現する項目の配列を含む。エクスターナルモデル構造体1200(第12図)によって表現される特定のパラメータは、フィールド“parameter number”1206において指定される。処理はステップ4610(第46図)から、後に詳述するテストステップ4616に進む。
In
上述のように、エクスターナルモデル構造体1200(第12図)がパラメータを表現していない場合、処理はテストステップ4608からテストステップ4612に進む。テストステップ4612(第46図)において、実行エンジン802(第8図)が、エクスターナルモデル構造体1200(第12図)が変数を表現しているか否かを、フィールド“type”1204内に格納されたデータと変数が表現されていることを示すデータとを比較することによって判定する。エクスターナルモデル構造体1200(第12図)が変数を表現していない場合には、処理はテストステップ4612(第46図)から後に詳述するテストステップ4616に進む。逆に、エクスターナルモデル構造体1200(第12図)が変数を表現している場合には、処理はテストステップ4612からステップ4614に進む。
As described above, if external model structure 1200 (FIG. 12) does not represent a parameter, processing proceeds from
ステップ4614において、実行エンジン802(第8図)は、エクスターナルモデル構造体1200(第12図)によって表現される変数の評価を行う。実行エンジン802(第8図)は、その変数の項目を検索することによってその変数を評価する。サブジェクト関数を表現する関数構造体内において宣言構造体、即ち宣言構造体1506(第16図)が、エクスターナルモデル構造体1200(第12図)によって表現される変数を表現する。エクスターナルモデル構造体1200はその変数の識別子をフィールド“name”1208に格納することによって、表現された特定の変数を識別する。エクスターナルモデル構造体1200及び宣言構造体1506(第16図)が同じ変数を表現している場合には、フィールド“name”1604に格納された識別子はフィールド“name”120(第12図)に格納された識別子と同じものである。宣言構造体1506の“item”1608が指定する項目構造体2700を検索することによってその変数の評価が行われる。処理はステップ4614(第46図)からテストステップ4616に進む。
In step 4614, the execution engine 802 (FIG. 8) evaluates the variables represented by the external model structure 1200 (FIG. 12). The execution engine 802 (FIG. 8) evaluates the variable by searching for the variable item. In the function structure expressing the subject function, a declaration structure, that is, a declaration structure 1506 (FIG. 16) expresses a variable expressed by the external model structure 1200 (FIG. 12).
上述のように、エクスターナルモデル構造体1200(第12図)がパラメータ及びも変数の何れも表現していない場合、即ちエクスターナルモデル構造体1200が呼び出される関数の戻り値項目を表現している場合には、処理はテストステップ4616からテストステップ4612に進む。また、処理はステップ4616(第46図)の他ステップ4614からもテストステップ4616に進み得る。テストステップ4616において、実行エンジン802(第8図)は、エクスターナルモデル構造体1200(第12図)によって表現されるエクスターナルを表現する項目が定義されているか否かを判定する。項目が定義されているのは、(i)ステップ4610においてエクスターナルモデル構造体1200によって表現されるパラメータの値が定義され、既知の値に評価されて、かつ処理がステップ4616(第46図)を通って進む場合、または(ii)ステップ4614においてエクスターナルモデル構造体1200(第12図)によって表現される変数が初期化され、処理がステップ4614(第46図)を通って進む場合である。
As described above, when the external model structure 1200 (FIG. 12) represents neither a parameter nor a variable, that is, when the
エクスターナルモデル構造体1200(第12図)よって表現されるエクスターナルを表現する項目が定義されない場合には、処理はテストステップ4616(第46図)から後に説明するテストステップ4624に進む。逆に、このようなアイテムが定義される場合には、処理はテストステップ4616からループステップ4618に進む。
If the item representing the external represented by the external model structure 1200 (FIG. 12) is not defined, the process proceeds from the test step 4616 (FIG. 46) to the
ループステップ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に進み、ここでフィールド“operations”1214(第12図)に格納された次の演算があれば、それが処理される。フィールド“operations”1214に格納された全ての演算がループステップ4618(第46図)及びNEXTステップ4622によって定義されたループに従ってひとたび処理されると、処理はテストステップ4624に進む。
テストステップ4624において、実行エンジン802(第8図)は、エクスターナルモデル構造体1200(第12図)が、エクスターナルモデル構造体1200によって表現されるエクスターナルの代わりに新たなリソースが生成されることを指定するか否かを判定する。実行エンジン802(第8図)は、フィールド“new resources”1218(第12図)とブール値“true”とを比較することによってこの判定を行う。フィールド“new resources”1218が“false”である場合には、処理はテストステップ4624(第46図)からNEXTステップ4630を通って、ループステップ4606に進み、ここで次のエクスターナルが、上述のようにループステップ4606及びNEXTステップ4630により定義されるループに従って処理される。逆に、フィールド“new resources”1218(第12図)が“true”である場合には、処理はテストステップ4624(第46図)からステップ4626に進む。
In
ステップ4626において、実行エンジン802(第8図)は、(i)項目構造体、即ち項目構造体2700(第27図)及びリソース状態構造体、即ちリソース状態構造体3100(第31図)を生成してメモリ104(第1図)に格納し、(ii)リソース状態構造体3100(第31図)を指定するポインタをフィールド“resource”2702に格納して、リソース状態構造体3100と項目構造体2700(第27図)とを関連付けることによって、新たなリソースを生成する。処理はステップ4626(第46図)からステップ4628に進み、ここで実行エンジン802(第8図)が、新たな項目と、エクスターナルモデル構造体1200(第12図)によって表現されるエクスターナルとを連係させる。エクスターナルリスト構造体1414(第15図)がそのエクスターナルを表現している場合には、フィールド“first decl”1502(第15図)が指定する宣言構造体1506のフィールド“item”1608(第16図)に、項目構造体2700(第27図)を指定するポインタを格納することによって、その項目がそのエクスターナルに関連付けられる。
In
エクスターナルが呼び出される関数の戻り値項目である場合には、論理流れ図3352(第46図)の始めにNULLに設定されていた結果レコードが新たな項目に設定される。エクスターナルモデル構造体1200のフィールド“type”1204(第12図)がそれを示している場合には、そのエクスターナルは、呼び出される関数の戻り値項目である。エクスターナルが呼び出される関数の戻り値項目でない場合には、そのエクスターナルを表現する宣言構造体1506のフィールド“item”1608(第16図)に新たな項目が形成される。
If External is the return value item of the called function, the result record that was set to NULL at the beginning of the logic flow diagram 3352 (FIG. 46) is set as the new item. When the field “type” 1204 (FIG. 12) of the
ステップ4628(第46図)から、処理はNEXTステップ4630を通ってループステップ4606に進み、ここで上述のように次のエクスターナルが処理される。呼び出される関数を表現する関数モデル構造体1100のフィールド“first external”1104(第11図)及び“last external”1106によって指定されるエクスターナル構造体のシングルリンクトリストにおけるエクスターナル構造体によって表現されるエクスターナルの全てがひとたび処理されると、処理はループステップ4606(第46図)からステップ4632に進む。ステップ4632において、実行エンジン802(第8図)は、呼び出される関数の実行のエミュレーションにより評価して得られた項目として、結果レコードを生成する。ステップ4628(第46図)に関連して上述したように、この結果レコードはNULL値に初期化され、戻り値項目の代わりに新たなリソースが生成された場合には、戻り値項目の値に設定される。
From step 4628 (FIG. 46), processing proceeds through
ステップ4632の終了後、処理は論理流れ図3352に従って、即ちステップ3352(第33E図)に従って終了する。従って、呼び出される関数の挙動を表現するモデルを用いることによって、サブジェクト関数内に呼び出される関数に対する呼出しを評価して、呼び出される関数の実行のリソース及びエクスターナルに対する評価を解析することができる。
After
メモリの集群
C言語に特有なことの1つは、あるメモリを、連続して割り当てられた配列として取り扱うことができるという点である。C言語においては、以下の型のメモリは、そのメモリが連続したブロックとして割り当てられたメモリであるかのようにアクセスすることができる。そのようなメモリの型とは、
(i)命令“struct”若しくは“array”を用いて定義された変数若しくはパラメータの何れかのデータ、即ち複合データ構造体若しくは配列、
(ii)関数にパラメータとして渡される任意のポインタ、
(iii)C言語において定義されている関数calloc () 若しくは関数malloc () の実行により割り当てられるメモリである。
One of the peculiarities of memory group C is that a memory can be treated as a continuously allocated array. In the C language, the following types of memory can be accessed as if the memory were memory allocated as a contiguous block. Such memory types are:
(I) any data of a variable or parameter defined using the instruction “struct” or “array”, ie a composite data structure or array;
(Ii) any pointer passed as a parameter to the function,
(Iii) A memory allocated by execution of a function calloc () or function malloc () defined in the C language.
本発明のここに開示する実施例では、連続して割り当てられるメモリをモデル化するためにメモリの集群(bunch)を用いている。 In the presently disclosed embodiment of the present invention, a memory bunch is used to model contiguously allocated memory.
項目構造体は集群、即ち項目構造体の連続的な配列に割り当てられる。1つの整数、若しくは浮動小数点型変数の宣言を表現する項目構造体の場合についてのみ述べると、この集群は1つの項目構造体を含む。複合型の変数、即ち“struct”型及び配列の変数を表現する項目構造体の集群は、多重項目構造体によって表現され、その項目構造体のそれぞれは、4バイトの配列若しくは複合データの変数である。 Item structures are assigned to clusters, ie, a continuous array of item structures. Speaking only of the case of an item structure that represents the declaration of a single integer or floating point type variable, this collection includes a single item structure. A group of item structures representing complex type variables, ie, “struct” type and array variables, is represented by a multiple item structure, each of which is a 4-byte array or complex data variable. is there.
連続して割り当てられた項目構造体を有する連続して割り当てられたメモリを表現することにより、いくつかのイリーガルな配列参照の検出が可能となる。例えば、連続して割り当てられた項目構造体の集群の範囲内の項目構造体に対する参照は、その集群によって表現される配列のイリーガルな指標(index)に対応する。更に、項目構造体を集群に形成することにより、上述のようなメモリのリークの検出も単純化される。例えば、集群とされた何らかの項目構造体が関数のエクスターナルによって到達可能な場合は、集群における各項目構造体にも、その関数のエクスターナルが到達可能である。 Representing a continuously allocated memory with a continuously allocated item structure allows the detection of several illegal array references. For example, a reference to an item structure within a group of consecutively assigned item structures corresponds to an illegal index of the array represented by that group. Furthermore, the detection of memory leaks as described above is simplified by forming item structures in clusters. For example, if any item structure that is a group is reachable by an external of a function, the external of the function can also be reached by each item structure in the group.
上述のように、項目構造体2700(第27図)は、フィールド“first in bunch”2708、フィールド“size of bunch”2710、フィールド“head in bunch”2716、及びフィールド“known bunch size”2718を含む。フィールド“first in bunch”2708は、項目構造体2700を含む項目構造体の集群における第1の項目構造体を指定するポインタである。項目構造体2700が1つの集群における第1の項目構造体である場合には、フィールド“first in bunch”2708が項目構造体2700を指定する。フィールド“size of bunch”2710は、項目構造体2700を含む集群における項目構造体の数を示す。一実施例においては、フィールド”size of bunch”2710が、所与の集群における第1の項目構造体においてのみ、そのように定義されている。
As described above, the item structure 2700 (FIG. 27) includes the field “first”. in Bunch "2708, field" size " of Bunch "2710, field" head " in Bunch "2716 and field" known " bunch size "2718. The field" first ". in “bunch” 2708 is a pointer that designates the first item structure in the collection of item structures including the
フィールド“head in bunch”2716は、項目構造体2700が、その項目構造体2700を含む集群における第1項目構造体であるか否かを示すフラグである。フィールド“known bunch size”2718は、項目構造体2700を含む集群が既知のサイズを有するか否かを示すフラグである。集群が未知のサイズを有するのは、例えば、(i)その集群が動的に割り当てられる、即ち関数malloc () を呼び出すことによって割り当てられ、かつ実行エンジン802(第8図)が、要求されるメモリの量を計算するのに十分な情報を有していないとき、(ii)その集群がサブジェクト関数に引き渡される場合、若しくは(iii)その集群がその集群の各項目の追跡が実際には無理であるようなサイズを有する場合である。フィールド“known bunch size”2718によって示されることにより集群が未知のサイズを有している場合には、実行エンジン802(第8図)は、その集群の範囲を逸脱する違反のチェックは行わない。
Field “head” in The “bunch” 2716 is a flag indicating whether or not the
付録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オペレーティングシステム、Microsoft Windows(登録商標)3.1を用いているパーソナルコンピュータ上で用いられる。使用できるパーソナルコンピュータには、米国カリフォルニア州サンフランシスコのAtman社製のArt4000Sなどがある。付録Aのコンピュータプログラムが適合する特定のコンピュータ言語や、付録Aのコンピュータプログラムにより定義されたコンピュータプロセスが実行されるコンピュータシステムは、本発明における重要な側面ではない。当業者は、本明細書の記載内容を参照することにより、異なるコンピュータ言語及び/若しくは異なるコンピュータシステムを用いて本発明を実現できよう。 The computer program in Appendix A is an example of a work such as a Sun Sparkstation® computer system available from Sun Microsystems, Mountain View, Calif. It was compiled and linked using the UNIX operating system SunOS 4.1.3, compiler, and linker provided in the station. In the second example, the computer program of Appendix A was compiled using Microsoft's Visual C ++ 1.5 compiler and linked using its Visual C ++ linker. These compilers and linkers are sold by Microsoft Corporation of Redmond, Washington, USA, and similarly, MS DOS6.2 operating system and Microsoft Windows (registered trademark) 3.1 released by the same company are used. Used on personal computers. A personal computer that can be used includes Art4000S manufactured by Atman Corporation of San Francisco, California. The particular computer language to which the computer program of Appendix A conforms and the computer system in which the computer process defined by the computer program of Appendix A is executed is not an important aspect of the present invention. Those skilled in the art will be able to implement the invention using different computer languages and / or different computer systems by referring to the description herein.
付録Aには複数のソースコードファイルが含まれており、これには本発明の別の実施例に基づき複数の関数及びデータ構造を定義するソースコードファイル“readin.c”の2つの別の実施例が含まれている。ソースコードファイル“readin.c”の第1実施例は、付録Aのフレーム64〜74に現れており、ソースコードファイル“readin.c”の第2実施例は、付録Aのフレーム77〜87に現れている。ソースコードファイルの実施例の一方のみが付録Aの残りの部分とリンクされて、本発明の原理に基づくリソースチェッカを形成するということは理解されよう。 Appendix A includes a plurality of source code files, which include two alternative implementations of a source code file “readin.c” that defines a plurality of functions and data structures in accordance with another embodiment of the present invention. An example is included. The first example of the source code file “readin.c” appears in frames 64 to 74 of Appendix A, and the second example of the source code file “readin.c” appears in frames 77 to 87 of Appendix A. Appears. It will be appreciated that only one embodiment of the source code file is linked with the rest of Appendix A to form a resource checker in accordance with the principles of the present invention.
以上の記述は本発明を説明するためのものであり、本発明をこれに限定するものではない。例えば、ここに開示した実施例はC言語における関数を分析しているが、本発明の原理は、以上の記述の内容に限定されることなく、他のコンピュータ命令プロトコルにも適用され得る。更に、本発明を実現したコンピュータプログラムを何らかの媒体に格納して提供することも可能である。本発明の範囲は、請求の範囲によってのみ限定される。 The above description is for explaining the present invention, and the present invention is not limited to this. For example, although the embodiments disclosed herein analyze functions in C language, the principles of the present invention are not limited to the contents of the above description, but can be applied to other computer instruction protocols. Furthermore, it is also possible to provide a computer program that implements the present invention by storing it in some medium. The scope of the invention is limited only by the claims.
Claims (1)
前記コンピュータは前記プログラムコンポーネントを記憶する記憶手段と、情報処理手段と、前記プログラムコンポーネントの処理対象となるリソースであって、1つまたは複数のプログラムコンポーネントに割り当てられおよび開放されるリソースとを有し、
前記記憶手段に記憶されたプログラムコンポーネントの複数のステートメントを前記情報処理手段により実行するステップと、
前記情報処理手段により前記複数のステートメントを実行することにより生じた前記リソースの状態の変化が予め定められた変化であるか否かを判定することで前記プログラムコンポーネントがエラーか否かを前記情報処理手段により判定するステップとを備え、
前記判定するステップは、前記プログラムコンポーネントによって使用される前記リソースの挙動をモデル化し、前記リソースにおいて発生する可能性のある状態違反を検出することによって前記プログラムコンポーネントの解析がなされ前記プログラムコンポーネント中のエラーの発生が判定されるものであり、該エラーの発生の判定はモデル化された前記リソースの挙動と前記プログラムコンポーネントに含まれる前記ステートメントとの対応関係の情報を用いて、前記プログラムコンポーネントに含まれる前記ステートメントが実行されたとした場合に、前記対応関係の前記情報を用いて次の挙動を推定し、該推定した挙動によってエラーが発生するかどうかを判定するものであることを特徴とする方法。 A method in a computer for checking for errors in a program component having a plurality of statements, wherein the program component comprises a computer program,
The computer includes storage means for storing the program component, information processing means, and a resource to be processed by the program component, and a resource allocated to and released from one or more program components. ,
Executing a plurality of statements of program components stored in the storage means by the information processing means;
It is determined whether or not the program component is an error by determining whether or not a change in the state of the resource caused by executing the plurality of statements by the information processing means is a predetermined change. Determining by means,
The determining step models the behavior of the resource used by the program component and analyzes the program component by detecting a state violation that may occur in the resource, and an error in the program component. The determination of the occurrence of the error is included in the program component using information on the correspondence between the modeled behavior of the resource and the statement included in the program component. When the statement is executed, the next behavior is estimated using the information of the correspondence relationship, and it is determined whether or not an error occurs due to the estimated behavior .
Applications Claiming Priority (1)
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 |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP50738496A Division JP4213203B2 (en) | 1994-08-10 | 1995-08-09 | Computer process resource modeling method and apparatus |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2006252583A JP2006252583A (en) | 2006-09-21 |
JP4430043B2 true JP4430043B2 (en) | 2010-03-10 |
Family
ID=23110253
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP50738496A Expired - Fee Related JP4213203B2 (en) | 1994-08-10 | 1995-08-09 | Computer process resource modeling method and apparatus |
JP2006159153A Expired - Fee Related JP4430043B2 (en) | 1994-08-10 | 2006-06-07 | A computer method for checking program component errors |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP50738496A Expired - Fee Related JP4213203B2 (en) | 1994-08-10 | 1995-08-09 | Computer process resource modeling method and apparatus |
Country Status (8)
Country | Link |
---|---|
US (5) | US5694539A (en) |
EP (1) | EP0775342B1 (en) |
JP (2) | JP4213203B2 (en) |
AT (1) | ATE182223T1 (en) |
AU (1) | AU3235795A (en) |
CA (2) | CA2637798C (en) |
DE (1) | DE69510801T2 (en) |
WO (1) | WO1996005556A1 (en) |
Families Citing this family (119)
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 |
US6202199B1 (en) | 1997-07-31 | 2001-03-13 | Mutek Solutions, Ltd. | System and method for remotely analyzing the execution of computer programs |
US6282701B1 (en) | 1997-07-31 | 2001-08-28 | Mutek Solutions, Ltd. | System and method for monitoring and analyzing the execution of computer programs |
JP3199013B2 (en) * | 1998-01-26 | 2001-08-13 | 日本電気株式会社 | Language processing method, language processing apparatus, and storage medium storing language processing program |
US5995752A (en) * | 1998-02-03 | 1999-11-30 | International Business Machines Corporation | Use of language instructions and functions across multiple processing sub-environments |
US6104873A (en) * | 1998-02-03 | 2000-08-15 | 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 |
US6189116B1 (en) * | 1998-07-14 | 2001-02-13 | Autodesk, Inc. | Complete, randomly ordered traversal of cyclic directed graphs |
US6378088B1 (en) * | 1998-07-14 | 2002-04-23 | Discreet Logic Inc. | Automated test generator |
US6219805B1 (en) * | 1998-09-15 | 2001-04-17 | Nortel Networks Limited | Method and system for dynamic risk assessment of software systems |
CA2346925A1 (en) * | 1998-10-16 | 2000-04-27 | Computer Associates Think, Inc. | Method and system for an extensible macro language |
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 (en) * | 1999-08-23 | 2002-11-29 | Trusted Logic | MANAGEMENT PROTOCOL, METHOD FOR VERIFICATION AND TRANSFORMATION OF A DOWNLOADED PROGRAM FRAGMENT AND CORRESPONDING SYSTEMS |
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 |
US6684385B1 (en) | 2000-01-14 | 2004-01-27 | Softwire Technology, Llc | Program object for use in generating application programs |
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 |
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 (en) * | 2000-05-31 | 2001-12-14 | Konami Co Ltd | Display control method, game machine and recording medium |
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 |
US20020112201A1 (en) * | 2000-12-04 | 2002-08-15 | Flanagan Cormac Andrias | Method and apparatus for automatically inferring annotations for an extended static checker |
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 |
US7136859B2 (en) | 2001-03-14 | 2006-11-14 | Microsoft Corporation | Accessing heterogeneous data in a standardized manner |
US7284271B2 (en) | 2001-03-14 | 2007-10-16 | Microsoft Corporation | Authorizing a requesting entity to operate upon data structures |
US7539747B2 (en) | 2001-03-14 | 2009-05-26 | Microsoft Corporation | Schema-based context service |
US7302634B2 (en) | 2001-03-14 | 2007-11-27 | Microsoft Corporation | Schema-based services for identity-based data access |
US7024662B2 (en) | 2001-03-14 | 2006-04-04 | Microsoft Corporation | Executing dynamically assigned functions while providing services |
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 (en) * | 2001-10-29 | 2003-12-06 | 전흥재 | method for making leukocyte elimination filter to which immune factor adsorbent is grafted and the filter made by the method |
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 (en) * | 2002-04-09 | 2006-08-18 | Canon Kk | METHOD FOR DETECTING ERRORS IN A COMPUTER PROGRAM |
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 |
US6862682B2 (en) * | 2002-05-01 | 2005-03-01 | Testquest, Inc. | Method and apparatus for making and using wireless 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 |
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 |
US7818729B1 (en) | 2003-09-15 | 2010-10-19 | Thomas Plum | Automated safe secure techniques for eliminating undefined behavior in computer software |
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 (en) * | 2003-10-17 | 2005-05-12 | Fujitsu Ltd | Program for detecting deadlock beforehand |
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 |
US8407785B2 (en) | 2005-08-18 | 2013-03-26 | The Trustees Of Columbia University In The City Of New York | Systems, methods, and media protecting a digital data processing device from attack |
CA2626993A1 (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 |
US8286137B2 (en) * | 2007-05-07 | 2012-10-09 | Nec Laboratories America, Inc. | Accelerating model checking via synchrony |
US8589872B2 (en) | 2007-06-12 | 2013-11-19 | International Business Machines Corporation | System and method for variable type identification |
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 (en) | 2009-07-06 | 2015-05-15 | Permaswage | CONNECTING DEVICE FOR PIPES AND CONNECTING METHOD THEREFOR |
US8893086B2 (en) | 2009-09-11 | 2014-11-18 | International Business Machines Corporation | System and method for resource modeling and simulation in test planning |
US8495583B2 (en) | 2009-09-11 | 2013-07-23 | International Business Machines Corporation | System and method to determine defect risks in software solutions |
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 |
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 |
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 |
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 |
US9495541B2 (en) | 2011-09-15 | 2016-11-15 | The Trustees Of Columbia University In The City Of New York | Detecting return-oriented programming payloads by evaluating data for a gadget address space address and determining whether operations associated with instructions beginning at the address indicate a return-oriented programming payload |
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 (en) * | 2012-09-12 | 2014-12-10 | 飞天诚信科技股份有限公司 | Generation and authentication method and system for dynamic password |
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 (en) * | 2016-07-26 | 2020-06-02 | 龙芯中科技术有限公司 | Hardware abstraction layer debugging method and device |
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 (en) | 2017-05-18 | 2021-11-04 | 현대자동차 주식회사 | Isg system of hybrid electric vehicle |
US10678740B1 (en) * | 2018-11-21 | 2020-06-09 | Zoox, Inc. | Coordinated component interface control framework |
CN112835560A (en) * | 2021-03-04 | 2021-05-25 | 广州图创计算机软件开发有限公司 | WEB multi-terminal low-code intelligent software development platform |
Family Cites Families (17)
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 |
KR950001058B1 (en) * | 1990-04-23 | 1995-02-08 | 마쯔시다덴기산교 가부시기가이샤 | Apparatus for supporting the development of sequence software to be used in automatic equipment 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 |
-
1994
- 1994-08-10 US US08/289,148 patent/US5694539A/en not_active Expired - Lifetime
-
1995
- 1995-08-09 JP JP50738496A patent/JP4213203B2/en not_active Expired - Fee Related
- 1995-08-09 CA CA2637798A patent/CA2637798C/en not_active Expired - Fee Related
- 1995-08-09 CA CA002197071A patent/CA2197071C/en not_active Expired - Fee Related
- 1995-08-09 EP EP95928700A patent/EP0775342B1/en not_active Expired - Lifetime
- 1995-08-09 WO PCT/US1995/009691 patent/WO1996005556A1/en active Search and Examination
- 1995-08-09 AU AU32357/95A patent/AU3235795A/en not_active Abandoned
- 1995-08-09 DE DE69510801T patent/DE69510801T2/en not_active Expired - Lifetime
- 1995-08-09 AT AT95928700T patent/ATE182223T1/en not_active IP Right Cessation
-
1997
- 1997-07-30 US US08/903,512 patent/US6154876A/en not_active Expired - Lifetime
- 1997-07-30 US US08/902,714 patent/US5857071A/en not_active Expired - Lifetime
- 1997-08-01 US US08/910,569 patent/US5968113A/en not_active Expired - Lifetime
- 1997-08-01 US US08/905,110 patent/US6079031A/en not_active Expired - Lifetime
-
2006
- 2006-06-07 JP JP2006159153A patent/JP4430043B2/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CA2637798A1 (en) | 1996-02-22 |
JP2006252583A (en) | 2006-09-21 |
US6154876A (en) | 2000-11-28 |
ATE182223T1 (en) | 1999-07-15 |
EP0775342B1 (en) | 1999-07-14 |
CA2197071C (en) | 2008-11-04 |
CA2197071A1 (en) | 1996-02-22 |
JP4213203B2 (en) | 2009-01-21 |
US5857071A (en) | 1999-01-05 |
JPH10509258A (en) | 1998-09-08 |
US5968113A (en) | 1999-10-19 |
CA2637798C (en) | 2011-06-21 |
AU3235795A (en) | 1996-03-07 |
US6079031A (en) | 2000-06-20 |
US5694539A (en) | 1997-12-02 |
WO1996005556A1 (en) | 1996-02-22 |
DE69510801T2 (en) | 2000-04-06 |
EP0775342A1 (en) | 1997-05-28 |
DE69510801D1 (en) | 1999-08-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4430043B2 (en) | A computer method for checking program component errors | |
Bush et al. | A static analyzer for finding dynamic programming errors | |
Godefroid et al. | DART: Directed automated random testing | |
Binkley | The application of program slicing to regression testing | |
US5490249A (en) | Automated testing system | |
US5790778A (en) | Simulated program execution error detection method and apparatus | |
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 | |
Delamare et al. | A test-driven approach to developing pointcut descriptors in AspectJ | |
JPH0748182B2 (en) | Program error detection method | |
Xie et al. | Improving generation of object-oriented test suites by avoiding redundant tests | |
Reiss | Specifying and checking component usage | |
Liang et al. | Debugging object-oriented programs with behavior views | |
Kansomkeat et al. | An analysis technique to increase testability of object‐oriented components | |
Jorgensen | Improving the precision and correctness of exception analysis in Soot | |
Stalker | Runtime checking of graph programs | |
Foulger et al. | Using the spark toolset for showing the absence of run-time errors in safety-critical software | |
Munkby et al. | Automating exception-safety classification | |
Bieman et al. | Using fault injection to test software recovery code | |
Kansomkeat | An analysis technique to increase testability of class-component | |
Dillon et al. | Automatic test data generation from embedded c code | |
Ekberg et al. | Software code quality with UML design models | |
Gates et al. | A Framework for Knowledge Management and Automated Constraint Monitoring | |
Bao | Verifying abstract components within concrete software environments | |
Atkinson et al. | In process programming, processes are modeled as pieces of software, and a process programming language is used to specify the process. Such a language resembles a conven-tional programming language, providing constructs such as iteration and selection. This approach allows models to be |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20060707 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20060815 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20061115 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20061121 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20070215 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20080404 |
|
RD13 | Notification of appointment of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7433 Effective date: 20080704 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20080704 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20080804 |
|
A911 | Transfer to examiner for re-examination before appeal (zenchi) |
Free format text: JAPANESE INTERMEDIATE CODE: A911 Effective date: 20080808 |
|
A912 | Re-examination (zenchi) completed and case transferred to appeal board |
Free format text: JAPANESE INTERMEDIATE CODE: A912 Effective date: 20080905 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20091116 |
|
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: 20091216 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20121225 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: 20121225 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20131225 Year of fee payment: 4 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
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 |