JP6659955B2 - Program analysis method, program analysis device, and analysis program - Google Patents
Program analysis method, program analysis device, and analysis program Download PDFInfo
- Publication number
- JP6659955B2 JP6659955B2 JP2016095882A JP2016095882A JP6659955B2 JP 6659955 B2 JP6659955 B2 JP 6659955B2 JP 2016095882 A JP2016095882 A JP 2016095882A JP 2016095882 A JP2016095882 A JP 2016095882A JP 6659955 B2 JP6659955 B2 JP 6659955B2
- Authority
- JP
- Japan
- Prior art keywords
- execution
- variable
- path
- symbol
- module
- 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
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Description
本発明はプログラム分析方法、プログラム分析装置および分析プログラムに関する。 The present invention relates to a program analysis method, a program analysis device, and an analysis program.
プログラムに条件分岐文が含まれている場合、実行される命令の列(実行パス)はプログラムに対する入力に応じて変化する。そこで、作成されたプログラムを分析して、プログラムから実行パスを抽出することがある。例えば、既存の情報処理システムの改変や交換を行う際、その情報処理システムの開発当初に作成された設計資料が十分に残っていない場合がある。その場合、実装物としてのプログラムから実行パスを抽出し、実行パス毎の入力と出力の関係を判定することで、その情報処理システムの仕様を理解することがある。また、例えば、作成されたプログラムをテストする際、そのプログラムから実行パスを抽出し、抽出された実行パスについてテスト計画を作成することがある。 When a program includes a conditional branch statement, a sequence of instructions to be executed (execution path) changes according to an input to the program. Therefore, the created program may be analyzed to extract an execution path from the program. For example, when modifying or exchanging an existing information processing system, there may be cases where sufficient design materials created at the beginning of the development of the information processing system do not remain. In this case, the specification of the information processing system may be understood by extracting an execution path from a program as an implementation and determining the relationship between input and output for each execution path. Further, for example, when testing a created program, an execution path may be extracted from the program, and a test plan may be created for the extracted execution path.
プログラムの分析方法の1つのとして、シンボリック実行(記号実行)がある。シンボリック実行では、プログラムへの入力値を格納する変数に、具体的な数値や具体的な文字に代えて定数を示すシンボル(記号値)を割り当てる。プログラムにおいて更新される変数の値は、シンボルを含む式として表されることがある。シンボルを用いてプログラムの命令を擬似的に実行することで、具体的な値を次々に入力してプログラムを繰り返し実行する場合よりも、プログラムの実行パスを効率的に抽出できる。 One of the program analysis methods is symbolic execution (symbol execution). In symbolic execution, a symbol (symbol value) indicating a constant is assigned to a variable that stores an input value to a program, instead of a specific numerical value or a specific character. The value of a variable that is updated in a program may be represented as an expression that includes a symbol. By pseudo-executing the program instructions using the symbols, the execution path of the program can be extracted more efficiently than when the program is repeatedly executed by inputting specific values one after another.
プログラムに条件分岐文が含まれている場合、シンボルは任意の定数を表すため、分岐方向を1つに絞り込めないことがある。具体的な値によって分岐条件の判定がYESになることもNOになることもある場合、その条件分岐文を分割点として実行パスを分割する。すなわち、その分岐条件の判定がYESになる場合の実行パスと、その分岐条件の判定がNOになる場合の実行パスの両方が存在するものとして取り扱う。条件分岐文が増えると、プログラムから抽出される実行パスは指数関数的に増加することが多い。 When a program includes a conditional branch statement, the symbol represents an arbitrary constant, and thus the branch direction may not be narrowed down to one. When the determination of the branch condition may be YES or NO depending on the specific value, the execution path is divided using the conditional branch statement as a division point. That is, both the execution path when the determination of the branch condition is YES and the execution path when the determination of the branch condition is NO exist. As the number of conditional branch statements increases, the number of execution paths extracted from the program often increases exponentially.
なお、シンボリック実行を利用してプログラムから実行パスを抽出し、抽出した実行パスをカバーするテストデータを生成するテストデータ生成装置が提案されている。提案のテストデータ生成装置は、シンボリック実行の計算量を削減するため、複数の変数のうち一部の変数のみにシンボルを割り当て、他の変数にはシンボルではない具体的な値を割り当てる。シンボルと具体的な値の組み合わせによってシンボリック実行を行うと、プログラムに含まれる複数の実行パスのうち一部の実行パスが抽出される。テストデータ生成装置は、シンボルを割り当てる変数を切り替えながらシンボリック実行を繰り返すことで、テストすべき実行パスの全てをプログラムから抽出する。 Note that a test data generation device that extracts an execution path from a program using symbolic execution and generates test data that covers the extracted execution path has been proposed. The proposed test data generation device assigns a symbol to only some of a plurality of variables and assigns a specific value other than a symbol to other variables in order to reduce the amount of calculation for symbolic execution. When symbolic execution is performed using a combination of a symbol and a specific value, a part of the plurality of execution paths included in the program is extracted. The test data generation device extracts all execution paths to be tested from the program by repeating symbolic execution while switching variables to which symbols are assigned.
また、シンボリック実行を利用して関数内部の実行パスを探索するソフトウェアテスト方法が提案されている。提案のソフトウェアテスト方法では、関数の戻り値にシンボルを割り当て、シンボルが取り得る値の範囲を示す制約を導出し、制約を満たすように関数についてシンボル実行を行うことで探索する実行パスを制限する。 In addition, a software test method for searching for an execution path inside a function using symbolic execution has been proposed. In the proposed software test method, a symbol is assigned to a return value of a function, a constraint indicating a range of possible values of the symbol is derived, and the execution path searched is limited by performing symbol execution on the function so as to satisfy the constraint. .
プログラムでは、あるモジュールが他のモジュールを呼び出すことがある。モジュールは、関数・手続き・メソッド・セクションなど、プログラムに含まれる部分プログラムであって他のモジュールから呼び出されることがあるものであればよい。この場合、プログラムをどのように分析して実行パスを抽出すればよいかが問題となる。 In a program, one module may call another module. The module may be a partial program included in the program, such as a function, procedure, method section, or the like, as long as it is sometimes called from another module. In this case, the problem is how to analyze the program and extract the execution path.
呼び出し元モジュールと呼び出し先モジュールの両方に跨がる実行パスを直接抽出しようとすると、探索する実行パスが膨大になるというパス爆発の問題が生じる。例えば、呼び出し元モジュールに、1回ずつ実行されるN個の直列の条件分岐文が含まれ、呼び出し先モジュールに、1回ずつ実行されるM個の直列の条件分岐文が含まれているとする(N,Mは2以上の整数)。その場合、2つのモジュールからは最大で2M+N個の実行パスが抽出される。2M+N個の実行パスを直接探索しようとすると、各モジュールの条件分岐文の数(NやM)の増加に伴って計算量が大きく増加してしまう。 If an attempt is made to directly extract an execution path that extends over both the caller module and the callee module, a path explosion problem arises in that the number of execution paths to be searched becomes enormous. For example, if the caller module contains N serial conditional branch statements executed once each, and the callee module contains M serial conditional branch statements executed once each, (N and M are integers of 2 or more). In that case, at most 2 M + N execution paths are extracted from the two modules. If 2M + N execution paths are to be searched directly, the amount of calculation greatly increases as the number (N or M) of conditional branch statements of each module increases.
一方、モジュール毎に独立に実行パスを抽出するだけでは、呼び出し元モジュールを正しく分析したことにはならない。他のモジュールを呼び出した後に呼び出し元モジュールで実行される命令は、呼び出し先モジュールの実行結果に依存するためである。 On the other hand, just extracting the execution path independently for each module does not mean that the calling module has been correctly analyzed. This is because the instruction executed by the calling module after calling another module depends on the execution result of the called module.
1つの側面では、本発明は、プログラムの実行パスを効率的に分析できるプログラム分析方法、プログラム分析装置および分析プログラムを提供することを目的とする。 In one aspect, an object of the present invention is to provide a program analysis method, a program analysis device, and an analysis program capable of efficiently analyzing a program execution path.
1つの態様では、コンピュータが実行するプログラム分析方法が提供される。第1のモジュールと第2のモジュールとを含み、第1のモジュールは第2のモジュールを呼び出す呼び出し命令を含むプログラムを取得する。第1のモジュールの入力に第1のシンボルを割り当て、呼び出し命令の前における第1の処理結果を第1のシンボルを用いて表した第1の情報を生成し、呼び出し命令の呼び出し結果に第2のシンボルを割り当て、第1のモジュールに含まれる複数の第1の実行パスそれぞれの呼び出し命令の後における第2の処理結果を第2のシンボルを用いて表した第2の情報を生成する。第2のモジュールの入力に第3のシンボルを割り当て、第2のモジュールに含まれる複数の第2の実行パスそれぞれの第3の処理結果を第3のシンボルを用いて表した第3の情報を生成する。第1の情報が示す第1の処理結果と第3の情報に用いられた第3のシンボルとを対応付け、また、第3の情報が示す第3の処理結果と第2の情報に用いられた第2のシンボルとを対応付けることで、複数の第1の実行パスと複数の第2の実行パスとを合成した複数の合成実行パスそれぞれの処理結果を第1のシンボルを用いて表したパス情報を生成する。 In one aspect, a computer-executable program analysis method is provided. The first module acquires a program including a call instruction for calling the second module, the program including a first module and a second module. A first symbol is assigned to an input of the first module, first information representing a first processing result before the call instruction is represented using the first symbol, and a second information is generated as a call result of the call instruction. , And generates second information indicating the second processing result after the call instruction of each of the plurality of first execution paths included in the first module by using the second symbol. A third symbol is assigned to the input of the second module, and third information representing a third processing result of each of the plurality of second execution paths included in the second module using the third symbol is represented by: Generate. The first processing result indicated by the first information is associated with the third symbol used for the third information, and the third processing result indicated by the third information is used for the second information. By using the first symbol, a processing result of each of a plurality of combined execution paths obtained by combining the plurality of first execution paths and the plurality of second execution paths by associating the plurality of first execution paths with the plurality of second execution paths. Generate information.
また、1つの態様では、記憶部と演算部とを有するプログラム分析装置が提供される。また、1つの態様では、コンピュータに実行させる分析プログラムが提供される。 In one aspect, a program analysis device having a storage unit and a calculation unit is provided. In one aspect, an analysis program to be executed by a computer is provided.
1つの側面では、プログラムの実行パスを効率的に分析できる。 In one aspect, the execution path of a program can be analyzed efficiently.
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
Hereinafter, the present embodiment will be described with reference to the drawings.
[First Embodiment]
A first embodiment will be described.
図1は、第1の実施の形態のプログラム分析装置の例を示す図である。
第1の実施の形態のプログラム分析装置10は、シンボリック実行によってプログラムを分析し、プログラムから実行パスを抽出する。分析対象のプログラムは、プログラミング言語で記述されたソースコードでもよいし、実行可能なオブジェクトコードなどソースコード以外のものでもよい。例えば、プログラム分析装置10は、既存の情報処理システムの仕様を理解することを目的として、過去に作成されたプログラムから実行パスを抽出するときに用いることができる。また、例えば、プログラム分析装置10は、新たに構築する情報処理システムをテストすることを目的として、新たに作成されたプログラムからテスト対象の実行パスを抽出するときに用いることができる。
FIG. 1 is a diagram illustrating an example of a program analysis device according to the first embodiment.
The
プログラム分析装置10は、クライアントコンピュータでもよいしサーバコンピュータでもよい。プログラム分析装置10は、記憶部11および演算部12を有する。
記憶部11は、分析対象のプログラム20を記憶する。記憶部11は、RAM(Random Access Memory)などの揮発性の半導体メモリでもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性の記憶装置でもよい。
The
The
演算部12は、記憶部11に記憶されたプログラム20に含まれる実行パスを分析する。演算部12は、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサでもよい。また、演算部12は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリ(記憶部11でもよい)に記憶されたプログラムを実行する。プロセッサが実行するプログラムには、以下に説明する処理を記載した分析プログラムが含まれる。複数のプロセッサの集合を、「マルチプロセッサ」または単に「プロセッサ」と言うこともある。
The
プログラム20は、モジュール21(第1のモジュール)とモジュール26(第2のモジュール)を含む。モジュール21,26はそれぞれ、プログラム20に含まれる部分プログラムであって他のモジュールから呼び出されることがあるものであればよい。例えば、モジュール21,26として関数・手続き・メソッド・セクションなどが挙げられる。モジュール単位の名称はプログラミング言語に依存する。
The
モジュール21は、モジュール26を呼び出す呼び出し命令22を含む。モジュール21が呼び出し元モジュールであり、モジュール26が呼び出し先モジュールである。呼び出し命令22の一例として、他のセクションを呼び出すPERFORM文が挙げられる。
Module 21 includes a
演算部12は、モジュール21についてシンボリック実行を行う。このとき、演算部12は、モジュール21の入力にシンボルc1(第1のシンボル)を割り当てる。例えば、演算部12は、モジュール21で使用される変数のうちモジュール21の外部から提供される値を格納する変数に、シンボルc1を割り当てる。
The
演算部12は、呼び出し命令22の前における処理結果(第1の処理結果)をシンボルc1を用いて表した第1の情報24を生成する。第1の情報24は、例えば、モジュール21で使用される変数のうち呼び出し命令22の前までに更新された変数の値を、シンボルc1を含む式で表したものである。第1の情報24は、例えば、シンボリック実行によって、呼び出し命令22の前までの命令をシンボルc1を用いて擬似的に実行することで生成できる。一例として、第1の情報24は、呼び出し命令22の直前における変数xの値がc1+1であるという処理結果を示す。
The
演算部12は、呼び出し命令22の呼び出し結果に、シンボルc1とは独立なシンボルc2(第2のシンボル)を割り当てる。これにより、モジュール26がスタブ化され、モジュール21をモジュール26とは独立にシンボリック実行することができる。例えば、演算部12は、モジュール21で使用される変数のうちモジュール26によって更新される可能性がある変数に、シンボルc2を割り当てる。一例として、演算部12は、モジュール21によって更新される変数yに、シンボルc2を割り当てる。
The
呼び出し命令22は、モジュール26の作用を明示しない形式で記述されていてもよい。例えば、モジュール26がグローバル変数を更新する場合など、モジュール26によって更新される値を格納する変数がモジュール21に明記されていない場合であってもよい。その場合、例えば、演算部12は、モジュール21で使用される変数のうちモジュール26によって更新される可能性のある更新変数を、モジュール26から検索しておく。
The
演算部12は、第1の実行パス23a,23bを含む複数の第1の実行パスを、モジュール21から検出する。モジュール21に含まれる1以上の条件分岐命令によって、これら複数の第1の実行パスが分岐する。条件分岐命令は、呼び出し命令22の前に存在してもよいし、呼び出し命令22の後に存在してもよい。
The
演算部12は、複数の第1の実行パスそれぞれの呼び出し命令22の後における処理結果(第2の処理結果)をシンボルc2を用いて表した第2の情報25を生成する。第2の情報25は、例えば、モジュール21で使用される変数のうち呼び出し命令22の後に更新された変数の値を、シンボルc2を含む式で表したものである。当該式に更にシンボルc1が含まれていてもよい。第2の情報25は、例えば、シンボリック実行によって、呼び出し命令22の後の命令をシンボルc2を用いて擬似的に実行することで生成できる。
The
第2の情報25が示す処理結果は、第1の実行パスによって異なる可能性がある。一例として、第2の情報25は、第1の実行パス23aの終了点における変数zの値がc2+3であるという処理結果を示す。また、第2の情報25は、第1の実行パス23bの終了点における変数zの値がc2−3であるという処理結果を示す。なお、呼び出し命令22の前に条件分岐命令が存在する場合、第1の情報24が示す処理結果も、第2の情報25と同様に第1の実行パスによって異なる可能性がある。
The processing result indicated by the
また、演算部12は、モジュール21とは独立にモジュール26についてシンボリック実行を行う。モジュール26のシンボリック実行は、モジュール21のシンボリック実行よりも前に行ってもよいし、モジュール21のシンボリック実行の後に行ってもよい。また、モジュール26のシンボリック実行は、呼び出し命令22の前までのシンボリック実行と呼び出し命令22の後のシンボリック実行との間に行ってもよい。
In addition, the
このとき、演算部12は、モジュール26の入力に、シンボルc1,c2とは独立なシンボルc3(第3のシンボル)を割り当てる。例えば、演算部12は、モジュール26で使用される変数のうちモジュール26の外部から提供される値を格納する変数に、シンボルc3を割り当てる。演算部12は、第2の実行パス27a,27bを含む複数の第2の実行パスを、モジュール26から検出する。モジュール26に含まれる1以上の条件分岐命令によって、これら複数の第2の実行パスが分岐する。
At this time, the
演算部12は、複数の第2の実行パスそれぞれの処理結果(第3の処理結果)をシンボルc3を用いて表した第3の情報28を生成する。第3の情報28は、例えば、モジュール26で使用される変数のうちモジュール26の中で更新された変数の値を、シンボルc3を含む式で表したものである。第3の情報28は、例えば、シンボリック実行によって、モジュール26の命令をシンボルc3を用いて擬似的に実行することで生成できる。
The
第3の情報28が示す処理結果は、第2の実行パスによって異なる可能性がある。一例として、第3の情報28は、第2の実行パス27aの終了点における変数yの値がc3+2であるという処理結果を示す。また、第3の情報28は、第2の実行パス27bの終了点における変数yの値がc3−2であるという処理結果を示す。なお、図1では変数x,y,zを使用しているが、これらの変数の一部または全部が同一でもよい。
The processing result indicated by the
そして、演算部12は、複数の第1の実行パスと複数の第2の実行パスとを合成し、合成実行パス31a,31b,31c,31dを含む複数の合成実行パスを生成する。合成実行パスは、モジュール21,26に跨がる実行パスであり、呼び出し命令22の前の命令に続けてモジュール26の中の命令も実行した場合に得られる実行パスと同等である。
Then, the
このとき、演算部12は、第1の情報24、第2の情報25および第3の情報28を取得する。演算部12は、第1の情報24が示す処理結果と第3の情報28に用いられたシンボルc3とを対応付ける。これは、呼び出し命令22の前の処理結果は、モジュール26に対する入力として用いられるためである。例えば、変数xの値を示す式とシンボルc3とが対応付けられる。また、演算部12は、第3の情報28が示す処理結果と第2の情報25に用いられたシンボルc2とを対応付ける。これは、モジュール26の処理結果は、呼び出し命令22の後の命令の入力として用いられるためである。例えば、変数yの値を示す式とシンボルc2とが対応付けられる。
At this time, the
演算部12は、第1の情報24、第2の情報25および第3の情報28と、上記の対応付けとによって、複数の合成実行パスそれぞれの処理結果をシンボルc1を用いて表したパス情報32を生成する。パス情報32は、呼び出し命令22も考慮して、モジュール21の入力と出力の関係を合成実行パス毎に表したものである。
The
一例として、演算部12は、第1の情報24が示すx=c1+1を、第3の情報28のシンボルc3に代入する。これにより、第2の実行パス27aの処理結果はy=c1+3と表され、第2の実行パス27bの処理結果はy=c1−1と表される。
As an example, the
更に、演算部12は、第2の実行パス27a,27bの処理結果を、第2の情報25のシンボルc2に代入する。このとき、演算部12は、任意の第1の実行パスと任意の第2の実行パスとの組み合わせを検討する。ここでは、第1の実行パス23aと第2の実行パス27aとを合成して合成実行パス31aが生成される。第1の実行パス23aと第2の実行パス27bとを合成して合成実行パス31bが生成される。第1の実行パス23bと第2の実行パス27aとを合成して合成実行パス31cが生成される。第1の実行パス23bと第2の実行パス27bとを合成して合成実行パス31dが生成される。
Further, the
演算部12は、第2の実行パス27aのy=c1+3を、第1の実行パス23aのz=c2+3のシンボルc2に代入する。これにより、合成実行パス31aの処理結果はz=c1+6と表される。また、演算部12は、第2の実行パス27bのy=c1−1を、第1の実行パス23aのz=c2+3のシンボルc2に代入する。これにより、合成実行パス31bの処理結果はz=c1+2と表される。演算部12は、第2の実行パス27aのy=c1+3を、第1の実行パス23bのz=c2−3のシンボルc2に代入する。これにより、合成実行パス31cの処理結果はz=c1と表される。演算部12は、第2の実行パス27bのy=c1−1を、第1の実行パス23bのz=c2−3のシンボルc2に代入する。これにより、合成実行パス31dの処理結果はz=c1−4と表される。
The
ただし、任意の第1の実行パスと任意の第2の実行パスとを合成した合成実行パスの全てが、プログラム20において実際に実行される有効な実行パスではないこともある。その場合、演算部12は、複数の第1の実行パスと複数の第2の実行パスとの間の全ての組み合わせの中から、有効な組み合わせのみを選択するようにしてもよい。
However, all of the combined execution paths obtained by combining the arbitrary first execution path and the arbitrary second execution path may not be valid execution paths actually executed in the
例えば、第2の情報25は、各第1の実行パスの実行条件(第1の実行条件)を、シンボルc1,c2の少なくとも一方を用いて表していてもよい。第1の実行パスの実行条件は、モジュール21に含まれる条件分岐命令の分岐条件から判定することができる。また、第3の情報28は、各第2の実行パスの実行条件(第2の実行条件)を、シンボルc3を用いて表していてもよい。第2の実行パスの実行条件は、モジュール26に含まれる条件分岐命令の分岐条件から判定することができる。
For example, the
この場合、例えば、演算部12は、ある第1の実行パスの実行条件とある第2の実行パスの実行条件とが矛盾しないとき、当該第1の実行パスと当該第2の実行パスとを合成した合成実行パスを有効と判定することができる。一方、演算部12は、ある第1の実行パスの実行条件とある第2の実行パスの実行条件とが矛盾するとき、当該第1の実行パスと当該第2の実行パスとを合成した合成実行パスを無効と判定することができる。
In this case, for example, when the execution condition of a certain first execution path and the execution condition of a certain second execution path do not contradict each other, the
第1の実施の形態のプログラム分析装置10によれば、モジュール21のシンボリック実行とモジュール26のシンボリック実行とが独立に実行される。モジュール21のシンボリック実行によって、呼び出し命令22の前についての第1の情報24と、呼び出し命令22の後についての第2の情報25とが収集される。また、モジュール26のシンボリック実行によって、第3の情報28が収集される。そして、第1の情報24、第2の情報25および第3の情報28に基づいて、モジュール21から検出された複数の第1の実行パスとモジュール26から検出された複数の第2の実行パスとが合成される。
According to the
これにより、モジュール21,26に跨がる実行パスを分析する際のパス爆発を抑制し、プログラム20の実行パスを効率的に分析することができる。例えば、モジュール21にN個の直列の条件分岐命令が含まれ、モジュール26にM個の直列の条件分岐命令が含まれているとする。モジュール21,26に跨がる実行パスをシンボリック実行によって直接検出する場合、最大で2M+N個の実行パスが検出される。一方、第1の実施の形態によれば、シンボリック実行によって検出すべき実行パスは最大で2M+2N個となる。このため、シンボリック実行の計算量を削減することができる。
Thus, it is possible to suppress a path explosion when analyzing an execution path extending over the
また、第1の実施の形態では、モジュール21から呼び出されるモジュール26の処理を無視しているわけではなく、モジュール26から検出された第2の実行パスがモジュール21から検出された第1の実行パスと合成される。よって、生成されるパス情報32は、モジュール21の入力と出力との関係を正しく表すことができる。
Further, in the first embodiment, the processing of the
[第2の実施の形態]
次に、第2の実施の形態を説明する。
第2の実施の形態のプログラム分析装置は、シンボリック実行によってプログラムから実行パスを抽出し、入力と出力の関係を示すロジック情報を生成する。
[Second embodiment]
Next, a second embodiment will be described.
The program analyzer according to the second embodiment extracts an execution path from a program by symbolic execution, and generates logic information indicating a relationship between an input and an output.
図2は、プログラム分析装置のハードウェア例を示すブロック図である。
プログラム分析装置100は、プロセッサ101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。プログラム分析装置100の上記ユニットは、バス108に接続されている。なお、プログラム分析装置100は、第1の実施の形態のプログラム分析装置10に対応する。プロセッサ101は、第1の実施の形態の演算部12に対応する。RAM102またはHDD103は、第1の実施の形態の記憶部11に対応する。
FIG. 2 is a block diagram illustrating an example of hardware of the program analysis device.
The
プロセッサ101は、プログラムの命令を実行する演算回路を含むプロセッサである。プロセッサ101は、例えば、CPUである。プロセッサ101は、HDD103に記憶されたプログラムおよびデータの少なくとも一部をRAM102にロードし、ロードされたプログラムを実行する。なお、プロセッサ101が複数のプロセッサコアを備えてもよいし、プログラム分析装置100が複数のプロセッサを備えてもよい。以下で説明する処理を、複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。
The
RAM102は、プロセッサ101が実行するプログラムや演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、プログラム分析装置100は、RAM以外の種類のメモリを備えてもよいし、複数個のメモリを備えてもよい。
The
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、分析プログラムが含まれる。なお、プログラム分析装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよいし、複数の不揮発性の記憶装置を備えてもよい。
The
画像信号処理部104は、プロセッサ101からの命令に従って、プログラム分析装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
The image
入力信号処理部105は、プログラム分析装置100に接続された入力デバイス112から入力信号を取得し、プロセッサ101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、プログラム分析装置100に、複数の種類の入力デバイスが接続されていてもよい。
The input
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
The
媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、プロセッサ101によって実行される。なお、記録媒体113は、可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
The
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他の装置と通信を行うインタフェースである。通信インタフェース107は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
The
次に、シンボリック実行によるプログラムの分析について説明する。
図3は、プログラムの第1の例を示す図である。
プログラム141は、分析対象のプログラムの一例である。プログラム141は、変数「性別」の値として2文字の文字列を受け取り、変数「出力」の値として1文字を出力する。プログラム141は、14行目に1つ目の条件分岐文を含み、19行目に2つ目の条件分岐文を含む。14行目の条件分岐文では、変数「性別」の値が「男性」であるか判定される。変数「性別」の値が「男性」である場合には変数「出力」の値が「M」に更新され、そうでない場合には変数「出力」の値が「 」(空白)に更新される。また、19行目の条件分岐文では、変数「性別」の値が「女性」であるか判定される。変数「性別」の値が「女性」である場合には変数「出力」の値が「F」に更新され、そうでない場合には変数「出力」の値は変化しない。そして、プログラム141が終了する。
Next, analysis of a program by symbolic execution will be described.
FIG. 3 is a diagram illustrating a first example of the program.
The
プログラム141には3つの実行パスが存在する。変数「性別」の値に応じて、これら3つの実行パスのうちの何れか1つが実行される。変数「性別」の値が「男性」である場合、14行目の分岐条件はYESと判定され、19行目の分岐条件はNOと判定される。この実行パスでは、変数「出力」の値は「M」になる。変数「性別」の値が「女性」である場合、14行目の分岐条件はNOと判定され、19行目の分岐条件はYESと判定される。この実行パスでは、変数「出力」の値は「F」になる。変数「性別」の値が「男性」でも「女性」でもない場合、14行目の分岐条件と19行目の分岐条件の両方がNOと判定される。この実行パスでは、変数「出力」の値は「 」(空白)になる。
The
プログラム141は直列の2つの条件分岐文を含むため、分岐条件の内容を無視すれば、実行パスの候補は4つ存在する。しかし、変数「性別」の値が「男性」であることと変数「性別」の値が「女性」であることは矛盾するため、14行目の分岐条件と19行目の分岐条件の両方がYESと判定されることはない。よって、4つの実行パスの候補のうち、実行される可能性のある有効な実行パスは3つである。
Since the
条件分岐文において、ある分岐方向(YES方向またはNO方向)に進むための条件を満たす変数の値が少なくとも1つ存在するとき、その分岐方向は「充足可能である」と言うことがある。一方、ある分岐方向に進むための条件を満たす変数の値が存在しないとき、その分岐方向は「充足可能でない」と言うことがある。 In a conditional branch statement, when there is at least one variable value that satisfies a condition for proceeding in a certain branch direction (YES direction or NO direction), the branch direction may be referred to as “satisfiable”. On the other hand, when there is no value of a variable that satisfies the condition for proceeding in a certain branch direction, the branch direction may be referred to as “not satisfyable”.
プログラム141において、14行目の条件分岐文では変数「性別」の値は制約されていないため、2つの分岐方向は共に充足可能である。一方、19行目の条件分岐文における充足可能性は、14行目の条件分岐文で選択した分岐方向に依存する。14行目のYES方向を選択した場合、19行目のYES方向は充足可能でなくなりNO方向のみ充足可能となる。14行目のNO方向を選択した場合、19行目の2つの分岐方向は共に充足可能である。よって、有効な実行パスは3つであると判断できる。
In the
ここで、プログラム141をシンボリック実行する例を説明する。プログラム分析装置100は、プログラム141に対する入力を示す変数「性別」に、具体的な文字ではなく任意の定数を示す抽象的なシンボル(記号値)を割り当てる。ここでは、変数名と同じ「性別」をシンボルとして用いる。プログラム分析装置100は、シンボルを用いてプログラム141の命令を擬似的に実行していく。
Here, an example in which the
プログラム141の始点から14行目の条件分岐文の前までは、実行パスの分岐は存在しない。14行目の条件分岐文について、この時点ではその実行パスが選択される条件(パス条件)は存在せず、2つの分岐方向は共に充足可能である。よって、プログラム分析装置100は、14行目の条件分岐文において実行パスを分割し、一方の実行パスを選択する。ここでは、プログラム分析装置100はYES方向の実行パスを選択したとする。
There is no execution path branch from the start of the
次に、19行目の条件分岐文について、この時点におけるパス条件はシンボル「性別」が「男性」であることであるため、YES方向は充足可能でなくNO方向は充足可能である。よって、プログラム分析装置100はNO方向を選択する。その後、この1番目の実行パスは終了する。プログラム分析装置100は、1番目の実行パスのパス条件を、シンボル「性別」が「男性」でありかつシンボル「性別」が「女性」でないと判定する。また、プログラム分析装置100は、1番目の実行パスの処理結果(パス出力)を、変数「出力」の値が「M」であると判定する。
Next, regarding the conditional branch statement on the 19th line, the path condition at this point is that the symbol “sex” is “male”, so the YES direction cannot be satisfied and the NO direction can be satisfied. Therefore, the
1番目の実行パスが終了すると、プログラム分析装置100は、実行パスの直近の分割点まで戻り、未選択の実行パスを選択する。ここでは、プログラム分析装置100は、14行目の条件分岐文まで戻ってNO方向の実行パスを選択する。
When the first execution path is completed, the
19行目の条件分岐文について、この時点におけるパス条件はシンボル「性別」が「男性」でないことであるため、YES方向とNO方向の何れも充足可能である。よって、プログラム分析装置100は、19行目の条件分岐文において実行パスを更に分割し、一方の実行パスを選択する。ここでは、プログラム分析装置100はYES方向の実行パスを選択したとする。その後、この2番目の実行パスは終了する。プログラム分析装置100は、2番目の実行パスのパス条件を、シンボル「性別」が「男性」でなくかつシンボル「性別」が「女性」であると判定する。また、プログラム分析装置100は、2番目の実行パスのパス出力を、変数「出力」の値が「F」であると判定する。
Regarding the conditional branch statement on the 19th line, the path condition at this point is that the symbol “sex” is not “male”, so that both the YES direction and the NO direction can be satisfied. Therefore, the
2番目の実行パスが終了すると、プログラム分析装置100は、19行目の条件分岐文まで戻ってNO方向の実行パスを選択する。その後、この3番目の実行パスは終了する。プログラム分析装置100は、3番目の実行パスのパス条件を、シンボル「性別」が「男性」でなくかつシンボル「性別」が「女性」でないと判定する。また、プログラム分析装置100は、3番目の実行パスのパス出力を、変数「出力」の値が「 」(空白)であると判定する。そして、未選択の実行パスが存在しないためシンボリック実行が終了する。
When the second execution path is completed, the
なお、プログラム分析装置100は、実行パスの分割点において、その時点のパス条件と各変数の値とを保存しておく。プログラム分析装置100は、1つの実行パスが終了して分割点までバックトラックしたとき、保存しておいたパス条件と各変数の値とを引き継いで、未選択の分岐方向に対応する他の実行パスの探索を続ける。
The program analyzer 100 stores the path conditions at that time and the values of the variables at the division points of the execution path. When one execution path is completed and backtracked to the division point, the
図4は、ロジックテーブルの第1の例を示す図である。
プログラム分析装置100は、プログラム141のシンボリック実行の結果として、ロジックテーブル142を生成する。プログラム分析装置100は、生成したロジックテーブル142を、プログラム分析装置100が備えるディスプレイに表示する。
FIG. 4 is a diagram illustrating a first example of the logic table.
The
ロジックテーブル142は、プログラム141に対する入力とプログラム141からの出力との関係(ロジック)を示す。ロジックテーブル142は、パス番号、パス条件およびパス出力の項目を有する。パス番号の項目には、シンボリック実行によって検出された実行パスの識別番号が記載される。パス条件の項目には、実行パスが選択されるための入力の条件が記載される。パス出力の項目には、実行パスの終点における出力変数の値が記載される。パス条件およびパス出力は、シンボルを用いて表されることがある。
The logic table 142 shows a relationship (logic) between an input to the
前述のように、1番目の実行パスのパス条件は、「性別が男性である」かつ「性別が女性でない」ことである。これは、「性別が男性である」と簡約化できる。1番目の実行パスのパス出力は、「出力がMである」ことである。2番目の実行パスのパス条件は、「性別が男性でない」かつ「性別が女性である」ことである。これは、「性別が女性である」と簡約化できる。2番目の実行パスのパス出力は、「出力がFである」ことである。3番目の実行パスのパス条件は、「性別が男性でない」かつ「性別が女性でない」ことである。3番目の実行パスのパス出力は、「出力が空白である」ことである。 As described above, the pass condition of the first execution pass is that “sex is male” and “sex is not female”. This can be simplified as "sex is male". The path output of the first execution path is “output is M”. The pass condition of the second execution pass is that “sex is not male” and “sex is female”. This can be simplified as "sex is female". The path output of the second execution pass is "output is F". The pass condition of the third execution pass is that “sex is not male” and “sex is not female”. The path output of the third execution pass is "output is blank".
なお、条件分岐文における充足可能性の判断やパス条件の簡約化には、数式処理技術を利用することができる。プログラム分析装置100は、SMT(Satisfiability Modulo Theories)ソルバやSAT(Satisfiability)ソルバを用いてもよい。パス条件は、例えば、シンボルを含む式をシンボルについて解くことで簡約化できる。
It should be noted that a mathematical processing technique can be used to determine the satisfiability of the conditional branch statement and to simplify the path condition. The
次に、シンボリック実行におけるパス爆発について説明する。
図5は、プログラムの第2の例を示す図である。
プログラム121は、プログラム141とは異なる分析対象のプログラムの例である。プログラム121は、「入力1」の値として10進数3桁以下の数値を受け取り、「出力1」の値として10進数3桁以下の数値を出力する。プログラム121は、セクションAとセクションBという2つのモジュールを含む。また、プログラム121は、「変数1」という変数を含む。「変数1」は、セクションAとセクションBの両方から参照および更新を行うことができるグローバル変数である。
Next, a path explosion in symbolic execution will be described.
FIG. 5 is a diagram illustrating a second example of the program.
The
プログラム121は、受け取った「入力1」の値を「変数1」に代入してセクションAを呼び出す。プログラム121は、セクションAが終了すると「変数1」の値を「出力1」に代入する。そして、プログラム121の処理が終了する。
The
セクションAは、17行目と25行目に条件分岐文を含み、23行目にセクションBを呼び出す呼び出し文を含む。セクションAは、セクションAの外部から与えられる「変数1」の値を使用する。セクションAは、「変数1」の値が10より大きい場合には「変数1」の値を1増加させ、「変数1」の値が10以下である場合には「変数1」の値を1減少させる。次に、セクションAはセクションBを呼び出す。セクションBを呼び出すPERFORM文には、戻り値を格納する変数が明記されていない。このため、セクションBによって「変数1」の値が更新されているか否かは、セクションAの命令文のみからでは不明である。すなわち、PERFORM文では、呼び出し先のセクションの作用は不明となる。その後、セクションAは、「変数1」の値が30より小さい場合には「変数1」の値を3増加させ、「変数1」の値が30以上である場合には「変数1」の値を3減少させる。そして、セクションAの処理が終了する。
Section A contains conditional branch statements on
セクションBは、34行目に条件分岐文を含む。セクションBは、セクションBの外部から与えられる「変数1」の値を使用する。セクションBは、「変数1」の値が20より大きい場合には「変数1」の値を2増加させ、「変数1」の値が20以下である場合には「変数1」の値を2減少させる。そして、セクションBの処理が終了する。 Section B includes a conditional branch statement on line 34. The section B uses the value of “variable 1” given from the outside of the section B. Section B increases the value of “variable 1” by 2 when the value of “variable 1” is larger than 20, and increases the value of “variable 1” by 2 when the value of “variable 1” is 20 or less. Decrease. Then, the processing of the section B ends.
プログラム分析装置100は、シンボリック実行によって分析する分析範囲を、1つのプログラム全体ではなく、一部のセクションなどプログラム内の一部のモジュールに限定することもできる。これにより、シンボリック実行の計算量を削減することができる。分析範囲は、プログラム分析装置100のユーザが指定することができる。プログラム121については、セクションAを分析範囲に指定することを考える。ただし、ここでは、セクションAの呼び出し先についても連続して実行パスを辿るものとする。
The
セクションAは2つの条件分岐文を含み、セクションBは1つの条件分岐文を含む。よって、セクションAとセクションBに跨がる実行パスの候補は、8つ存在する。ただし、以下に説明するように、有効な実行パスはそのうち4つである。 Section A contains two conditional branch statements, and section B contains one conditional branch statement. Therefore, there are eight execution path candidates that span section A and section B. However, as described below, there are four effective execution paths.
プログラム分析装置100は、セクションAの入力が格納される「変数1」にシンボル「変数1_A」を割り当てる。17行目において変数1_Aは制約されていないため、2つの分岐方向は何れも充足可能である。プログラム分析装置100は、YES方向を選択し、「変数1」の値を変数1_A+1に更新する。次に、34行目においてパス条件は変数1_Aが10より大きいことであるため、2つの分岐方向は何れも充足可能である。プログラム分析装置100は、YES方向を選択し、「変数1」の値を変数1_A+1+2=変数1_A+3に更新する。次に、25行目においてパス条件は変数1_Aが10より大きくかつ変数1_A+1が20より大きいことであるため、2つの分岐方向は何れも充足可能である。プログラム分析装置100は、YES方向を選択し、「変数1」の値を変数1_A+1+2+3=変数1_A+6に更新する。
The
これにより、1番目の実行パスが終了する。1番目の実行パスのパス条件は、変数1_Aが10より大きく、変数1_A+1が20より大きくかつ変数1_A+1+2が30より小さいことである。すなわち、1番目の実行パスのパス条件は、変数1_Aが19より大きく27より小さいことである。また、1番目の実行パスのパス出力は、「変数1」の値が変数1_A+6であることである。
Thus, the first execution pass ends. The path condition of the first execution path is that variable 1_A is larger than 10, variable 1_A + 1 is larger than 20, and variable 1_A + 1 + 2 is smaller than 30. That is, the path condition of the first execution path is that the variable 1_A is larger than 19 and smaller than 27. The path output of the first execution path is that the value of “variable 1” is
同様にして、プログラム分析装置100は、プログラム121から残りの3つの実行パスを検出する。2番目の実行パスは、17行目のYES方向と34行目のYES方向と25行目のNO方向を選択したものである。よって、2番目の実行パスのパス条件は、変数1_Aが10より大きく、変数1_A+1が20より大きくかつ変数1_A+1+2が30以上であることである。すなわち、2番目の実行パスのパス条件は、変数1_Aが27以上であることである。また、2番目の実行パスのパス出力は、「変数1」の値が変数1_A+1+2−3=変数1_Aであることである。
Similarly, the
3番目の実行パスは、17行目のYES方向と34行目のNO方向と25行目のYES方向を選択したものである。よって、3番目の実行パスのパス条件は、変数1_Aが10より大きく、変数1_A+1が20以下でありかつ変数1_A+1−2が30より小さいことである。すなわち、3番目の実行パスのパス条件は、変数1_Aが10より大きく19以下であることである。また、3番目の実行パスのパス出力は、「変数1」の値が変数1_A+1−2+3=変数1_A+2であることである。
In the third execution path, the YES direction on the 17th line, the NO direction on the 34th line, and the YES direction on the 25th line are selected. Therefore, the path condition of the third execution path is that the variable 1_A is larger than 10, the variable 1_A + 1 is 20 or smaller, and the variable 1_A + 1-2 is smaller than 30. That is, the path condition of the third execution path is that the variable 1_A is larger than 10 and equal to or smaller than 19. The path output of the third execution pass is that the value of “variable 1” is variable 1_A + 1−2 + 3 =
4番目の実行パスは、17行目のNO方向と34行目のNO方向と25行目のYES方向を選択したものである。よって、4番目の実行パスのパス条件は、変数1_Aが10以下であり、変数1_A−1が20以下でありかつ変数1_A−1−2が30より小さいことである。すなわち、4番目の実行パスのパス条件は、変数1_Aが10以下であることである。また、4番目の実行パスのパス出力は、「変数1」の値が変数1_A−1−2+3=変数1_Aであることである。他の分岐方向の組み合わせは充足可能でない。 In the fourth execution path, the NO direction on the 17th line, the NO direction on the 34th line, and the YES direction on the 25th line are selected. Therefore, the path condition of the fourth execution path is that the variable 1_A is 10 or less, the variable 1_A-1 is 20 or less, and the variable 1_A-1-2 is less than 30. That is, the path condition of the fourth execution path is that the variable 1_A is 10 or less. The path output of the fourth execution path is that the value of “variable 1” is variable 1_A-1-2 + 3 = variable 1_A. Other branch direction combinations are not satisfiable.
図6は、ロジックテーブルの第2の例を示す図である。
プログラム分析装置100は、上記のシンボリック実行の結果として、ロジックテーブル129を生成する。プログラム分析装置100は、生成したロジックテーブル129を、プログラム分析装置100が備えるディスプレイに表示する。
FIG. 6 is a diagram illustrating a second example of the logic table.
The
ロジックテーブル129は、分析範囲であるセクションAに対する入力とセクションAからの出力との関係を示す。ロジックテーブル129は、ロジックテーブル142と同様にパス番号、パス条件およびパス出力の項目を有する。ロジックテーブル129には、検出された4つの実行パスのロジックが記載される。パス条件やパス出力は、簡約化されて表示されてもよいし簡約化せずに表示されてもよい。図6では、簡約化前のパス条件およびパス出力と簡約化後のパス条件およびパス出力の両方を表示している。 The logic table 129 indicates a relationship between an input to the section A, which is an analysis range, and an output from the section A. The logic table 129 has items of a path number, a path condition, and a path output, similarly to the logic table 142. The logic of the four execution paths detected is described in the logic table 129. The path condition and the path output may be displayed in a simplified manner or may be displayed without being simplified. FIG. 6 shows both the path condition and the path output before the reduction and the path condition and the path output after the reduction.
ところで、上記のシンボリック実行の例では、分析範囲であるセクションAと呼び出し先であるセクションBとに跨がる実行パスを直接検出した。しかし、このシンボリック実行の方法では、条件分岐文の増加に応じて検出される実行パスが指数関数的に増加するというパス爆発の問題が生じる。一方、呼び出し文を無視してセクションAのみを分析しても、セクションAのロジックを正しく分析したことにはならない。セクションAが使用する「変数1」の値をセクションBが更新するためである。そこで、プログラム分析装置100は、次のような方法でシンボリック実行を行う。
By the way, in the example of the symbolic execution described above, an execution path extending between the analysis range section A and the call destination section B is directly detected. However, in this symbolic execution method, there is a problem of a path explosion in which an execution path detected exponentially increases according to an increase in conditional branch statements. On the other hand, ignoring the call statement and analyzing only section A does not mean that the logic of section A has been correctly analyzed. This is because section B updates the value of “variable 1” used by section A. Therefore, the
図7は、シンボリック実行の分割と部分ロジックの結合の例を示す図である。
プログラム分析装置100は、分析範囲であるセクションAのシンボリック実行と呼び出し先であるセクションBのシンボリック実行とを分割して独立に行う。セクションAにN個の条件分岐文が含まれ、セクションBにM個の条件分岐文が含まれる場合、分割しないシンボリック実行の計算量は2N+Mとなる。一方、分割したシンボリック実行の計算量は2N+2Mとなり、分割しない場合よりも計算量が小さくなる。プログラム分析装置100は、セクションAのシンボリック実行によって取得される部分ロジックとセクションBのシンボリック実行によって取得される部分ロジックとを事後的に結合する。
FIG. 7 is a diagram illustrating an example of division of symbolic execution and combination of partial logic.
The
具体的には、プログラム分析装置100は、セクションAの入力を格納する「変数1」にシンボル「X」を割り当て、セクションAのシンボリック実行を開始する。プログラム分析装置100は、セクションBを呼び出す呼び出し文の直前において途中点ロジックを保存しておく。呼び出し文の直前では、パス出力が変数1=X+1であるロジックと、パス出力が変数1=X−1であるロジックとが検出されている。
Specifically, the
次に、プログラム分析装置100は、セクションAのシンボリック実行において、呼び出し文は実行せずにセクションBをスタブ化する。スタブ化において、プログラム分析装置100は、セクションBによって更新される可能性のある更新変数に、シンボル「X」とは独立なシンボルを割り当てる。更新変数は、予めセクションBの命令文を走査することで検索することができる。ここでは、プログラム分析装置100は、「変数1」にシンボル「Z」を割り当てる。プログラム分析装置100は、シンボル「Z」を用いてセクションAのシンボリック実行を継続し、セクションAの終点において終点ロジックを保存する。セクションAの終点では、パス出力が変数1=Z+3であるロジックと、パス出力が変数1=Z−3であるロジックとが検出されている。
Next, in the symbolic execution of the section A, the
また、プログラム分析装置100は、セクションBの入力を格納する「変数1」にシンボル「Y」を割り当て、セクションBのシンボリック実行を開始する。プログラム分析装置100は、セクションBの終点において呼び出し先ロジックを保存する。セクションBの終点では、パス出力が変数1=Y+2であるロジックと、パス出力が変数1=Y−2であるロジックとが検出されている。
Further, the
そして、プログラム分析装置100は、途中点ロジックと終点ロジックと呼び出し先ロジックとを結合して、セクションAとセクションBに跨がるロジックを再現する。プログラム分析装置100は、途中点ロジックが示すパス出力とセクションBの入力を示すシンボル「Y」とを対応付ける。また、プログラム分析装置100は、呼び出し先ロジックが示すパス出力とセクションBのスタブ化に使用したシンボル「Z」とを対応付ける。図7のパス候補テーブル143に示すように、途中点ロジックと終点ロジックと呼び出し先ロジックの組み合わせの候補は8通り存在する。
Then, the
すなわち、変数1=X+1と変数1=Y+2と変数1=Z+3との組み合わせから、変数1=X+1+2+3というパス出力が考えられる。変数1=X+1と変数1=Y+2と変数1=Z−3との組み合わせから、変数1=X+1+2−3というパス出力が考えられる。変数1=X+1と変数1=Y−2と変数1=Z+3との組み合わせから、変数1=X+1−2+3というパス出力が考えられる。変数1=X+1と変数1=Y−2と変数1=Z−3との組み合わせから、変数1=X+1−2−3というパス出力が考えられる。
That is, a path output of variable 1 = X + 1 + 2 + 3 can be considered from a combination of variable 1 = X + 1, variable 1 = Y + 2, and variable 1 =
変数1=X−1と変数1=Y+2と変数1=Z+3との組み合わせから、変数1=X−1+2+3というパス出力が考えられる。変数1=X−1と変数1=Y+2と変数1=Z−3との組み合わせから、変数1=X−1+2−3というパス出力が考えられる。変数1=X−1と変数1=Y−2と変数1=Z+3との組み合わせから、変数1=X−1−2+3というパス出力が考えられる。変数1=X−1と変数1=Y−2と変数1=Z−3との組み合わせから、変数1=X−1−2−3というパス出力が考えられる。 From the combination of variable 1 = X-1, variable 1 = Y + 2, and variable 1 = Z + 3, a path output of variable 1 = X-1 + 2 + 3 can be considered. From the combination of variable 1 = X-1, variable 1 = Y + 2, and variable 1 = Z-3, a path output of variable 1 = X-1 + 2-3 can be considered. From the combination of variable 1 = X-1, variable 1 = Y-2, and variable 1 = Z + 3, a path output of variable 1 = X-1-2 + 3 can be considered. From the combination of variable 1 = X-1, variable 1 = Y-2, and variable 1 = Z-3, a path output of variable 1 = X-1-2-3 can be considered.
ただし、前述のように、上記の8通りのロジックの全てが有効であるわけではない。プログラム分析装置100は、途中点ロジックと終点ロジックと呼び出し先ロジックの組み合わせのうち、パス条件が矛盾しない組み合わせのみを選択する。すなわち、プログラム分析装置100は、途中点ロジックのパス条件と終点ロジックのパス条件と呼び出し先ロジックのパス条件とを結合し、結合したパス条件が充足可能であるか判定する。
However, as described above, not all of the above eight logics are valid. The
次に、シンボリック実行の分割と部分ロジックの結合の手順について説明する。
図8は、更新変数テーブルとシンボル割り当てテーブルの例を示す図である。
プログラム分析装置100は、分析範囲から、PERFORM文のように作用の記載がない呼び出し文(作用が不明な呼び出し文)を検出する。プログラム分析装置100は、検出した呼び出し文によって呼び出されるモジュールから更新変数を検索し、更新変数テーブル122を生成する。更新変数テーブル122は、モジュール名および更新変数の項目を有する。モジュール名の項目には、セクション名などのモジュール識別情報が記載される。更新変数の項目には、呼び出し先のモジュール内で値が更新される変数の変数名が記載される。更新変数は、1つのモジュールにつき2以上存在することもある。更新変数は、例えば、代入式の左辺やMOVE文の第2引数に記載された変数である。
Next, a procedure of dividing the symbolic execution and combining the partial logics will be described.
FIG. 8 is a diagram illustrating an example of the update variable table and the symbol assignment table.
The
プログラム分析装置100は、シンボリック実行の途中で作用の記載がない呼び出し文を検出すると、更新変数テーブル122に記載された更新変数にシンボルを割り当てる。プログラム分析装置100は、シンボル割り当てテーブル123を生成する。シンボル割り当てテーブル123は、変数名およびシンボルの項目を有する。変数名の項目には、更新変数の変数名が記載される。シンボルの項目には、呼び出し文の直後に更新変数に割り当てられたシンボルが記載される。一例として、更新変数に割り当てられるシンボルは、変数名、呼び出し文がPERFORM文であることを示す文字列、呼び出し文の行番号、呼び出し先モジュールの名称、その呼び出し文の実行回数を連結したものである。よって、例えば、プログラム121の23行目の通過直後、「変数1」にシンボル「変数1_Perform_23_セクションB_1」が割り当てられる。
When detecting a call statement in which no action is described during the symbolic execution, the
図9は、階層的な更新変数の抽出例を示す図である。
分析範囲から呼び出されたモジュールが更に他のモジュールを呼び出している場合、更新変数は階層的に検索される。ここでは、分析範囲がセクション144であり、セクション144からセクション144a(セクションA1)とセクション144b(セクションB1)が呼び出され、セクション144bからセクション144c(セクションB2)が呼び出されるとする。セクション144aは、変数「a11」,「a12」を更新する。セクション144bは、変数「b11」,「b12」を更新する。セクション144cは、変数「b21」を更新する。この場合、プログラム分析装置100は、更新変数テーブル122に対応する更新変数テーブル145を生成する。
FIG. 9 is a diagram illustrating an example of extracting hierarchical update variables.
If a module called from the analysis scope calls another module, the update variables are searched hierarchically. Here, it is assumed that the analysis range is the
プログラム分析装置100は、セクション144からセクション144aを辿り、セクション144の1つ目の呼び出し文について変数「a11」,「a12」を更新変数として検出する。プログラム分析装置100は、セクション144aと変数「a11」,「a12」とを対応付けて更新変数テーブル145に登録する。また、プログラム分析装置100は、セクション144からセクション144b,144cを辿り、セクション144の2つ目の呼び出し文について変数「b11」,「b12」,「b21」を更新変数として検出する。プログラム分析装置100は、セクション144bと変数「b11」,「b12」,「b21」とを対応付けて更新変数テーブル145に登録する。
The
図10は、途中点と呼び出し先と終点のロジックテーブルの例を示す図である。
プログラム分析装置100は、シンボリック実行によって途中点ロジックテーブル124、呼び出し先ロジックテーブル125および終点ロジックテーブル126を生成する。
FIG. 10 is a diagram illustrating an example of a logic table of an intermediate point, a call destination, and an end point.
The
途中点ロジックテーブル124は、パス番号、パス条件およびパス出力の項目を有する。パス番号の項目には、呼び出し元モジュールの呼び出し文の前までに検出されたロジックの識別番号が記載される。パス条件の項目には、呼び出し文の直前におけるパス条件が記載される。パス出力の項目には、呼び出し文の直前における変数の値が記載される。途中点ロジックテーブル124のパス条件およびパス出力には、呼び出し元モジュールの入力に割り当てられたシンボルを用いることができる。 The halfway point logic table 124 has items of a path number, a path condition, and a path output. In the item of the path number, the identification number of the logic detected before the call statement of the calling module is described. In the path condition item, the path condition immediately before the call statement is described. In the path output item, the value of the variable immediately before the call statement is described. A symbol assigned to an input of a calling module can be used for the path condition and the path output of the halfway point logic table 124.
プログラム121について、途中点ロジックテーブル124には、パス条件が「変数1_Aが10より大きい」、パス出力が「変数1=変数1_A+1」というロジックが登録される。また、途中点ロジックテーブル124には、パス条件が「変数1_Aが10以下」、パス出力が「変数1=変数1_A−1」というロジックが登録される。
Regarding the
呼び出し先ロジックテーブル125は、パス番号、パス条件およびパス出力の項目を有する。パス番号の項目には、呼び出し先モジュールの始点から終点の間に検出されたロジックの識別番号が記載される。パス条件の項目には、呼び出し先モジュールの終点におけるパス条件が記載される。パス出力の項目には、呼び出し先モジュールの終点における変数の値が記載される。呼び出し先ロジックテーブル125のパス条件およびパス出力には、呼び出し先モジュールの入力に割り当てられたシンボルを用いることができる。 The call destination logic table 125 has items of a path number, a path condition, and a path output. In the item of the path number, the identification number of the logic detected between the start point and the end point of the called module is described. In the path condition item, a path condition at the end point of the called module is described. In the path output item, the value of a variable at the end point of the called module is described. The symbol assigned to the input of the called module can be used for the path condition and the path output of the called logic table 125.
プログラム121について、呼び出し先ロジックテーブル125には、パス条件が「変数1_Bが20より大きい」、パス出力が「変数1=変数1_B+2」というロジックが登録される。また、呼び出し先ロジックテーブル125には、パス条件が「変数1_Bが20以下」、パス出力が「変数1=変数1_B−2」というロジックが登録される。なお、シンボル「変数1_B」はセクションBの入力を示す。
For the
終点ロジックテーブル126は、パス番号、パス条件およびパス出力の項目を有する。パス番号の項目には、呼び出し元モジュールの始点から終点の間に検出されたロジックの識別番号が記載される。パス条件の項目には、呼び出し元モジュールの終点におけるパス条件が記載される。パス出力の項目には、呼び出し元モジュールの終点における変数の値が記載される。終点ロジックテーブル126のパス条件およびパス出力には、呼び出し元モジュールの入力に割り当てられたシンボルや、呼び出し文の直後に更新変数に対して割り当てられたシンボルを用いることができる。 The end point logic table 126 has items of a path number, a path condition, and a path output. In the item of the path number, the identification number of the logic detected between the start point and the end point of the calling module is described. The path condition item describes the path condition at the end point of the calling module. The path output item describes the value of a variable at the end point of the calling module. For the path condition and the path output of the end point logic table 126, a symbol assigned to the input of the calling module or a symbol assigned to the update variable immediately after the call statement can be used.
プログラム121について、終点ロジックテーブル126には、パス条件が「変数1_Aが10より大きい」かつ「変数1_Perform_23_セクションB_1が30より小さい」、パス出力が「変数1=変数1_Perform_23_セクションB_1+3」というロジックが登録される。また、終点ロジックテーブル126には、パス条件が「変数1_Aが10より大きい」かつ「変数1_Perform_23_セクションB_1が30以上」、パス出力が「変数1=変数1_Perform_23_セクションB_1−3」というロジックが登録される。
For the
また、終点ロジックテーブル126には、パス条件が「変数1_Aが10以下」かつ「変数1_Perform_23_セクションB_1が30より小さい」、パス出力が「変数1=変数1_Perform_23_セクションB_1+3」というロジックが登録される。また、終点ロジックテーブル126には、パス条件が「変数1_Aが10以下」かつ「変数1_Perform_23_セクションB_1が30以上」、パス出力が「変数1=変数1_Perform_23_セクションB_1−3」というロジックが登録される。なお、シンボル「変数1_Perform_23_セクションB」は、呼び出し文の直後に「変数1」に割り当てられたシンボルである。 In the end point logic table 126, the logic that the path condition is “variable 1_A is 10 or less” and “variable 1_Perform_23_section B_1 is smaller than 30” and the path output is “variable 1 = variable 1_Perform_23_section B_1 + 3” are registered. In the end point logic table 126, the logic that the path condition is “variable 1_A is 10 or less” and “variable 1_Perform_23_section B_1 is 30 or more” and the path output is “variable 1 = variable 1_Perform_23_section B_1-3” are registered. . The symbol “variable 1_Perform_23_section B” is a symbol assigned to “variable 1” immediately after the call statement.
図11は、部分ロジックの簡約化例を示す図である。
プログラム分析装置100は、シンボリック実行が終了すると、途中点ロジックテーブル124、呼び出し先ロジックテーブル125および終点ロジックテーブル126を取得する。プログラム分析装置100は、途中点ロジックテーブル124、呼び出し先ロジックテーブル125および終点ロジックテーブル126をそれぞれ簡約化する。図10に示した途中点ロジックテーブル124および呼び出し先ロジックテーブル125は簡約化する余地がないため、ここでは終点ロジックテーブル126の簡約化の例を説明する。
FIG. 11 is a diagram illustrating a simplified example of the partial logic.
When the symbolic execution ends, the
プログラム分析装置100は、終点ロジックテーブル126から、パス出力が同じでパス条件が異なるロジックを検索する。プログラム分析装置100は、該当する複数のロジックのパス条件を選言(OR)で連結することで、該当する複数のロジックを1つに統合する。図11の例では、図10の終点ロジックテーブル126のロジック#1とロジック#3とが統合され、ロジック#1xに変換されている。また、ロジック#2とロジック#4とが統合され、ロジック#2xに変換されている。
The
ロジック#1xのパス条件は、「変数1_Aが10より大きく変数1_Perform_23_セクションB_1が30より小さい」または「変数1_Aが10以下で変数1_Perform_23_セクションB_1が30より小さい」である。ロジック#1xのパス出力は、「変数1=変数1_Perform_23_セクションB_1+3」である。ロジック#2xのパス条件は、「変数1_Aが10より大きく変数1_Perform_23_セクションB_1が30以上」または「変数1_Aが10以下で変数1_Perform_23_セクションB_1が30以上」である。ロジック#2xのパス出力は、「変数1=変数1_Perform_23_セクションB_1−3」である。
The path condition of the
プログラム分析装置100は、統合したロジックのパス条件を数式処理技術を用いて簡約化する。図11の例では、ロジック#1xのパス条件は、「変数1_Aが10より大きいかまたは変数1_Aが10以下」かつ「変数1_Perform_23_セクションB_1が30より小さい」と変形できる。よって、ロジック#1xのパス条件は、「変数1_Perform_23_セクションB_1が30より小さい」と簡約化される。また、ロジック#2xのパス条件は、「変数1_Aが10より大きいかまたは変数1_Aが10以下」かつ「変数1_Perform_23_セクションB_1が30以上」と変形できる。よって、ロジック#2xのパス条件は、「変数1_Perform_23_セクションB_1が30以上」と簡約化される。上記のパス条件の簡約化には、例えば、クワイン・マクラスキー法を用いることができる。
The
プログラム分析装置100は、更に、簡約化したパス条件が同じでパス出力が異なるロジックを検索する。プログラム分析装置100は、該当する複数のロジックのパス出力を連言(AND)で連結することで、該当する複数のロジックを1つに統合する。ただし、図11の例では、これに該当するロジックは存在しない。
The
図12は、部分ロジックの結合例を示す図である。
プログラム分析装置100は、途中点ロジックテーブル124、呼び出し先ロジックテーブル125および終点ロジックテーブル126をそれぞれ簡約化すると、これら3つのロジックテーブルのロジックを結合する。まず、プログラム分析装置100は、途中点ロジックテーブル124のロジックと呼び出し先ロジックテーブル125のロジックとを結合し、中間結合ロジックテーブル127を生成する。
FIG. 12 is a diagram illustrating an example of combining partial logics.
When the
プログラム分析装置100は、途中点ロジックテーブル124から1つの途中点ロジックを選択し、呼び出し先ロジックテーブル125から1つの呼び出し先ロジックを選択する。プログラム分析装置100は、選択した途中点ロジックのパス出力を、選択した呼び出し先ロジックのパス条件に用いられているシンボルに代入する。そして、プログラム分析装置100は、代入結果と途中点ロジックのパス条件との連言(AND)を、中間結合ロジックのパス条件として算出する。プログラム分析装置100は、算出した中間結合ロジックのパス条件が充足可能か判定し、充足可能である場合にはその途中点ロジックと呼び出し先ロジックの組み合わせを有効な組み合わせとして採用する。一方、プログラム分析装置100は、充足可能でない場合にはその途中点ロジックと呼び出し先ロジックの組み合わせを無効な組み合わせであるとして採用しない。
The
プログラム分析装置100は、有効な組み合わせについて、途中点ロジックのパス出力を、呼び出し先ロジックのパス出力に用いられているシンボルに代入して、中間結合ロジックのパス出力を算出する。プログラム分析装置100は、有効な組み合わせについて算出したパス条件とパス出力とを、中間結合ロジックテーブル127に登録する。
For a valid combination, the
プログラム121の場合、プログラム分析装置100は、途中点ロジックのパス出力の「変数1」の値を、呼び出し先ロジックのシンボル「変数1_B」に代入することになる。プログラム分析装置100は、途中点ロジック#1と呼び出し先ロジック#1を選択し、「変数1_Aが10より大きい」かつ「変数1_A+1が20より大きい」というパス条件を算出する。これは、「変数1_A+1が20より大きい」と同等である。このパス条件は充足可能である(このパス条件を満たすようなシンボル「変数1_A」が存在する)ため、プログラム分析装置100は、途中点ロジック#1と呼び出し先ロジック#1の組み合わせを、中間結合ロジック#1として採用する。中間結合ロジック#1のパス出力は、「変数1=変数1_A+1+2」である。
In the case of the
また、プログラム分析装置100は、途中点ロジック#1と呼び出し先ロジック#2を選択し、「変数1_Aが10より大きい」かつ「変数1_A+1が20以下」というパス条件を算出する。このパス条件は充足可能であるため、プログラム分析装置100は、途中点ロジック#1と呼び出し先ロジック#2の組み合わせを、中間結合ロジック#2として採用する。中間結合ロジック#2のパス出力は、「変数1=変数1_A+1−2」である。また、プログラム分析装置100は、途中点ロジック#2と呼び出し先ロジック#1を選択し、「変数1_Aが10以下」かつ「変数1_A+1が20より大きい」というパス条件を算出する。このパス条件は充足可能でないため、プログラム分析装置100は、途中点ロジック#2と呼び出し先ロジック#1の組み合わせを採用しない。
Further, the
また、プログラム分析装置100は、途中点ロジック#2と呼び出し先ロジック#2を選択し、「変数1_Aが10以下」かつ「変数1_A+1が20以下」というパス条件を算出する。これは、「変数1_A+1が10以下」と同等である。このパス条件は充足可能であるため、プログラム分析装置100は、途中点ロジック#2と呼び出し先ロジック#2の組み合わせを、中間結合ロジック#3として採用する。中間結合ロジック#3のパス出力は、「変数1=変数1_A−1−2」である。
Further, the
図13は、部分ロジックの結合例を示す図(続き)である。
次に、プログラム分析装置100は、中間結合ロジックテーブル127のロジックと終点ロジックテーブル126のロジックとを結合し、ロジックテーブル128を生成する。
FIG. 13 is a diagram (continuation) illustrating an example of combining partial logics.
Next, the
プログラム分析装置100は、中間結合ロジックテーブル127から1つの中間結合ロジックを選択し、終点ロジックテーブル126から1つの終点ロジックを選択する。プログラム分析装置100は、選択した中間結合ロジックのパス出力を、選択した終点ロジックのパス条件に用いられているシンボルに代入する。そして、プログラム分析装置100は、代入結果と中間結合ロジックのパス条件との連言(AND)を、結合したロジックのパス条件として算出する。プログラム分析装置100は、算出したロジックのパス条件が充足可能か判定し、充足可能である場合にはその中間結合ロジックと終点ロジックの組み合わせを有効な組み合わせとして採用する。一方、プログラム分析装置100は、充足可能でない場合にはその中間結合ロジックと終点ロジックの組み合わせを無効な組み合わせであるとして採用しない。
The
プログラム分析装置100は、有効な組み合わせについて、中間結合ロジックのパス出力を、終点ロジックのパス出力に用いられているシンボルに代入して、結合したロジックのパス出力を算出する。プログラム分析装置100は、有効な組み合わせについて算出したパス条件とパス出力とを、ロジックテーブル128に登録する。
The
プログラム121の場合、プログラム分析装置100は、中間結合ロジックのパス出力の「変数1」の値を、終点ロジックのシンボル「変数1_Perform_23_セクションB_1」に代入することになる。プログラム分析装置100は、中間結合ロジック#1と終点ロジック#1xを選択し、「変数1_A+1が20より大きい」かつ「変数1_A+1+2が30より小さい」というパス条件を算出する。このパス条件は充足可能であるため、プログラム分析装置100は、中間結合ロジック#1と終点ロジック#1xの組み合わせをロジック#1として採用する。ロジック#1のパス出力は、「変数1=変数1_A+1+2+3」である。
In the case of the
また、プログラム分析装置100は、中間結合ロジック#1と終点ロジック#2xを選択し、「変数1_A+1が20より大きい」かつ「変数1_A+1+2が30以上」というパス条件を算出する。これは、「変数1_A+1+2が30以上」と同等である。このパス条件は充足可能であるため、プログラム分析装置100は、中間結合ロジック#1と終点ロジック#2xの組み合わせをロジック#2として採用する。ロジック#2のパス出力は、「変数1=変数1_A+1+2−3」である。
Further, the
また、プログラム分析装置100は、中間結合ロジック#2と終点ロジック#1xを選択し、「変数1_Aが10より大きい」かつ「変数1_A+1が20以下」かつ「変数1_A+1−2が30より小さい」というパス条件を算出する。これは、「変数1_Aが10より大きい」と同等である。このパス条件は充足可能であるため、プログラム分析装置100は、中間結合ロジック#2と終点ロジック#1xの組み合わせをロジック#3として採用する。ロジック#3のパス出力は、「変数1=変数1_A+1−2+3」である。
Further, the
また、プログラム分析装置100は、中間結合ロジック#2と終点ロジック#2xを選択し、「変数1_Aが10より大きい」かつ「変数1_A+1が20以下」かつ「変数1_A+1−2が30以上」というパス条件を算出する。このパス条件は充足可能でないため、プログラム分析装置100は、中間結合ロジック#2と終点ロジック#2xの組み合わせを採用しない。
In addition, the
また、プログラム分析装置100は、中間結合ロジック#3と終点ロジック#1xを選択し、「変数1_Aが10以下」かつ「変数1_A−1−2が30より小さい」というパス条件を算出する。これは、「変数1_Aが10以下」と同等である。このパス条件は充足可能であるため、プログラム分析装置100は、中間結合ロジック#3と終点ロジック#1xの組み合わせをロジック#4として採用する。ロジック#4のパス出力は、「変数1=変数1_A−1−2+3」である。
Further, the
また、プログラム分析装置100は、中間結合ロジック#3と終点ロジック#2xを選択し、「変数1_Aが10以下」かつ「変数1_A−1−2が30以上」というパス条件を算出する。このパス条件は充足可能でないため、プログラム分析装置100は、中間結合ロジック#3と終点ロジック#2xの組み合わせを採用しない。
In addition, the
これにより、4つのロジックが登録されたロジックテーブル128が生成される。ロジックテーブル128は、セクションAとセクションBとに跨がる実行パスを直接検出した場合に生成される図6のロジックテーブル129と同等である。このように、プログラム分析装置100は、シンボリック実行の計算量を削減しても、分析範囲のモジュールのロジックを正しく抽出することができる。なお、プログラム121の例の場合、シンボリック実行の対象となる実行パスの候補が、22×21=8つから22+21=6つに削減される。計算量の削減効果は、条件分岐文が多いほど大きくなる。
As a result, a logic table 128 in which four logics are registered is generated. The logic table 128 is equivalent to the logic table 129 of FIG. 6 generated when an execution path extending between the section A and the section B is directly detected. In this manner, the
図14は、プログラムの第3の例を示す図である。
プログラム146は、プログラム121と同様にセクションAおよびセクションBを含む。ただし、プログラム146では、セクションBに条件分岐文が追加されている。追加された命令文では、「変数1」の値が25より小さい場合に「変数1」の値を4増加させ、「変数1」の値が25以上である場合に「変数1」の値を4減少させる。
FIG. 14 is a diagram illustrating a third example of the program.
The
セクションAとセクションBに跨がる実行パスをシンボリック実行によって直接検出する場合、探索する実行パスの候補は22×22=16個になる。一方、セクションAのシンボリック実行とセクションBのシンボリック実行を分割して事後的に部分ロジックを結合する方法によれば、探索する実行パスの候補は22+22=8個になる。この場合、探索する実行パスの候補の数が2分の1に削減される。 When an execution path extending between section A and section B is directly detected by symbolic execution, the number of execution path candidates to be searched is 2 2 × 2 2 = 16. On the other hand, according to the method of dividing the symbolic execution of the section A and the symbolic execution of the section B and combining the partial logic a posteriori, the number of execution path candidates to be searched is 2 2 +2 2 = 8. In this case, the number of execution path candidates to be searched is reduced by half.
次に、プログラム分析装置100の機能および処理手順について説明する。
図15は、プログラム分析装置の機能例を示すブロック図である。
プログラム分析装置100は、記憶部120を有する。記憶部120は、例えば、RAM102またはHDD103に確保した記憶領域を用いて実装される。記憶部120は、プログラム121、更新変数テーブル122、シンボル割り当てテーブル123、途中点ロジックテーブル124、呼び出し先ロジックテーブル125、終点ロジックテーブル126、中間結合ロジックテーブル127およびロジックテーブル128を記憶する。
Next, functions and processing procedures of the
FIG. 15 is a block diagram illustrating a function example of the program analysis device.
The
また、プログラム分析装置100は、更新変数抽出部131、更新値割り当て部132、シンボリック実行部133、部分ロジック収集部134、ロジック簡約化部135、部分ロジック結合部136および分析結果表示部137を有する。更新変数抽出部131、更新値割り当て部132、シンボリック実行部133、部分ロジック収集部134、ロジック簡約化部135、部分ロジック結合部136および分析結果表示部137は、例えば、プロセッサ101が実行するプログラムモジュールを用いて実装される。
Further, the
更新変数抽出部131は、分析するプログラム121およびプログラム121の中の分析範囲が指定されると、分析範囲から、分析範囲外のモジュールを呼び出す呼び出し文であって作用の記載がないもの(例えば、PERFORM文)を検索する。更新変数抽出部131は、検索した呼び出し文の呼び出し先モジュールから、当該呼び出し先モジュールで値が更新される可能性のある更新変数を検索する。これにより、更新変数抽出部131は、更新変数テーブル122を生成して記憶部120に格納する。
When a
更新値割り当て部132は、シンボル割り当てテーブル123を生成して記憶部120に格納する。更新値割り当て部132は、シンボリック実行部133によるシンボリック実行が、分析範囲外のモジュールを呼び出す呼び出し文であって作用の記載がないものに到達したことを検出する。すると、更新値割り当て部132は、呼び出し先モジュールに対応する更新変数を更新変数テーブル122から検索し、検索された更新変数それぞれに対して新たなシンボルを割り当てる。更新値割り当て部132は、割り当てたシンボルをシンボル割り当てテーブル123に登録し、シンボリック実行部133に通知する。
The update
シンボリック実行部133は、更新変数抽出部131が更新変数を抽出した後、シンボリック実行を開始する。シンボリック実行の対象は、プログラム121の中の指定された分析範囲である。ただし、シンボリック実行部133は、呼び出し文が存在する場合、呼び出し先モジュールについて呼び出し元モジュールとは独立にシンボリック実行を行う。シンボリック実行部133は、各モジュールの先頭において当該モジュールの入力に対してシンボルを割り当てる。また、シンボリック実行部133は、分析範囲外のモジュールを呼び出す呼び出し文であって作用の記載がないものに到達すると、呼び出し先モジュールをスタブ化し、更新値割り当て部132から更新変数のシンボルを取得する。呼び出し文以降は、取得したシンボルを用いてシンボリック実行を続ける。
The
部分ロジック収集部134は、途中点ロジックテーブル124、呼び出し先ロジックテーブル125および終点ロジックテーブル126を生成して記憶部120に格納する。部分ロジック収集部134は、シンボリック実行部133によるシンボリック実行の過程で各種のロジック情報を収集する。部分ロジック収集部134は、シンボリック実行が呼び出し文に到達すると、呼び出し文の直前の途中点ロジックを取得して途中点ロジックテーブル124に登録する。また、部分ロジック収集部134は、シンボリック実行が呼び出し先モジュールの終点に到達すると、その時点の呼び出し先ロジックを取得して呼び出し先ロジックテーブル125に登録する。また、部分ロジック収集部134は、シンボリック実行が呼び出し元モジュールの終点に到達すると、その時点の呼び出し元ロジックを取得して終点ロジックテーブル126に登録する。
The partial
ロジック簡約化部135は、シンボリック実行の終了後、途中点ロジックテーブル124に登録された途中点ロジックを簡約化する。また、ロジック簡約化部135は、シンボリック実行の終了後、呼び出し先ロジックテーブル125に登録された呼び出し先ロジックを簡約化する。また、ロジック簡約化部135は、シンボリック実行の終了後、終点ロジックテーブル126に登録された終点ロジックを簡約化する。
After completing the symbolic execution, the
部分ロジック結合部136は、中間結合ロジックテーブル127とロジックテーブル128を生成して記憶部120に格納する。部分ロジック結合部136は、途中点ロジックテーブル124に登録された途中点ロジックと呼び出し先ロジックテーブル125に登録された呼び出し先ロジックとを結合し、中間結合ロジックを中間結合ロジックテーブル127に登録する。途中点ロジックと呼び出し先ロジックとの結合では、結合後のパス条件が充足可能であるもののみが採用される。部分ロジック結合部136は、中間結合ロジックと終点ロジックテーブル126に登録された終点ロジックとを結合し、結合したロジックをロジックテーブル128に登録する。中間結合ロジックと終点ロジックとの結合では、結合後のパス条件が縦走可能であるもののみが採用される。
The partial
分析結果表示部137は、生成されたロジックテーブル128をディスプレイ111に表示する。ただし、プログラム分析装置100は、生成されたロジックテーブル128を他の装置に送信してもよい。また、プログラム分析装置100は、ロジックテーブル128の内容を読み上げる音声をスピーカから再生する、ロジックテーブル128を印刷デバイスに出力するなど、他の方法でロジックテーブル128を出力してもよい。
The analysis
図16は、プログラム分析の手順例を示すフローチャートである。
(S1)プログラム分析装置100は、分析対象のプログラム121の指定およびプログラム121の中の分析範囲とする1以上のモジュールの指定を取得する。これらの指定は、例えば、入力デバイス112を用いてユーザから入力される。
FIG. 16 is a flowchart illustrating an example of a procedure of program analysis.
(S1) The
(S2)更新変数抽出部131は、分析範囲の実行時に呼び出される可能性のある分析範囲外のモジュールの更新変数を抽出する。更新変数抽出の詳細は後述する。
(S3)シンボリック実行部133は、分析範囲のモジュールと呼び出し先である分析範囲外のモジュールとについて、別個にシンボリック実行を行う。部分ロジック収集部134は、シンボリック実行が行われている間、途中点ロジックと呼び出し先ロジックと終点ロジックとを収集する。シンボリック実行の詳細は後述する。
(S2) The update
(S3) The
(S4)ロジック簡約化部135は、収集された途中点ロジックと呼び出し先ロジックと終点ロジックとをそれぞれ簡約化する。ロジック簡約化の詳細は後述する。
(S5)部分ロジック結合部136は、簡約化後の途中点ロジックと呼び出し先ロジックとを結合する。ロジック結合の詳細は後述する。
(S4) The
(S5) The partial
(S6)部分ロジック結合部136は、ステップS5で生成した中間結合ロジックと終点ロジックとを結合する。ロジック結合のアルゴリズムはステップS5と同様である。
(S7)分析結果表示部137は、ステップS6によって結合されたロジックを示すロジックテーブル128をディスプレイ111に表示させる。
(S6) The partial
(S7) The analysis
図17は、更新変数抽出の手順例を示すフローチャートである。
更新変数抽出は、前述のステップS2で実行される。
(S10)更新変数抽出部131は、分析対象のプログラム121の指定およびプログラム121の中の分析範囲とする1以上のモジュールの指定を取得する。更新変数抽出部131は、指定された分析範囲のモジュールに着目する。
FIG. 17 is a flowchart illustrating an example of a procedure for extracting update variables.
The update variable extraction is performed in step S2 described above.
(S10) The update
(S11)更新変数抽出部131は、着目するモジュールから、分析範囲外のモジュールを呼び出す呼び出し文であって作用の記載がないものを検索する。
(S12)更新変数抽出部131は、ステップS11で該当する呼び出し文が検索されたか判断する。該当する呼び出し文がある場合はステップS13に処理が進み、該当する呼び出し文がない場合はステップS13〜S16の処理をスキップする。
(S11) The update
(S12) The update
(S13)更新変数抽出部131は、呼び出し先モジュールを取得する。
(S14)更新変数抽出部131は、呼び出し先モジュールから、変数の値を更新する変数更新文を検索する。値が更新される変数(更新変数)は、例えば、代入文の左辺に記載された変数や、MOVE文の第2引数として記載された変数などである。
(S13) The update
(S14) The update
(S15)更新変数抽出部131は、呼び出し先モジュールのモジュール名とステップS14で検索された更新変数の変数名とを対応付けて、更新変数テーブル122に登録する。ただし、呼び出しが階層的に行われる場合にはモジュール名として、分析範囲から呼び出される1段階目のモジュールのモジュール名を用いる。
(S15) The update
(S16)更新変数抽出部131は、ステップS13で取得した呼び出し先モジュールに着目し、当該呼び出し先モジュールについてステップS11〜S16の処理を再帰的に実行する。呼び出し先モジュールが更に他のモジュールを呼び出す呼び出し文(サブ呼び出し文)を含む場合、再帰的に更新変数が探索される。
(S16) The update
図18は、シンボリック実行の手順例を示すフローチャートである。
シンボリック実行は、前述のステップS3で実行される。
(S20)シンボリック実行部133は、分析対象のプログラム121の指定およびプログラム121の中の分析範囲とする1以上のモジュールの指定を取得する。シンボリック実行部133は、指定された分析範囲のモジュールに着目する。
FIG. 18 is a flowchart illustrating an example of a symbolic execution procedure.
Symbolic execution is performed in the above-described step S3.
(S20) The
(S21)シンボリック実行部133は、着目するモジュールの入力が格納される入力変数に独立なシンボルを割り当てる。例えば、シンボリック実行部133は、図5のセクションAの「変数1」に対してシンボル「変数1_A」を割り当てる。
(S21) The
(S22)シンボリック実行部133は、プログラム121の処理順序に従い、次に実行されるべき命令文をプログラム121から1つ取得する。
(S23)シンボリック実行部133は、ステップS22で終了文以外の命令文を取得したか判断する。終了文以外の命令文を取得した場合、ステップS24に処理が進む。終了文を取得したか該当する命令文が存在しない場合、ステップS29に処理が進む。
(S22) The
(S23) The
(S24)シンボリック実行部133は、ステップS22で取得した命令文が、分析範囲外のモジュールを呼び出す呼び出し文であって作用の記載がないものであるか判断する。図5のPERFORM文のように、呼び出し先モジュールによって更新される更新変数が明記されていない呼び出し文は、作用の記載がない呼び出し文である。取得した命令文が該当する呼び出し文である場合はステップS25に処理が進み、取得した命令文がそれ以外のものである場合はステップS31に処理が進む。
(S24) The
(S25)部分ロジック収集部134は、呼び出し文の直前におけるパス条件とパス出力を途中点ロジックテーブル124に登録する。パス条件は、着目するモジュールの先頭から呼び出し文の直前までに選択した分岐方向の条件を累積したものである。パス出力は、呼び出し文の直前における変数の値である。パス条件やパス出力には、ステップS21で割り当てられたシンボルが用いられることがある。
(S25) The partial
(S26)シンボリック実行部133は、呼び出し文が示す呼び出し先モジュールを分析済みであるか判断する。呼び出し先モジュールを分析済みである場合はステップS28に処理が進み、まだ分析していない場合はステップS27に処理が進む。
(S26) The
(S27)シンボリック実行部133は、呼び出し先モジュールに着目し、ステップS21〜S30の処理を再帰的に実行する。このとき、シンボリック実行部133は、呼び出し元モジュールの分析途中の情報を退避し、呼び出し元モジュールとは独立に呼び出し先モジュールについてシンボリック実行を行う。呼び出し先モジュールのシンボリック実行が終了すると、シンボリック実行部133は、退避しておいた分析途中の情報を用いて呼び出し元モジュールのシンボリック実行を続ける。なお、図18のフローチャートでは、呼び出し元モジュールのシンボリック実行を中断して呼び出し先モジュールのシンボリック実行を行うこととした。しかし、呼び出し元モジュールのシンボリック実行が終わってから、呼び出し先モジュールのシンボリック実行を開始するようにしてもよい。
(S27) The
(S28)更新値割り当て部132は、呼び出し先モジュールに対応する更新変数を、更新変数テーブル122から検索する。更新値割り当て部132は、検索した更新変数に独立のシンボルを割り当て、割り当てたシンボルをシンボル割り当てテーブル123に登録する。また、更新値割り当て部132は、割り当てたシンボルをシンボリック実行部133に通知する。シンボリック実行部133は、呼び出し文の直前において更新変数の値を保持している場合、その値を破棄して更新値割り当て部132から通知されたシンボルを保存する。すなわち、シンボリック実行部133は、更新変数の値が通知されたシンボルによって上書きされたものとして取り扱う。そして、ステップS22に処理が進む。
(S28) The update
(S29)シンボリック実行部133は、実行パスが終点に到達したと判断する。部分ロジック収集部134は、その時点のパス条件とパス出力を終点ロジックテーブル126に登録する。ただし、呼び出し先モジュールについてのシンボリック実行である場合、部分ロジック収集部134は、その時点のパス条件とパス出力を呼び出し先ロジックテーブル125に登録する。パス条件は、着目するモジュールの先頭から終点までに選択した分岐方向の条件を累積したものである。パス出力は、着目するモジュールの終点における変数の値である。パス条件やパス出力には、ステップS21で割り当てられたシンボルや、ステップS28で割り当てられたシンボルが用いられることがある。
(S29) The
(S30)シンボリック実行部133は、条件分岐文によって分割された実行パスであって、未選択の実行パスが残っているか判断する。未選択の実行パスがある場合、シンボリック実行部133は、1つ前の分割点までバックトラックし、保存しておいたその分割点におけるパス条件およびパス出力を取得する。シンボリック実行部133は、未選択の分岐方向を選択し、取得したパス条件およびパス出力を用いてその実行パスについてシンボリック実行を続ける。そして、ステップS22に処理が進む。一方、未選択の実行パスがない場合、着目するモジュールのシンボリック実行が終了する。
(S30) The
図19は、シンボリック実行の手順例を示すフローチャート(続き)である。
(S31)シンボリック実行部133は、ステップS22で取得した命令文が、変数の値を更新する変数更新文であるか判断する。変数更新文は、例えば、左辺と右辺を等号で結合した代入文やMOVE文などである。取得した命令文が変数更新文である場合はステップS32に処理が進み、それ以外である場合はステップS33に処理が進む。
FIG. 19 is a flowchart (continued) illustrating a procedure example of symbolic execution.
(S31) The
(S32)シンボリック実行部133は、変数更新文に従い変数の値を更新する。変数の値はシンボルを含む式で表されることもある。そして、ステップS22に処理が進む。
(S33)シンボリック実行部133は、ステップS22で取得した命令文が、条件分岐文であるか判断する。取得した命令文が条件分岐文である場合はステップS34に処理が進み、それ以外である場合はステップS37に処理が進む。
(S32) The
(S33) The
(S34)シンボリック実行部133は、条件分岐文に記載された分岐条件とその時点の変数の値とその時点のパス条件とに基づいて、YES方向とNO方向の2つの分岐方向それぞれの充足可能性を判定する。変数の値がシンボルを含む式である場合、2つの分岐方向の両方が充足可能であると判定されることもある。
(S34) The
(S35)シンボリック実行部133は、2つの分岐方向が共に充足可能であるか判断する。2つの分岐方向が共に充足可能である場合はステップS36に処理が進み、一方の分岐方向のみ充足可能である場合はステップS37に処理が進む。
(S35) The
(S36)シンボリック実行部133は、実行パスを分割する。シンボリック実行部133は、2つの分岐方向の何れか一方(例えば、YES方向)を選択して、現在の実行パスの進行方向とする。また、シンボリック実行部133は、その時点のパス条件とパス出力を退避しておく。選択しなかった分岐方向に相当する分割された実行パスは、未選択の実行パスとしておく。そして、ステップS22に処理が進む。
(S36) The
(S37)シンボリック実行部133は、ステップS22で取得した命令文に応じた処理を行う。ステップS35で一方の分岐方向のみ充足可能と判断された場合、シンボリック実行部133は、条件分岐文に従って充足可能な分岐方向を選択することになる。このとき、実行パスは分割されない。そして、ステップS22に処理が進む。
(S37) The
図20は、ロジック簡約化の手順例を示すフローチャートである。
ロジック簡約化は前述のステップS4で実行される。
(S40)ロジック簡約化部135は、途中点ロジックテーブル124、呼び出し先ロジックテーブル125および終点ロジックテーブル126のうち1つを選択する。
FIG. 20 is a flowchart illustrating an example of a procedure for simplifying logic.
Logic simplification is performed in step S4 described above.
(S40) The
(S41)ロジック簡約化部135は、ステップS40で選択したロジックテーブルから、パス出力が同じでパス条件が異なる複数のロジックを検索する。
(S42)ロジック簡約化部135は、ステップS41に該当する複数のロジックが検索された場合、検索された複数のロジックのパス条件をORで連結することで、検索された複数のロジックを1つのロジックに統合する。
(S41) The
(S42) When a plurality of logics corresponding to step S41 are searched, the
(S43)ロジック簡約化部135は、ステップS42で統合した後の各ロジックのパス条件を、冗長性を削減することで簡約化する。
(S44)ロジック簡約化部135は、ステップS43で簡約化した後のロジックのうち、パス条件が同じでパス出力が異なる複数のロジックを検索する。
(S43) The
(S44) The
(S45)ロジック簡約化部135は、ステップS44に該当する複数のロジックが検索された場合、検索された複数のロジックのパス出力をANDで連結することで、検索された複数のロジックを1つのロジックに統合する。
(S45) When a plurality of logics corresponding to step S44 are searched, the
(S46)ロジック簡約化部135は、ステップS40において、途中点ロジックテーブル124、呼び出し先ロジックテーブル125および終点ロジックテーブル126の全てを選択したか判断する。未選択のロジックテーブルがある場合はステップS40に処理が進み、3つのロジックテーブルの全てを選択した場合はロジック簡約化が終了する。
(S46) In step S40, the
図21は、ロジック結合の手順例を示すフローチャートである。
ロジック結合は、前述のステップS5およびステップS6で実行される。ステップS5とステップS6では、共通のロジック結合アルゴリズムを使用できる。
FIG. 21 is a flowchart illustrating an example of the procedure of the logic combination.
The logic combination is performed in steps S5 and S6 described above. In steps S5 and S6, a common logic combination algorithm can be used.
(S50)部分ロジック結合部136は、結合するロジックテーブルT1とロジックテーブルT2を取得する。ステップS5では、ロジックテーブルT1は途中点ロジックテーブル124であり、ロジックテーブルT2は呼び出し先ロジックテーブル125である。ステップS6では、ロジックテーブルT1は中間結合ロジックテーブル127であり、ロジックテーブルT2は終点ロジックテーブル126である。
(S50) The partial
(S51)部分ロジック結合部136は、ロジックテーブルT1からレコードR1を選択する。レコードR1は、ロジックテーブルT1の中の1つのロジックを表す。
(S52)部分ロジック結合部136は、ロジックテーブルT2からレコードR2を選択する。レコードR2は、ロジックテーブルT2の中の1つのロジックを表す。
(S51) The partial
(S52) The partial
(S53)部分ロジック結合部136は、レコードR1のパス出力をレコードR2のパス条件に用いられているシンボルに代入する。部分ロジック結合部136は、代入結果とレコードR1のパス条件とをANDで連結し、結合後のパス条件を算出する。
(S53) The partial
(S54)部分ロジック結合部136は、ステップS53で算出した結合後のパス条件の充足可能性を判定する。結合後のパス条件が充足可能である場合はステップS55に処理が進み、充足可能でない場合はステップS57に処理が進む。
(S54) The partial
(S55)部分ロジック結合部136は、レコードR1のパス出力をレコードR2のパス出力に用いられているシンボルに代入し、結合後のパス出力を算出する。
(S56)部分ロジック結合部136は、ステップS53で算出したパス条件とステップS55で算出したパス出力を結合結果のロジックテーブルに登録する。ステップS5では、結合結果のロジックテーブルは中間結合ロジックテーブル127である。ステップS6では、結合結果のロジックテーブルはロジックテーブル128である。
(S55) The partial
(S56) The partial
(S57)部分ロジック結合部136は、ロジックテーブルT2に、ステップS52で未選択のレコードが存在するか判断する。未選択のレコードがある場合はステップS52に処理が進み、全てのレコードを選択した場合はステップS58に処理が進む。
(S57) The partial
(S58)部分ロジック結合部136は、ロジックテーブルT1に、ステップS51で未選択のレコードが存在するか判断する。未選択のレコードがある場合はステップS51に処理が進み、全てのレコードを選択した場合はロジック結合が終了する。
(S58) The partial
第2の実施の形態のプログラム分析装置100によれば、呼び出し元モジュールのシンボリック実行と呼び出し先モジュールのシンボリック実行とが独立に行われる。呼び出し元モジュールのシンボリック実行では、呼び出し文の直前におけるパス条件とパス出力が保存されると共に、呼び出し文はスキップされ、呼び出し先モジュールで更新される可能性のある更新変数に新たなシンボルが割り当てられる。そして、呼び出し文の直前におけるロジック情報と呼び出し元モジュールの終点におけるロジック情報と呼び出し先モジュールの終点におけるロジック情報とが結合され、実行パスが再現される。
According to the
これにより、複数のモジュールに跨がる実行パスを分析する際のパス爆発を抑制し、シンボリック実行の計算量を削減できる。よって、実行パスを効率的に分析することができる。また、呼び出し先モジュールの処理内容を無視しているわけではないため、再現された実行パスは、呼び出し元モジュールの入力と出力の関係を正しく表している。 As a result, it is possible to suppress a path explosion when analyzing an execution path spanning a plurality of modules, and to reduce the amount of calculation of symbolic execution. Therefore, the execution path can be analyzed efficiently. Also, since the processing contents of the called module are not ignored, the reproduced execution path correctly represents the relationship between the input and output of the calling module.
10 プログラム分析装置
11 記憶部
12 演算部
20 プログラム
21,26 モジュール
22 呼び出し命令
23a,23b 第1の実行パス
24 第1の情報
25 第2の情報
27a,27b 第2の実行パス
28 第3の情報
31a,31b,31c,31d 合成実行パス
32 パス情報
c1,c2,c3 シンボル
DESCRIPTION OF
Claims (6)
第1のモジュールと第2のモジュールとを含み、前記第1のモジュールは前記第2のモジュールを呼び出す呼び出し命令を含むプログラムを取得し、
前記第1のモジュールの入力に第1のシンボルを割り当て、前記呼び出し命令の前における第1の処理結果を前記第1のシンボルを用いて表した第1の情報を生成し、前記呼び出し命令の呼び出し結果に第2のシンボルを割り当て、前記第1のモジュールに含まれる複数の第1の実行パスそれぞれの前記呼び出し命令の後における第2の処理結果を前記第2のシンボルを用いて表した第2の情報を生成し、
前記第2のモジュールの入力に第3のシンボルを割り当て、前記第2のモジュールに含まれる複数の第2の実行パスそれぞれの第3の処理結果を前記第3のシンボルを用いて表した第3の情報を生成し、
前記第1の情報が示す前記第1の処理結果と前記第3の情報に用いられた前記第3のシンボルとを対応付け、また、前記第3の情報が示す前記第3の処理結果と前記第2の情報に用いられた前記第2のシンボルとを対応付けることで、前記複数の第1の実行パスと前記複数の第2の実行パスとを合成した複数の合成実行パスそれぞれの処理結果を前記第1のシンボルを用いて表したパス情報を生成する、
プログラム分析方法。 A computer-implemented program analysis method,
A first module and a second module, wherein the first module obtains a program including a call instruction for calling the second module;
Assigning a first symbol to an input of the first module, generating first information indicating a first processing result before the call instruction using the first symbol, and calling the call instruction; A second symbol is assigned to the result, and a second processing result after the call instruction of each of the plurality of first execution paths included in the first module is expressed by using the second symbol. Generates the information for
A third symbol is assigned to an input of the second module, and a third processing result of each of a plurality of second execution paths included in the second module is represented by using the third symbol. Generates the information for
The first processing result indicated by the first information is associated with the third symbol used for the third information, and the third processing result indicated by the third information is associated with the third symbol. By associating the plurality of first execution paths with the plurality of second execution paths, a processing result of each of a plurality of synthesis execution paths obtained by synthesizing the plurality of first execution paths and the plurality of second execution paths is associated with the second symbol used for the second information. Generating path information represented by using the first symbol;
Program analysis method.
前記パス情報の生成では、1つの第1の実行パスに対応する前記第1の実行条件と1つの第2の実行パスに対応する前記第2の実行条件とが矛盾しない場合に、前記1つの第1の実行パスと前記1つの第2の実行パスとを合成する、
請求項1記載のプログラム分析方法。 The second information indicates a first execution condition of each of the plurality of first execution paths using at least one of the first and second symbols, and the third information indicates a plurality of first execution paths. The second execution condition of each of the two execution paths is expressed using the third symbol,
In the generation of the path information, when the first execution condition corresponding to one first execution path and the second execution condition corresponding to one second execution path do not contradict, the one Combining a first execution path with the one second execution path;
The program analysis method according to claim 1.
前記パス情報の生成では、前記複数の部分実行パスの前記第1の処理結果と前記複数の第1の実行パスの前記第2の処理結果と前記複数の第2の実行パスの前記第3の処理結果とを合成する、
請求項1記載のプログラム分析方法。 The first information indicates the first processing result for each of a plurality of partial execution paths that are detected when the plurality of first execution paths are executed up to before the call instruction,
In the generation of the path information, the first processing result of the plurality of partial execution paths, the second processing result of the plurality of first execution paths, and the third processing result of the plurality of second execution paths Combine with the processing result,
The program analysis method according to claim 1.
前記第2の情報の生成では、前記更新変数に前記第2のシンボルを割り当てる、
請求項1記載のプログラム分析方法。 Searching the program for an update variable updated by the second module among the variables used in the first module;
Generating the second information, allocating the second symbol to the update variable;
The program analysis method according to claim 1.
前記第1のモジュールの入力に第1のシンボルを割り当て、前記呼び出し命令の前における第1の処理結果を前記第1のシンボルを用いて表した第1の情報を生成し、前記呼び出し命令の呼び出し結果に第2のシンボルを割り当て、前記第1のモジュールに含まれる複数の第1の実行パスそれぞれの前記呼び出し命令の後における第2の処理結果を前記第2のシンボルを用いて表した第2の情報を生成し、
前記第2のモジュールの入力に第3のシンボルを割り当て、前記第2のモジュールに含まれる複数の第2の実行パスそれぞれの第3の処理結果を前記第3のシンボルを用いて表した第3の情報を生成し、
前記第1の情報が示す前記第1の処理結果と前記第3の情報に用いられた前記第3のシンボルとを対応付け、また、前記第3の情報が示す前記第3の処理結果と前記第2の情報に用いられた前記第2のシンボルとを対応付けることで、前記複数の第1の実行パスと前記複数の第2の実行パスとを合成した複数の合成実行パスそれぞれの処理結果を前記第1のシンボルを用いて表したパス情報を生成する演算部と、
を有するプログラム分析装置。 A storage unit that includes a first module and a second module, wherein the first module stores a program that includes a call instruction that calls the second module;
Assigning a first symbol to an input of the first module, generating first information indicating a first processing result before the call instruction using the first symbol, and calling the call instruction; A second symbol is assigned to the result, and a second processing result after the call instruction of each of the plurality of first execution paths included in the first module is expressed by using the second symbol. Generates the information for
A third symbol is assigned to an input of the second module, and a third processing result of each of a plurality of second execution paths included in the second module is represented by using the third symbol. Generates the information for
The first processing result indicated by the first information is associated with the third symbol used for the third information, and the third processing result indicated by the third information is associated with the third symbol. By associating the plurality of first execution paths with the plurality of second execution paths, a processing result of each of a plurality of synthesis execution paths obtained by synthesizing the plurality of first execution paths and the plurality of second execution paths is associated with the second symbol used for the second information. An operation unit that generates path information represented by using the first symbol;
A program analyzer having:
第1のモジュールと第2のモジュールとを含み、前記第1のモジュールは前記第2のモジュールを呼び出す呼び出し命令を含むプログラムを取得し、
前記第1のモジュールの入力に第1のシンボルを割り当て、前記呼び出し命令の前における第1の処理結果を前記第1のシンボルを用いて表した第1の情報を生成し、前記呼び出し命令の呼び出し結果に第2のシンボルを割り当て、前記第1のモジュールに含まれる複数の第1の実行パスそれぞれの前記呼び出し命令の後における第2の処理結果を前記第2のシンボルを用いて表した第2の情報を生成し、
前記第2のモジュールの入力に第3のシンボルを割り当て、前記第2のモジュールに含まれる複数の第2の実行パスそれぞれの第3の処理結果を前記第3のシンボルを用いて表した第3の情報を生成し、
前記第1の情報が示す前記第1の処理結果と前記第3の情報に用いられた前記第3のシンボルとを対応付け、また、前記第3の情報が示す前記第3の処理結果と前記第2の情報に用いられた前記第2のシンボルとを対応付けることで、前記複数の第1の実行パスと前記複数の第2の実行パスとを合成した複数の合成実行パスそれぞれの処理結果を前記第1のシンボルを用いて表したパス情報を生成する、
処理を実行させる分析プログラム。 On the computer,
A first module and a second module, wherein the first module obtains a program including a call instruction for calling the second module;
Assigning a first symbol to an input of the first module, generating first information indicating a first processing result before the call instruction using the first symbol, and calling the call instruction; A second symbol is assigned to the result, and a second processing result after the call instruction of each of the plurality of first execution paths included in the first module is expressed by using the second symbol. Generates the information for
A third symbol is assigned to an input of the second module, and a third processing result of each of a plurality of second execution paths included in the second module is represented by using the third symbol. Generates the information for
The first processing result indicated by the first information is associated with the third symbol used for the third information, and the third processing result indicated by the third information is associated with the third symbol. By associating the plurality of first execution paths with the plurality of second execution paths, a processing result of each of a plurality of synthesis execution paths obtained by synthesizing the plurality of first execution paths and the plurality of second execution paths is associated with the second symbol used for the second information. Generating path information represented by using the first symbol;
An analysis program that executes processing.
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2016095882A JP6659955B2 (en) | 2016-05-12 | 2016-05-12 | Program analysis method, program analysis device, and analysis program |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2016095882A JP6659955B2 (en) | 2016-05-12 | 2016-05-12 | Program analysis method, program analysis device, and analysis program |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| JP2017204164A JP2017204164A (en) | 2017-11-16 |
| JP6659955B2 true JP6659955B2 (en) | 2020-03-04 |
Family
ID=60322226
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2016095882A Expired - Fee Related JP6659955B2 (en) | 2016-05-12 | 2016-05-12 | Program analysis method, program analysis device, and analysis program |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JP6659955B2 (en) |
Families Citing this family (5)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP6954080B2 (en) * | 2017-12-14 | 2021-10-27 | 富士通株式会社 | Information processing equipment, analysis programs and analysis methods |
| JP6993573B2 (en) * | 2018-02-06 | 2022-01-13 | 富士通株式会社 | Program analysis method, program analysis device and program analysis program |
| CN113574511B (en) | 2019-03-25 | 2024-12-31 | 三菱电机株式会社 | Test case generation device, test case generation method and computer-readable recording medium |
| JP7244756B2 (en) * | 2019-06-24 | 2023-03-23 | 富士通株式会社 | Analysis program, program analysis method and program analysis device |
| WO2025196867A1 (en) * | 2024-03-18 | 2025-09-25 | 日本電気株式会社 | Program, processing device, and method |
Family Cites Families (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP6079201B2 (en) * | 2012-12-14 | 2017-02-15 | 富士通株式会社 | Symbolic execution method, symbolic execution program, and symbolic execution device |
| JP6142724B2 (en) * | 2013-08-07 | 2017-06-07 | 富士通株式会社 | Test data generation program, method and apparatus |
| JP6331756B2 (en) * | 2014-06-25 | 2018-05-30 | 富士通株式会社 | Test case generation program, test case generation method, and test case generation apparatus |
| US9152543B1 (en) * | 2014-06-28 | 2015-10-06 | Fujitsu Limited | Symbolic execution with automatic abstractions |
-
2016
- 2016-05-12 JP JP2016095882A patent/JP6659955B2/en not_active Expired - Fee Related
Also Published As
| Publication number | Publication date |
|---|---|
| JP2017204164A (en) | 2017-11-16 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| JP6659955B2 (en) | Program analysis method, program analysis device, and analysis program | |
| US8225287B2 (en) | Method for testing a system | |
| JP7147959B2 (en) | MODEL GENERATION METHOD, MODEL GENERATION DEVICE, AND PROGRAM | |
| US20180173610A1 (en) | Method for performing cared-zone code coverage evaluation with no source code modification | |
| JPWO2010134330A1 (en) | Branch prediction device, branch prediction method, compiler, compilation method thereof, and branch prediction program recording medium | |
| JP6440895B2 (en) | Software analysis apparatus and software analysis method | |
| JP2021047627A (en) | Material property prediction system and material property prediction method | |
| US20230153491A1 (en) | System for estimating feature value of material | |
| US20130262824A1 (en) | Code generation method, and information processing apparatus | |
| JP2021128779A (en) | Method, device, apparatus, and storage medium for expanding data | |
| CN110032505B (en) | Software quality determination apparatus and method, and non-transitory computer readable medium | |
| JP6309795B2 (en) | Information processing apparatus, information processing method, and program | |
| US20260073265A1 (en) | Quantum computation support method and information processing apparatus | |
| JPWO2016063502A1 (en) | Knowledge management device, knowledge management method, and program recording medium | |
| JP5169322B2 (en) | Variable optimization apparatus, variable optimization program, compiler, variable optimization method, and compilation method | |
| US8769498B2 (en) | Warning of register and storage area assignment errors | |
| JP5163172B2 (en) | Software test item editing support apparatus and software test item editing support method | |
| WO2018078735A1 (en) | Information processing device, information processing method, and information processing program | |
| US20250291872A1 (en) | Analysis device, analysis method, and recording medium | |
| JP7711845B2 (en) | System verification device, system verification method, and program | |
| JP7244756B2 (en) | Analysis program, program analysis method and program analysis device | |
| JP7111967B2 (en) | Program verification program, program verification method and program verification device | |
| JP6643718B2 (en) | Program analysis method, program analysis device, and analysis program | |
| JP2005326161A (en) | Failure candidate identification system and failure candidate identification method | |
| US20170103011A1 (en) | Information processing apparatus and system |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20190212 |
|
| A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20191209 |
|
| TRDD | Decision of grant or rejection written | ||
| A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20200107 |
|
| A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20200120 |
|
| R150 | Certificate of patent or registration of utility model |
Ref document number: 6659955 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
| LAPS | Cancellation because of no payment of annual fees |