Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
JP6574151B2 - プログラム解析装置、プログラム解析方法およびプログラム解析プログラム - Google Patents
[go: Go Back, main page]

JP6574151B2 - プログラム解析装置、プログラム解析方法およびプログラム解析プログラム - Google Patents

プログラム解析装置、プログラム解析方法およびプログラム解析プログラム Download PDF

Info

Publication number
JP6574151B2
JP6574151B2 JP2016161559A JP2016161559A JP6574151B2 JP 6574151 B2 JP6574151 B2 JP 6574151B2 JP 2016161559 A JP2016161559 A JP 2016161559A JP 2016161559 A JP2016161559 A JP 2016161559A JP 6574151 B2 JP6574151 B2 JP 6574151B2
Authority
JP
Japan
Prior art keywords
function
execution path
resource
loop
variable
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.)
Active
Application number
JP2016161559A
Other languages
English (en)
Other versions
JP2018028879A (ja
Inventor
南田 幸紀
幸紀 南田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NTT Inc
NTT Inc USA
Original Assignee
Nippon Telegraph and Telephone Corp
NTT Inc USA
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nippon Telegraph and Telephone Corp, NTT Inc USA filed Critical Nippon Telegraph and Telephone Corp
Priority to JP2016161559A priority Critical patent/JP6574151B2/ja
Publication of JP2018028879A publication Critical patent/JP2018028879A/ja
Application granted granted Critical
Publication of JP6574151B2 publication Critical patent/JP6574151B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Description

本発明は、プログラム解析装置、プログラム解析方法およびプログラム解析プログラムに関する。
プログラム作成時に誤りを検出する技術が研究されている。そのひとつに、静的コード解析によりプログラムの誤りの可能性のある箇所を検出する技術がある。
静的コード解析による誤り検出技術の例として、Cプログラムを対象としたmalloc関数で確保したメモリがfree関数で解放されていない箇所を検出する技術、malloc関数で確保した未初期化メモリを参照している箇所を検出する技術などがある(例えば非特許文献1参照)。
W. R. Bush, J. D. Pincus, and D. J. Sielaff, "A static analyzer for finding dynamic programming errors", Software Practice and Experience, 2000年, vol. 30, No. 7, pp. 775-802
ところで、プログラム作成者は、malloc関数やfree関数などの一般的なリソース捕捉関数、リソース解放関数を使用するだけでなく、独自のリソース捕捉関数とリソース解放関数を用いてプログラムを作成することがある。
既存の静的コード解析ツールは、malloc関数やfree関数などの一般的な関数で捕捉したリソースの未初期化参照やリソース解放漏れを検出できる。しかし、既存の静的コード解析ツールでは、プログラム作成者が独自のリソース捕捉関数とリソース解放関数を使用してプログラムを作成した場合に、プログラム作成者独自のリソース捕捉関数を用いて捕捉されたリソースの未初期化参照やリソース解放漏れを検出することができなかった。
そこで、既存の静的コード解析ツールに、プログラム作成者独自のリソース捕捉関数やリソース解放関数を登録し、malloc関数やfree関数と同様に静的コード解析をすることも考えられる。すなわち、プログラム作成者独自のリソース捕捉関数が捕捉したリソースを、malloc関数が捕捉したメモリと同様に扱い、また、プログラム作成者独自のリソース捕捉関数が捕捉したリソースが独自の解放関数で解放されるべきという関係性を、malloc関数で捕捉されたメモリがfree関数で解放されるべきという関係性と同様に扱うことによって、捕捉されたリソースの未初期化参照やリソース解放漏れを検出できると考えられる。
プログラム作成者独自の関数を静的コード解析ツールに登録するためには、静的コード解析ツールのユーザがリソース捕捉・解放関数を管理し登録することが必要となる。しかし、そのためには、静的コード解析を行うために、ユーザがリソース捕捉・解放関数を管理しておき、かつ、ツールに誤りなく登録する手間がかかり、利便性が悪い。
そこで、プログラム作成者独自のリソース捕捉・解放関数を、プログラムから自動的に検出する技術を開発することが考えられる。本発明者はこれまでに、リソース捕捉関数とリソース解放関数とがソースコード上に対になって出現することに着目して、ソースコードを解析して自動的にリソース捕捉関数とリソース解放関数のペアを検出する技術を提案している(特願2015−028456号)。また、本発明者は、作成されたプログラムがリソース解放漏れを含む可能性があることを前提として、リソース解放漏れの誤りを含む可能性がある経路を検出する技術も提案している(特願2015−156945号)。
開示の実施形態は、上記に鑑みてなされたものであり、分岐やループを含むソースコードからリソース捕捉関数とリソース解放関数のペアを抽出することを目的とする。
開示するプログラム解析装置、プログラム解析方法およびプログラム解析プログラムは、ソースコード中、第1の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを1回からn回(nは2以上の自然数)まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する。そして、プログラム解析装置、プログラム解析方法およびプログラム解析プログラムは、生成した実行パスにおいて、第1の関数と、第1の関数の戻り値を格納する変数と、第1の関数とは異なり該第1の関数の戻り値を格納した変数を引数とする第2の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、第1の関数と第2の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する。
開示するプログラム解析装置、プログラム解析方法およびプログラム解析プログラムは、分岐やループを含むソースコードからリソース捕捉関数とリソース解放関数のペアを抽出するという効果を奏する。
図1は、本実施の形態におけるプログラム解析処理の概要について説明するための図である。 図2は、ソースコード中、関数fが複数回呼び出される場合の関数ペアの抽出手法について説明するための図である。 図3は、本実施の形態におけるプログラム解析装置の構成の一例を示すブロック図である。 図4は、本実施の形態におけるプログラム解析処理の流れの一例を示すフローチャートである。 図5は、ソースコード解析処理の流れの一例を示すフローチャートである。 図6は、プログラム解析装置の解析対象であるソースコードの一例を示す図である。 図7は、図6のソースコードから作成したサブルーチン展開コードの例を示す図である。 図8は、図7のサブルーチン展開コードから抽出した関数の、全関数集合と全関数ペア集合とを示す図である。 図9は、ソースコードに含まれる分岐やループの構造を簡略化して示す図である。 図10は、実行パス生成処理を説明するための、非決定的実行パスのセットの一例を示す図である。 図11は、実行パス生成処理を説明するための、ラベルパスのセットの一例を示す図である。 図12は、実行パス生成処理においてループを1回実行して縮約実行パスを生成する場合について説明するための図である。 図13は、実行パス生成処理においてループを2回実行して縮約実行パスを生成する場合について説明するための図である。 図14は、実行パス生成処理においてループを3回実行して縮約実行パスを生成する場合について説明するための図である。 図15は、実行パス生成処理においてループを4回実行して縮約実行パスを生成する場合について説明するための図である。 図16は、実行パス生成処理においてループを5回実行して縮約実行パスを生成する場合について説明するための図である。 図17は、実行パス生成処理においてループを6回実行して縮約実行パスを生成する場合について説明するための図である。 図18は、図12乃至図17に示す実行パス生成処理において生成される縮約実行パスを説明するための図である。 図19は、実施の形態に係る実行パス生成処理の流れの一例を示すフローチャートである。 図20は、実施の形態に係る実行パス生成処理により生成され、実行パス記憶部に記憶される情報の構成の一例を示す図である。 図21は、実施の形態に係る関数ペア抽出処理の流れの一例を示すフローチャートである。 図22は、開示の技術にかかるプログラム解析プログラムによる情報処理がコンピュータを用いて具体的に実現されることを示す図である。 図23は、アプリケーションプログラムがリソースを管理して動的に捕捉および解放を行う場合について説明するための図である。
以下に、開示する装置、方法およびプログラムの実施形態を図面に基づいて詳細に説明する。なお、この実施形態によりこの発明が限定されるものではない。また、各実施形態は適宜組み合わせることができる。
[リソースの初期化漏れの一例]
リソースを捕捉した後に解放漏れ(初期化誤り)が発生する例として、アプリケーションプログラムがリソースを管理して動的に捕捉および解放を行うような仕組みの場合が考えられる。例としては、システムと一定数のFAXボードが接続されている場合に、アプリケーションプログラムがFAXボードを操作するためにリソースを設けるような仕組みのプログラムを作成する場合が挙げられる。
図23は、アプリケーションプログラムがリソースを管理して動的に捕捉および解放を行う場合について説明するための図である。図23の例(1)の場合、アプリケーションプログラム(AP)が実行されると、最初に複数のリソース(M1〜M7)が生成される。そして、アプリケーションプログラムが実行される中で、最初に生成された複数のリソースの中から所定のリソースが捕捉されて使用され、使用後に解放される。たとえば、図23の例では、リソースM1からM4までが順に捕捉されて、それぞれ、値A,A,B,Aが書き込まれている。リソースM5,6,7は未使用であるため初期値となっている。
図23の例(2)では、アプリケーションは、リソースM1からM7までを既に順番に使用し、再びリソースM1を使用しようとしている。このとき、リソースM1の1回目の使用が終了して初期化すべきところを、初期化されないままとなっていると、値Aが記憶された状態のままである。このように、リソース捕捉後にリソースの初期化を行うべきところ、初期化されないままとなっている状態をリソース初期化漏れの誤りという。かかるリソース初期化漏れの誤りが発生すると、前の処理によってリソースに書き込まれた内容がそのまま残った状態で次の処理が行われることになり、意図しない結果が生じてしまうことがある。
以下に説明する実施形態では、このように同じ処理(リソースM1の捕捉、使用、解放)が繰り返し実行されるループを含むプログラムについて、独自に設定されたリソース捕捉関数とリソース解放関数のペアを抽出する。
[実施形態に係るプログラム解析処理の流れ]
図1は、本実施の形態に係るプログラム解析処理の概要について説明するための図である。本実施の形態に係るプログラム解析装置は、ソースコードを解析して、ソースコードの中からリソース捕捉関数とリソース解放関数のペアを抽出する。具体的には、プログラム解析装置は、ソースコードの解析結果に基づき、所定の出現パタンに合致する関数のペアをリソース捕捉関数とリソース解放関数のペアとして抽出する。また、本実施形態に係るプログラム解析装置は、ソースコードに分岐やループが含まれることを前提として、ソースコード解析を実行した上で、リソース捕捉関数とリソース解放関数のペアを抽出する。
図1を参照し、実施形態に係るプログラム解析処理において、プログラム解析装置は、まず、ソースコードの入力を受ける(図1の(1))。プログラム解析装置は、入力されるソースコードを解析して、ソースコード中に含まれる関数を抽出する。そして、プログラム解析装置は、ソースコードに含まれる関数全ての集合である全関数集合Fを生成する(図1の(2))。また、プログラム解析装置は、生成した全関数集合Fから、二つの関数のペアを抽出し、全関数ペア集合F×Fを生成する(図1の(3))。
また、プログラム解析装置は、ソースコードを解析して、ソースコードに含まれる分岐やループ構造を抽出する(図1の(4))。プログラム解析装置は、分岐やループ構造を解析して、ソースコードを実行した場合に生じうる処理の流れを実行パスとして生成する。本実施の形態においては、ソースコード中に分岐やループが含まれるとき、当該分岐やループを実行した場合に処理がたどる可能性がある複数の実行パスの中から一つの実行パスが非決定的に実行されるものとみなす。以下、ソースコードを実行した場合に処理がたどる可能性がある複数の実行パスを非決定的実行パスと呼ぶ(図1の(5))。
プログラム解析装置は、(3)で生成した全関数ペア集合F×Fから1つの関数ペア(f,g)を抽出する。そして、プログラム解析装置は、非決定的実行パス中の関数ペア(f,g)の出現パタンがリソース捕捉関数とリソース解放関数について予測されるパタンに合致するか否かを判定する(図1の(6))。
たとえば、リソース捕捉関数とリソース解放関数が使われる一般的なパタンとしては、リソース捕捉関数が呼び出されて、その結果がリソース格納変数に代入され、リソース格納変数を介してリソースが使われた後で、リソース解放関数が呼び出されるパタンがある。この場合、リソース捕捉関数が呼び出された後にリソース格納変数が参照される。リソース解放関数より後にリソース格納変数が参照されることはない。また、リソース捕捉関数が呼び出された後にリソース解放関数が呼び出されるが、リソース解放関数が2回以上呼び出されることはない。
ここで、関数ペア(f,g)が、リソース捕捉関数とリソース解放関数であると仮定する。すると、ソースコード中には、まずリソースを捕捉するために関数fの戻り値をリソース格納変数rに代入するコードが出現すると考えられる。次に、捕捉したリソースを使用するコードが出現し、最後に、関数gによってリソースを解放すると考えられる。すなわち、ソースコード中には、以下のようなコードが(1)〜(3)の順に出現すると予想される。
(1)r=f()
(2)func(r)
(3)g(r)
つまり、関数ペア(f,g)がリソース捕捉関数とリソース解放関数のペアであれば、(1)のように関数fが出現すれば、その後常に(2)(3)が出現すると考えられる。なお以下、説明の便宜上、適宜(1)に対応するコードを「ALLOC」(略して「A」)、(2)に対応するコードを「USE」(略して「U」)、(3)に対応するコードを「FREE」(略して「F」)と呼ぶ。なお、以下の説明中、(2)のfunc(r)はsome_func(r)とも表記する。
プログラム解析装置は、上の前提に基づき、生成した非決定的実行パス中に関数ペア(f,g)が、上記のパタンで出現するか否かを判定する。そして、プログラム解析装置は、関数ペア(f,g)が上記のパタンで出現する非決定的実行パスが存在する場合、関数ペア(f,g)をリソース捕捉関数とリソース解放関数のペアとして抽出する(図1の(7))。他方、いずれの非決定的実行パスにおいても関数ペア(f,g)が上記のパタンで出現しない場合、プログラム解析装置は、関数ペア(f,g)をリソース捕捉関数とリソース解放関数のペアとして抽出しない(図1の(8))。
プログラム解析装置は、全関数ペア集合F×Fに含まれるすべての関数ペアについて処理を繰り返すことで、ソースコードに含まれる関数ペアのうち、リソース捕捉関数とリソース解放関数のペアである可能性が高い関数ペアを抽出することができる。その後は、プログラム解析装置は、抽出した関数ペアを用いて任意の静的コード解析の手法を適用しソースコードをさらに解析することができる(図1の(9))。
なお、ソースコード中に関数fが呼び出される場合、戻り値が格納される変数は一つであるとは限らない。図2は、ソースコード中、関数fが複数回呼び出される場合の関数ペアの抽出手法について説明するための図である。図2の例では、ソースコード中、関数fは3回呼び出されている。そして、1回目に呼び出されたときには、関数fの戻り値は変数rに代入されている。また、2回目に呼び出されたときには、関数fの戻り値は変数r’に代入されている。また、3回目に呼び出されたときには、関数fの戻り値は変数r”に代入されている。この場合には、関数(f,g)がリソース捕捉関数とリソース解放関数のペアであるか否かを判断するにあたり、プログラム解析装置はまず、変数rに対応する処理について非決定的実行パスを生成する(図2の(1))。そして、プログラム解析装置は、生成した非決定的実行パスのうち、上記パタン「A−U−F」に対応する実行パスがあるか否かを判定する。図2の例では、プログラム解析装置は、パタン「A−U−F」に対応する実行パスあり(「条件に合致」)と判定する(図2の(2))。次に、プログラム解析装置は、変数r’に対応する処理について非決定的実行パスを生成する(図2の(3))。そして、プログラム解析装置は、生成した非決定的実行パスのうち、上記パタン「A−U−F」に対応する実行パスがあるか否かを判定する。図2の例では、プログラム解析装置は、パタン「A−U−F」に対応する実行パスあり(「条件に合致」)と判定する(図2の(4))。最後に、プログラム解析装置は変数r”に対応する処理について非決定的実行パスを生成する(図2の(5))。そして、プログラム解析装置は、生成した非決定的実行パスのうち、上記パタン「A−U−F」に対応する実行パスがあるか否かを判定する。図2の例では、プログラム解析装置は、パタン「A−U−F」に対応する実行パスあり(「条件に合致」)と判定する(図2の(6))。そして、プログラム解析装置は、すべての変数に対応する非決定的実行パスの中に少なくとも一つ、パタン「A−U−F」に合致する実行パスが存在する場合、関数ペア(f,g)はリソース捕捉関数とリソース解放関数のペアであると判定する(図2の(7))。このように複数の変数に対応する関数ペア(f,g)の出現パタンに基づいてリソース捕捉関数とリソース解放関数のペアであるか否かを判定することで、判定精度をさらに向上させることができる。
[プログラム解析装置の構成の一例]
図3は、本実施の形態に係るプログラム解析装置1の構成の一例を示すブロック図である。
図3に示すプログラム解析装置1は、入力部10と、制御部20と、記憶部30と、出力部40と、を備える。
入力部10は、情報の入力を受け付ける処理部である。たとえば、入力部10は、プログラム解析装置1の解析対象となるソースコードの入力を受け付ける。後述する例においては、C言語のソースコードを説明する。ただし、本実施の形態のプログラム解析方法は、C言語のみに限らず他のプログラミング言語にも適用できる。
制御部20は、プログラム解析装置1を制御する。制御部20はたとえば、CPU(Central Processing Unit)、MPU(Micro Processing Unit)や、ASIC(Application Specific Integrated Circuit)等で構成することができる。制御部20は、解析部21、生成部22、および抽出部23を備える。
解析部21は、入力部10が入力を受付けたソースコードを解析する。具体的には、解析部21は、ソースコード中でサブルーチン呼出し(関数呼出し)している箇所に、そのサブルーチン(関数)の定義コードを書き足してサブルーチン展開コードを作成し、サブルーチン展開コードの各行について、関数呼出しをしているか、関数の返却値を格納する変数はなにか、関数の引数はなにか、分岐しているか、分岐後の合流地点はどこか、利用されている変数はなにか、などの情報を解析する。解析部21による処理は、特願2015−156945号に記載の処理と同様である。
解析部21はまた、ソースコードに含まれる関数を抽出して全関数集合Fおよび全関数ペア集合F×Fを作成する。
生成部22は、解析部21の解析結果を基に実行パスを生成する。実行パスは、ソースコードの処理の流れを表す。生成部22は、解析結果に基づき、ソースコード中の分岐やループを展開して、可能性がある複数の実行パス(非決定的実行パス)を生成する。たとえば、図1の(4)の例には、ループ構造と分岐を含む処理の流れが示されている。生成部22はたとえば、図1の(4)の場合、ループ内を1回実行する以下のような非決定的実行パスを生成する。
(1)1−2−3−4−11
(2)1−2−5−6−11
(3)1−2−7−8−11
(4)1−2−9−10−11
生成部22はさらに、非決定的実行パスの処理のうち、上記「ALLOC」、「USE」、「FREE」のいずれかに合致する処理のみを抽出したラベルパスを生成する。たとえば、上の例で、「2」が「ALLOC」に合致し、「7」と「10」が「USE」に合致し、「8」が「FREE」に合致したとする。この場合、生成部22は、上の非決定的実行パスから以下のようなラベルパスを生成する。
(1)A
(2)A
(3)A−U−F
(4)A−U
生成部22はさらに、ラベルパスのうち、リソース捕捉関数とリソース解放関数のペアの判定に影響しないパタンを捨象して、縮約実行パスを生成する。縮約実行パスの生成手法については、後で詳述する。さらに、生成部22は、生成した縮約実行パスに同じパスが複数含まれている場合、重複がなくなるよう調整する。
生成部22は、ループ内を複数回実行する場合についても同様の処理を繰り返し、ループ内をn回実行した場合に生成される縮約実行パスと、ループ内をn+1回実行した場合に生成される縮約実行パスとが同一となった時点で実行パス生成処理を終了する。
生成部22による非決定実行パス、ラベルパスおよび縮約実行パスの生成処理(実行パス生成処理)についてはさらに詳しく後述する。なお、本明細書で「実行パス」とは、ソースコードが含む各処理について可能性がある実行順序を示す情報である。また、「実行パス」は、「非決定的実行パス」、「ラベルパス」、「縮約実行パス」を含む概念であるとする。「非決定的実行パス」は、各処理について可能性がある実行順序を全ての処理について表示し、実際のソースコードの実行時には非決定的実行パスのうち1のパスが実行される。「ラベルパス」は、「非決定的実行パス」に含まれる各処理のうち、「A」「U」「F」に対応づけられる処理のみを表示する。同じ非決定的実行パスに基づいてラベルパスを生成する場合でも、「A」「U」「F」に対応づけられる関数ペアによって異なるラベルパスが生成される。「縮約実行パス」は、「ラベルパス」のうち、リソース捕捉関数とリソース解放関数の判定上、捨象可能な「A」「U」「F」の並び部分を削除したものである。
抽出部23は、生成部22が生成した関数ペア(f,g)および変数rについての実行パスが、関数ペア(f,g)および変数rについてパタン「A−U−F」を含むか否かを判定する。抽出部23はまた、同じ関数ペア(f,g)と他の変数r1についての実行パスが、関数ペア(f,g)および変数r1についてパタン「A−U−F」を含むか否かを判定する。抽出部23は、呼び出された関数fの戻り値が格納されている変数が複数ある場合は、全ての変数に対応する実行パスについて同様の判定を行う。そして、抽出部23は、関数fの戻り値を格納する全ての変数について「A−U−F」を含む実行パスが一以上あれば、関数ペア(f,g)をリソース捕捉関数とリソース解放関数のペアとして抽出する。抽出部23による抽出処理についても後でさらに詳述する。
記憶部30は、プログラム解析装置1における各部の処理に使用する情報や、各部の処理によって生成される情報を記憶する。記憶部30はたとえば、ハードディスク、光ディスク等の記憶装置でもよい。また、記憶部30は、RAM(Random Access Memory)やフラッシュメモリ等の半導体メモリであってもよい。
記憶部30は、ソースコード記憶部31と、サブルーチン展開コード記憶部32と、関数記憶部33と、実行パス記憶部34と、関数ペア集合記憶部35と、を備える。
ソースコード記憶部31は、入力部10が入力を受付けたソースコードを記憶する。サブルーチン展開コード記憶部32は、解析部21がソースコードから作成したサブルーチン展開コードを記憶する。関数記憶部33は、解析部21がサブルーチン展開コードから抽出した全関数集合Fおよび全関数ペア集合F×Fを記憶する。実行パス記憶部34は、生成部22が生成した実行パスを記憶する。関数ペア集合記憶部35は、抽出部23による処理の結果得られる関数ペア集合すなわちリソース捕捉関数とリソース解放関数のペアと判定された関数ペアを記憶する。
なお、記憶部30の各部に記憶されるソースコード、サブルーチン展開コード、関数、実行パス、関数ペア集合の詳細については後述する。ただし、記憶部30の各部に記憶されるソースコードおよびサブルーチン展開コードは、特願2015−156945号に記載のソースコードおよびサブルーチン展開コードと同様である。また、記憶部30は、特願2015−156945号に記載の制御フローグラフや解析結果も記憶するように構成してもよい。
出力部40は、プログラム解析装置1による処理の結果、取得される情報を出力する。出力部40はたとえば、抽出部23が抽出する関数ペアを、視認可能な形式で出力する。出力部40は、モニタ等の表示部またはプリンタ等と接続され表示部またはプリンタ等に情報を出力するように構成してもよく、出力部40が表示部またはプリンタ等を備えるように構成してもよい。
[プログラム解析処理の流れの一例]
次に、本実施の形態におけるプログラム解析装置1の動作について説明する。
図4は、本実施の形態におけるプログラム解析処理の流れの一例を示すフローチャートである。
入力部10は、解析対象のソースコードの入力を受け付ける(ステップS1)。
解析部21は、ソースコードを解析する(ソースコード解析処理、ステップS2)。ソースコードの解析処理については後述する。
生成部22は、ソースコードの解析結果を基に、実行パスを生成する(実行パス生成処理、ステップS3)。実行パス生成処理の詳細については後述する。
そして、抽出部23は、生成部22による処理結果に基づき、リソース捕捉関数とリソース解放関数の出現パタンに合致する関数ペアを抽出する(関数ペア抽出処理、ステップS4)。関数ペア抽出処理の詳細については後述する。
出力部40は、抽出部23が抽出した結果(関数ペア)を出力する(ステップS5)。
これでプログラム解析装置1によるプログラム解析処理が終了する。
[ソースコード解析処理の流れの一例]
次に、ソースコード解析処理(図4のステップS2に対応)について説明する。なお、以下に説明する本実施の形態におけるソースコード解析処理は、特願2015−156945号に記載の解析処理と同様である。ただし、本実施の形態では、解析部21は関数一覧(全関数集合Fと同様)に代えて、全関数集合Fおよび全関数ペア集合F×Fを作成する点が異なる。
図5は、ソースコード解析処理の流れの一例を示すフローチャートである。図6は、プログラム解析装置1の解析対象であるソースコードの一例を示す図である。以下では、図6に示すソースコードを入力した具体例とともにソースコードの解析処理を説明する。
解析部21は、入力部10が入力したソースコードからサブルーチン展開コードを作成する(ステップS21)。作成されたサブルーチン展開コードは、サブルーチン展開コード記憶部32に記憶される。図7に、図6のソースコードから作成したサブルーチン展開コードの例を示す。図7の例では、解析部21は、main関数から呼び出されているfinish関数とabort_program関数のソースコードを呼び出した箇所の下に展開して追記している。解析部21は、さらにfinish関数から呼び出されているabort_program関数も展開して追記している。具体的には、符号101A,101Bで示す箇所にabort_program関数を展開し、符号102で示す箇所にfinish関数を展開した。符号101Bで示す箇所に展開したabort_program関数はfinish関数から呼び出されたものである。
サブルーチン展開コードでは、関数を展開した箇所の行番号として、呼出し元の行番号に元々のソースコードの行番号を付与した行番号(以下、「コールスタック付き行番号」と称する。)を付与する。例えば、符号101Aで示した箇所のabort_program関数は、main関数の9行目で呼び出されており、abort_program関数は、図6のソースコードの25−27行目に記述されているので、9行目に展開したabort_program関数の各行に行番号9−25,9−26,9−27を付与する。別の例では、符号102で示した箇所のfinish関数はmain関数の13行目で呼び出されており、符号101Bで示した箇所のabort_program関数はfinish関数の24行目で呼び出されているので、符号101Bで示した箇所のabort_program関数の各行に行番号13−24−25,13−24−26,13−24−27を付与する。なお、サブルーチン(関数)の定義が得られない場合は定義コードは書き足さない。
続いて、解析部21は、サブルーチン展開コードから関数を抽出して全関数集合Fを作成する(ステップS22)。作成した全関数集合Fは、関数記憶部33に記憶される。図8の(A)に、図7のサブルーチン展開コードから抽出した全関数集合Fを示す。解析部21は、抽出した関数に関数ID(Identifier)を付与する。図8は、図7のサブルーチン展開コードから抽出した関数の、全関数集合と全関数ペア集合とを示す図である。図8の(A)の例に示すように、関数記憶部33は、関数IDに対応付けて各関数名を記憶する。
解析部21はまた、作成した全関数集合Fに基づき、全関数ペア集合F×Fを作成する。図8の(B)に、全関数集合Fから作成された全関数ペア集合F×Fの例を示す。図8の(B)に示すように、関数記憶部33は、各関数ペアに対して付与したペアIDに対応付けて、当該関数ペアに含まれる関数の関数IDを記憶する。
[実行パス生成処理の一例]
次に、生成部22による実行パス生成処理(図4のステップS3に対応)について説明する。
ソースコード中にループが含まれている場合、可能性がある実行パスを作成していくと無限に実行パスが作成される、という問題がある。この問題について、図9を参照して説明する。図9は、ソースコードに含まれる分岐やループの構造を簡略化して示す図である。
[非決定的実行パスの生成]
図9に示すような分岐とループ構造を含むソースコードから非決定的実行パスを作成する場合を考える。図9の例を、ループ内を1回実行すると仮定して展開すると、以下の非決定的実行パスが得られる。
(1)1−2−3−4−11
(2)1−2−5−6−11
(3)1−2−7−8−11
(4)1−2−9−10−11
さらにループ内を2回実行すると仮定して展開すると、たとえば以下の非決定的実行パスが得られる。
(5)1−2−3−4−2−3−4−11
(6)1−2−3−4−2−5−6−11
(7)1−2−3−4−2−7−8−11
(8)1−2−3−4−2−9−10−11
ループ内を2回実行する場合、上の(5)〜(8)に加え、分岐内の処理順序によってさらに12通りの非決定的実行パスが得られる。
さらにループ内の実行回数を3回、4回と増やしていくと、ループ内の実行回数を無限に増加させることができるため、非決定的実行パスが無限に増加する。
[ラベルパスの生成]
しかし、本実施の形態に係るプログラム解析装置1では、リソース捕捉関数とリソース解放関数のペアの抽出を目的とするため、ペア抽出に関連しない情報の生成は省略することができる。たとえば、分岐とループ構造を含むソースコードから非決定的実行パスを作成した結果、図10に示す非決定的実行パスが得られたとする。図10は、実行パス生成処理を説明するための、非決定的実行パスのセットの一例を示す図である。
そして、プログラム解析装置1が、図10の非決定的実行パスのセットに基づいて、関数fと関数gが、リソース捕捉関数とリソース解放関数のペアであるか否かを判定すると仮定する。この場合、プログラム解析装置1は、非決定的実行パスが、関数f、変数r、関数gを次の順序で含むか否かを判定する。
(1)r=f()
(2)some_func(r)
(3)g(r)
とすると、非決定的実行パスに基づきリソース捕捉関数とリソース解放関数のペアを抽出するためには、非決定的実行パスに含まれる上記(1)、(2)、(3)の情報があればよい。
たとえば、図10の例では、上記(1)を「A」、(2)を「U」、(3)を「F」で表示する。1番目の非決定的実行パスは、「A」のみを含む。2番目の非決定的実行パスは、「A」「F」「F」を含む。このように、各非決定的実行パスから「A」「U」「F」の情報のみを抽出すると、図11に示すラベルパスを得ることができる。図11は、実行パス生成処理を説明するための、ラベルパスのセットの一例を示す図である。図10の一番目の非決定的実行パスは、「A」、「U」、「F」のうち、「A」しか含まないため、ラベルパスは「A」となる。また、図10の2番目の非決定的実行パスは「A,F,F」、3番目の非決定的実行パスは「A,F,F」、4番目の非決定的実行パスは、「A,U,F」、5番目の非決定的実行パスは「A,F,F,F」とあらわすことができる。リソース捕捉関数とリソース解放関数のペアの抽出に関係する情報のみを抽出することで、図11に示すように非決定的実行パスを短縮することができる。このように、リソース捕捉関数とリソース解放関数のペアであるか否かの判定対象となる関数(f,g)と関数f()の戻り値が代入される変数rを特定し、上記(1)〜(3)に該当する処理のみを非決定的実行パスから抽出して作成した実行パスを、ラベルパスと呼ぶ。
[縮約実行パスの生成]
しかし、ラベルパスを生成しただけでは、非決定的実行パスを短縮することはできるが、判定対象の実行パスが無限に増加するという問題は解消されない。そこで、生成部22は、次に、ラベルパスを所定の条件に基づき縮約すなわち短くする。本実施の形態では、以下の3つを縮約のための所定の条件、縮約ルールとする。
(1)「F」が3回以上出現する場合、2回目の「F」の出現より後のラベルパスは削除する。
(2)「A」の後に「U」が2回以上出現する場合、2回目以降の「U」は削除する。
(3)「F」の後に「U」が2回以上出現する場合、2回目以降の「U」は削除する。
まず、上記縮約ルール(1)について説明する。「F」はリソース解放関数に対応する。リソース解放は、リソースが捕捉され使用された後に1回実行すればよく、同じリソースを捕捉されていないのに何度も解放する必要はない。したがって、「A」が1回出現した後に「F」が何度も出現する場合、「F」はリソース捕捉関数ではない、と推定される。プログラム解析装置1は、実行パスが「A,U,F」のパタンに合致するか否かを判定する。たとえば、プログラム解析装置1は、「A,U,F,F」も「A,U,F,F,F」も、「A,U,F」に合致しないと判定する。したがって、プログラム解析装置1が判定対象とする情報としては、実行パス「A,U,F,F,F」は「A,U,F,F」に包含することができる。したがって、プログラム解析装置1は、ラベルパス「A,U,F,F,F」を縮約実行パス「A,U,F,F」に縮約する。このように、プログラム解析装置1は、ラベルパス中、1つの「A」の後、「F」が3回以上出現した場合、2回目の「F」より後のラベルパス(この場合は3回目の「F」)を削除する。
次に、縮約ルール(2)について説明する。「A」がリソース捕捉関数であるとすると、捕捉したリソースは「A」の後解放されるまで何度でも使用することができる。したがって、「A」の後の「U」の出現回数にはプログラム解析装置1による判定上意味はなく、少なくとも1度「U」が出現すればよい。そこで、「A」の後、2回以上「U」が出現した場合、2回目以降の「U」は削除する。たとえば、「A,U,U」というラベルパスが作成された場合、プログラム解析装置1は、当該ラベルパスを縮約して「A,U」という縮約実行ラベルを作成する。
次に、縮約ルール(3)について説明する。「F」がリソース解放関数であるとすると、Fによってリソースが解放された後、当該リソースを捕捉することなく使用する、という処理はありえない。したがって、「F」の後に「U」が出現することはない。仮に「U」が出現した場合、その回数に関わらず、「F」は「A」と対をなすリソース解放関数ではない、と推定することができる。したがって、ラベルパス中「F」の後に「U」が2回以上出現した場合、2回目以降の「U」は削除する。たとえば、ラベルパス「A,U,F,U,U」が生成された場合、プログラム解析装置1は、「F」の後の2つの「U」の一つを削除して、縮約実行パス「A,U,F,U」とする。
[重複する縮約実行パスの削除]
以上のように、実施の形態に係るプログラム解析装置1は、非決定的実行パスからラベルパス、ラベルパスから縮約実行パスを生成する。この処理により、非決定的実行パスの冗長な部分が削除されるため、異なる非決定的実行パスから同じ縮約実行パスが生成される場合が考えられる。そこで、同じ関数(f,g)、変数rについて作成された縮約実行パス中に重複がある場合は重複する縮約実行パスを削除する。
[ループの回数の制限]
次に、ループの無限展開を防止するための処理について説明する。上記のように非決定的実行パスを、リソース捕捉関数およびリソース解放関数の抽出に必要な情報に還元し、縮約した場合、所定回数ループを繰り返した後は同じ縮約実行パスしか得られなくなる。たとえば、「A,U」という縮約パスのうち、ループ部分が「U」であるとすると、何度ループを繰り返しても上記縮約ルール(2)により、2回目以降の「U」が削除されるため、「A,U」にしかならない。そこで、本実施の形態に係るプログラム解析装置1では、n回ループを繰り返して生成された縮約実行パスから重複を除去した縮約実行パスの組み合わせと、n−1回ループを繰り返して生成された縮約実行パスから重複を除去した縮約実行パスの組み合わせと、が同じになった時点で、ループの繰り返しすなわち実行パス生成処理を終了する。
[生成部22による実行パス生成処理の流れの一例]
次に、図12乃至図17を参照し、実行パス生成処理についてさらに具体的に説明する。図12乃至図17は各々、実行パス生成処理においてループを1回乃至6回実行して縮約実行パスを生成する場合について説明するための図である。
[ループ1回実行時]
まず、プログラム制御装置1は、図12の(A)に示すループ構造を有するソースコードについて非決定的実行パスを生成する。処理対象とする関数ペアは(f,g)、リソース格納変数はrである。図12の(A)において、処理「1」は関数f()を呼び出して変数に格納する処理(「A」)であり、処理「3」は捕捉したリソースrを使用する処理(「U」)であり、処理「5」は捕捉したリソースrを引数とする関数g()(「F」)である。処理「1」「3」「5」以外に、「A」「U」「F」に該当する処理はないとする。
まず、生成部22は、ループを1回実行した場合の非決定的実行パスを生成する(図12の(B))。
(1)1−2−3−4−7
(2)1−2−5−6−7
そして、生成部22は、上記非決定的実行パスをラベルパスに変換する。すなわち、生成部22は、「1」、「3」、「5」をそれぞれ、「A」、「U」、「F」に置換し、他の処理を削除して以下のラベルパスを生成する(図12の(C))。
(1)AU
(2)AF
上記ラベルパスのうち、縮約ルール(1)〜(3)に合致するものはないため、縮約実行パスは、ラベルパスと同じとなる(図12の(D))。
さらに、重複する縮約実行パスはないため、削除される縮約実行パスはない(図12の(E))。
[ループ2回実行時]
次に、生成部22は、ループを2回実行する。この場合、非決定的実行パスは以下のようになる。
(1)1−2−3−4−2−3−4−7
(2)1−2−3−4−2−5−6−7
(3)1−2−5−6−2−3−4−7
(4)1−2−5−6−2−5−6−7
実際の生成部22の処理では、ループ1回目の縮約実行パスが既に生成されているため、ループ2回目のラベルをループ1回目の縮約実行パスに追加してループ2回目のラベルパスを生成すればよい。ループ2回目のラベルパスは以下のようになる(図13の(A))。
(1)AUU
(2)AUF
(3)AFU
(4)AFF
生成されたラベルパスのうち、(1)は縮約ルール(2)に合致するため、「AU」に縮約される(図13の(B))。(1)以外には縮約ルールに合致するラベルパスはない。また、重複もないため、ループ2回の実行により生成される縮約実行パスは、以下のようになる(図13の(C))。
(1)AU
(2)AUF
(3)AFU
(4)AFF
ループ1回実行時の縮約実行パスと、ループ2回実行時の縮約実行パスとは相違する。このため、ループの繰り返しは終了せず、生成部22はループ3回実行時の実行パス生成処理に移る。
[ループ3回実行時]
次に、生成部22は、ループを3回実行した場合のラベルパスを生成する(図14の(A))。
(1)AUU
(2)AUF
(3)AUFU
(4)AUFF
(5)AFUU
(6)AFUF
(7)AFFU
(8)AFFF
上記ラベルパスのうち、「AUU」は縮約ルール(2)に合致するため、生成部22は、「AUU」を「AU」に縮約する。また、「AFUU」は縮約ルール(3)に合致するため、生成部22は、「AFUU」を「AFU」に縮約する。また、「AFFF」は縮約ルール(1)に合致するため、生成部22は、「AFFF」を「AFF」に縮約する。この結果、縮約実行パスは以下のようになる(図14の(B))。以下ラベルパスを縮約した後の縮約実行パスを矢印右側に示す。
(1)AUU→AU
(2)AUF
(3)AUFU
(4)AUFF
(5)AFUU→AFU
(6)AFUF
(7)AFFU
(8)AFFF→AFF
上記(1)〜(8)の縮約実行パスには重複はない(図14の(C))。また、ループ2回実行時の縮約実行パスとループ3回実行時の縮約実行パスとは同じではないため、プログラム解析装置1は、ループ4回実行時の実行パス生成処理に進む。
[ループ4回実行時]
次に、生成部22は、ループを4回実行した場合のラベルパスを生成する(図15の(A))。
(1)AUU (2)AUF
(3)AUFU (4)AUFF
(5)AUFUU (6)AUFUF
(7)AUFFU (8)AUFFF
(9)AFUU (10)AFUF
(11)AFUFU (12)AFUFF
(13)AFFUU (14)AFFUF
(15)AFFU (16)AFFF
このうち、「AUFFF」、「AFUFF」、「AFFUF」、「AFFF」は、「F」が3回出現し、縮約ルール(1)に合致する。また、「AUU」は縮約ルール(2)に合致する。また、「AUFUU」、「AFUU」、「AFFUU」は縮約ルール(3)に合致する。このためループ4回実行時の縮約実行パスは以下のようになる(図15の(B))。
(1)AUU→AU (2)AUF
(3)AUFU (4)AUFF
(5)AUFUU→AUFU (6)AUFUF
(7)AUFFU (8)AUFFF→AUFF
(9)AFUU→AFU (10)AFUF
(11)AFUFU (12)AFUFF→AFUF
(13)AFFUU→AFFU (14)AFFUF→AFF
(15)AFFU (16)AFFF→AFF
上記縮約実行パス中、(3)と(5)、(4)と(8)、(10)と(12)、(13)と(15)、(14)と(16)、がそれぞれ重複する。そこで、生成部22は、重複がなくなるよう、(5)、(8)、(12)、(14)、(15)の計5個を削除し、残りの11個を縮約実行パスとして残す(図15の(C))。結果として、図15の(D)の縮約実行パスのセットが得られる。
ループ3回実行時の縮約実行パスとループ4回実行時の縮約実行パスとは同じではないため、プログラム解析装置1は、ループ5回実行時の実行パス生成処理に進む。
[ループ5回実行時]
次に、生成部22は、ループを5回実行した場合のラベルパスを生成する(図16の(A))。
(1)AUU (2)AUF
(3)AUFU (4)AUFF
(5)AUFUU (6)AUFUF
(7)AUFFU (8)AUFFF
(9)AUFUFU(10)AUFUFF
(11)AUFFUU(12)AUFFUF
(13)AFUU (14)AFUF
(15)AFUFU (16)AFUFF
(17)AFUFUU(18)AFUFUF
(19)AFFUU(20)AFFUF
(21)AFFU (22)AFFF
このうち、(8)AUFFF、(10)AUFUFF、(12)AUFFUF、(16)AFUFF、(18)AFUFUF、(20)AFFUF、(22)AFFFは、縮約ルール(1)に合致する。また、(1)AUUは縮約ルール(2)に合致する。また、(5)AUFUU、(11)AUFFUU、(13)AFUU、(17)AFUFUU、(19)AFFUUは縮約ルール(3)に合致する。そこで、生成部22は、縮約ルールに合致するラベルパスをそれぞれ縮約し、以下の縮約実行パスを生成する(図16の(B))。
(1)AUU→AU (2)AUF
(3)AUFU (4)AUFF
(5)AUFUU→AUFU (6)AUFUF
(7)AUFFU (8)AUFFF→AUFF
(9)AUFUFU (10)AUFUFF→AUFUF
(11)AUFFUU→AUFFU (12)AUFFUF→AUFF
(13)AFUU→AFU (14)AFUF
(15)AFUFU (16)AFUFF→AFUF
(17)AFUFUU→AFUFU (18)AFUFUF→AFUF
(19)AFFUU→AFFU (20)AFFUF→AFF
(21)AFFU (22)AFFF→AFF
上記縮約実行パスのうち、(3)と(5)、(7)と(11)、(6)と(10)、(19)と(21)、(4)と(8)と(12)、(15)と(17)、(14)と(16)と(18)、(20)と(22)、は、それぞれ重複する。そこで、生成部22は、(3)、(8)、(10)、(11)、(12)、(16)、(17)、(18)、(20)、(21)の計10個を削除する。この結果、ループ5回実行時の縮約実行パスは以下の12個となる(図16の(C))。
(1)AU
(2)AUF
(4)AUFF
(5)AUFU
(6)AUFUF
(7)AUFFU
(9)AUFUFU
(13)AFU
(14)AFUF
(15)AFUFU
(19)AFFU
(22)AFF
ループ4回実行時の縮約実行パスとループ5回実行時の縮約実行パス(図16の(D))とは同じではないため、プログラム解析装置1は、ループ6回実行時の実行パス生成処理に進む。
[ループ6回実行時]
次に、生成部22は、ループを6回実行した場合のラベルパスを生成する(図17の(A))。
(1)AUU (2)AUF
(3)AUFUU (4)AUFUF
(5)AUFUFUU (6)AUFUFUF
(7)AFUU (8)AFUF
(9)AUFU (10)AUFF
(11)AUFFU (12)AUFFF
(13)AUFUFU (14)AUFUFF
(15)AUFFUU (16)AUFFUF
(17)AFUFU (18)AFUFF
(19)AFUFUU (20)AFUFUF
(21)AFFUU (22)AFFUF
(23)AFFU (24)AFFF
上記ラベルパスのうち、(6)AUFUFUF、(12)AUFFF、(14)AUFUFF、(16)AUFFUF、(18)AFUFF、(20)AFUFUF、(22)AFFUF、(24)AFFFは、縮約ルール(1)に合致する。また、(1)AUUは縮約ルール(2)に合致する。また、(3)AUFUU、(5)AUFUFUU、(7)AFUU、(15)AUFFUU、(19)AFUFUU、(21)AFFUUは、縮約ルール(3)に合致する。そこで、生成部22は、縮約ルールに合致するラベルパスをそれぞれ縮約し、以下の縮約実行パスを生成する(図17の(B))。
(1)AUU→AU (2)AUF
(3)AUFUU→AUFU (4)AUFUF
(5)AUFUFUU→AUFUFU (6)AUFUFUF→AUFUF
(7)AFUU→AFU (8)AFUF
(9)AUFU (10)AUFF
(11)AUFFU (12)AUFFF→AUFF
(13)AUFUFU (14)AUFUFF→AUFUF
(15)AUFFUU→AUFFU (16)AUFFUF→AUFF
(17)AFUFU (18)AFUFF→AFUF
(19)AFUFUU→AFUFU (20)AFUFUF→AFUF
(21)AFFUU→AFFU (22)AFFUF→AFF
(23)AFFU (24)AFFF→AFF
上記縮約実行パスのうち、(3)と(9)、(4)と(6)と(14)、(5)と(13)、(8)と(18)と(20)、(10)と(12)と(16)、(11)と(15)、(17)と(19)、(21)と(23)、(22)と(24)、はそれぞれ同一である。そこで生成部22は、(3)、(4)、(5)、(6)、(8)、(10)、(11)、(16)、(17)、(18)、(21)、(22)の計12個を削除する(図17の(C))。この結果、ループ6回実行時の縮約実行パスは以下の12個となる(図17の(D))。
(1)AU
(2)AUF
(7)AFU
(9)AUFU
(12)AUFF
(13)AUFUFU
(14)AUFUF
(15)AUFFU
(19)AFUFU
(20)AFUF
(23)AFFU
(24)AFF
ループ5回実行時の縮約実行パスとループ6回実行時の縮約実行パスとは同じである。このため、生成部22は、7回以上ループを繰り返すことなく、実行パス生成処理を終了する。
図18は、図12乃至図17に示す実行パス生成処理において生成される縮約実行パスを説明するための図である。図18中、縮約ルールに従い削除されるラベルには二重取消線を付し、重複により削除される縮約実行パスには網掛けを付している。
[実行パス生成処理の流れの一例]
図19は、実施の形態に係る実行パス生成処理の流れの一例を示すフローチャートである。生成部22は、まず、n=1の設定を受け付ける(ステップS1801)。ここで、nはループ内の実行回数を設定するための自然数である。次に、生成部22は、ループ内をn回実行して得られる非決定的実行パスを作成する(ステップS1802)。そして、生成部22は、関数記憶部33に記憶される全関数ペア集合F×Fの中から一つの関数ペア(f,g)を選択する(ステップS1803)。生成部22は、さらに、リソース捕捉変数であるrを選択する(ステップS1803)。生成部22は、選択した関数ペア(f,g)と変数rに基づき、非決定的実行パスの各処理要素のうち「A」「U」「F」のラベルに該当する処理要素を抽出し、ラベルパスを生成する(ステップS1804)。さらに、生成部22は、生成したラベルパスに対して縮約ルール(1)、(2)、(3)を適用し、縮約実行パスを生成する(ステップS1805)。そして、生成部22は、生成した縮約実行パスに重複がないか判定し、重複がある場合は重複する縮約実行パスを削除する(ステップS1806)。そして、生成部22は、ループをn回実行したときの縮約実行パスと、ループをn−1回実行したときの縮約実行パスとが一致するか否かを判定する(ステップS1807)。一致すると判定した場合(ステップS1807、Yes)、生成部22は、実行パス生成処理を終了する。他方、一致しないと判定した場合(ステップS1807、No)、生成部22は、n=n+1と設定し(S1808)、ループの実行回数を増やしてステップS1802からS1807を繰り返す。これにより関数ペア(f,g)および変数rについての実行パス生成処理が終了する。
関数記憶部33の全関数ペア集合F×Fに含まれるすべての関数ペアについて、実行パス生成処理が繰り返される。また、リソース格納変数rは一つに限られないため、複数のリソース格納変数rと、各関数ペアについて、実行パス生成処理が繰り返される。この結果、関数ペアと変数rとの組み合わせごとに異なる縮約実行パスセットが生成される。図20は、実施の形態に係る実行パス生成処理により生成され、実行パス記憶部34に記憶される情報の構成の一例を示す図である。
図20に示すように、実行パス記憶部34は、「関数ペア」、「変数」、「縮約実行パス」、「フラグ」を記憶する。「関数ペア」は、縮約実行パスの生成に使用した関数ペア(f,g)を示す。また、「変数」は、縮約実行パスの生成に使用した変数rを示す。また、「縮約実行パス」は、実行パス生成処理の結果生成された縮約実行パスのセットを示す。「フラグ」は、後述する関数ペア抽出処理において、所定のパタン「A−U−F」を含むと判定された縮約実行パスに付与される標識である。
[関数ペア抽出処理の流れの一例]
次に、抽出部23による関数ペア抽出処理について説明する。図21は、実施の形態に係る関数ペア抽出処理の流れの一例を示すフローチャートである。抽出部23は、生成部22による縮約実行パスの生成が完了し、生成された縮約実行パスの情報が実行パス記憶部34に記憶されると、関数ペア抽出処理を実行する。
抽出部23はまず、関数ペア(f,g)と変数rとを選択する(ステップS2001)。そして、抽出部23は、実行パス記憶部34に記憶された縮約実行パスのうち、選択した関数ペア(f,g)および変数rに対応付けて記憶されている縮約実行パスの一つを選択する(ステップS2002)。抽出部23は、選択した縮約実行パスが、リソース捕捉関数とリソース解放関数の出現パタン、すなわち「AUF」に合致するか否かを判定する(ステップS2003)。このとき、抽出部23は、「AUF」のみを含むか否かを判定する。すなわち、抽出部23は、「AUFU」や「AUFUF」「AUFF」等、「AUF」の出現パタンを含むが「AUF」以外のパタンを含む縮約実行パスは、「AUF」の出現パタンに合致しないと判定する。
そして、抽出部23は、「AUF」の出現パタンに合致すると判定した場合(ステップS2003、YES)、当該縮約実行パスに対応づけて実行パス記憶部34にフラグを格納する(ステップS2004)。そして、抽出部23は、関数ペア(f,g)と変数rに対応づけて記憶されている他の未選択の縮退実行パスがあるか否かを判定する(ステップS2005)。抽出部23は、「AUF」の出現パタンを含まないと判定した場合(ステップS2003、NO)、そのままステップS2005に進む。
抽出部23は、未選択の縮退実行パスがあると判定した場合(ステップS2005、YES)、次の未選択の縮約実行パスを選択する(ステップS2006)。そして、抽出部23は、選択した縮約実行パスについて、ステップS2003からS2005の処理を繰り返す。他方、抽出部23は、未選択の縮約実行パスはないと判定した場合(ステップS2005、NO)、他に関数ペア(f,g)に対応づけて実行パス記憶部34に記憶されているリソース格納変数rがあるか否かを判定する(ステップS2007)。他のリソース格納変数rがあると判定した場合(ステップS2007、YES)、抽出部23は、他のリソース格納変数rの一つを選択する(ステップS2008)。そして、抽出部23は、ステップS2002からS2007の処理を繰り返す。他方、他のリソース格納変数rはないと判定した場合(ステップS2007、NO)、抽出部23は、関数ペア(f,g)と各リソース格納変数rに対応付けて実行パス記憶部34に記憶される縮約実行パスのセット各々のうち、少なくとも一つの縮約実行パスにフラグが付与されているか否かを判定する(ステップS2009)。そして、抽出部23は、全てのセットに、フラグが付与された縮約実行パスが少なくとも一つ含まれると判定した場合(ステップS2009、YES)、関数ペア(f,g)を、リソース捕捉関数とリソース解放関数の候補ペアとして抽出する(ステップS2010)。抽出した関数ペアは、関数ペア集合記憶部35に記憶される。そして、抽出部23は、関数記憶部33に記憶される全関数ペア集合F×Fに未選択の次の関数ペアがあるか否かを判定する(ステップS2011)。そして、次の関数ペアがあると判定した場合(ステップS2011、YES)、抽出部23は、次の関数ペアと変数とを選択して(ステップS2012)、ステップS2002に戻る。他方、次の関数ペアがないと判定した場合(ステップS2011、NO)すなわち、全関数ペア集合F×Fに格納される全ての関数ペアについて関数ペア抽出処理を終了した場合、抽出部23は、関数ペア抽出処理を終了する。他方、ステップS2009において、いずれの縮約実行パスにもフラグが付与されていない縮約実行パスのセットがあると判定した場合(ステップS2009、NO)、抽出部23は、当該関数ペアは抽出せず、ステップS2011に進む。
[実施の形態の効果]
上記のように、本実施の形態に係るプログラム解析装置においては、ソースコード中、第1の関数(関数f)が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に対処する。プログラム解析装置は、当該ループを1回からn回(nは2以上の自然数)まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する。そして、プログラム解析装置は、生成した実行パスにおいて、第1の関数(関数f)と、第1の関数の戻り値を格納する変数(r)と、第1の関数とは異なり該第1の関数の戻り値を格納する変数を引数とする第2の関数(関数g)と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、第1の関数と第2の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する。このため、実施形態のプログラム解析装置は、ソースコード中にループが含まれる場合に、所定回数ループを繰り返して実行した場合を考慮して、リソース捕捉関数とリソース解放関数とのペアを抽出することができる。
また、本実施の形態に係るプログラム解析装置は、第1の関数の戻り値を変数に格納する第1の処理と、当該変数を引数とし、第1および第2の関数と異なる第3の関数を呼び出す第2の処理と、変数を引数とする第2の関数を呼び出す第3の処理と、の出現順序のみを示す実行パスを生成する。このため、プログラム解析装置は、リソース捕捉関数とリソース解放関数とのペアであるか否かの判定に影響を与えない要素を捨象して処理を実行することができる。このため、実施形態のプログラム解析装置は、処理効率および処理速度を向上させることができる。
また、本実施の形態に係るプログラム解析装置は、生成した実行パスに、第1および第2の関数がリソース捕捉関数とリソース解放関数であるとした場合に、リソース捕捉関数とリソース解放関数の出現パタンに合致しない箇所がある場合、合致しない箇所を一部を残して削除することにより、実行パスを短くする。このため、実施の形態に係るプログラム解析装置は、明らかにリソース捕捉関数とリソース解放関数の出現パタンに合致しないパタンを含む実行パスについて簡易に判定をすることができる。
また、本実施の形態に係るプログラム解析装置は、生成した実行パスが、
(1)第3の処理を3以上含む場合、2回目の第3の処理の出現より後の処理を削除し、
(2)第1の処理の後、第2の処理を2以上含む場合、2回目以降の第2の処理を削除し、
(3)第3の処理の後、第2の処理を2以上含む場合、2回目以降の第2の処理を削除する、
ことにより、実行パスを短くする。このため、実施の形態に係るプログラム解析装置は、明らかにリソース捕捉関数とリソース解放関数の出現パタンに合致しないパタンを含む実行パスについて簡易に判定をすることができる。
また、本実施の形態に係るプログラム解析装置は、ループをn回実行した場合に得られる実行パスと、ループを(n−1)回実行した場合に得られる実行パスと、が等しくなった場合に、実行パスの生成を終了する。このため、実施の形態に係るプログラム解析装置は、ループ内を無限に繰り返すことなく、効率的にリソース捕捉関数とリソース解放関数のペアを抽出することができる。
また、本実施の形態に係るプログラム解析装置は、ソースコード中に、第1の関数を呼び出して戻り値を変数に格納する位置が複数ある場合に、各位置から辿ることができる1以上の実行パスのうち、リソース捕捉関数とリソース解放関数の出現パタンに合致する実行パスが少なくとも一つ存在することを条件として、第1の関数と第2の関数とを抽出する。このため、プログラム解析装置は、同じ関数が異なる位置で呼び出されている場合に、いずれの位置でもリソース捕捉関数とリソース解放関数の出現パタンに合致することを確認した上で、当該関数を抽出することができる。このため、プログラム解析装置は、高い精度でリソース捕捉関数とリソース解放関数を抽出することができる。
[プログラム]
また、上記実施形態において説明したプログラム解析装置1が実行する処理をコンピュータが実行可能な言語で記述したプログラムを作成することもできる。例えば、実施形態に係るプログラム解析装置1が実行する処理をコンピュータが実行可能な言語で記述したプログラム解析プログラムを作成することもできる。この場合、コンピュータがプログラム解析プログラムを実行することにより、上記実施形態と同様の効果を得ることができる。さらに、かかるプログラム解析プログラムをコンピュータ読み取り可能な記録媒体に記録して、この記録媒体に記録されたプログラム解析プログラムをコンピュータに読み込ませて実行することにより上記実施形態と同様の処理を実現してもよい。
図22は、プログラム解析プログラムを実行するコンピュータ1000を示す図である。図22に例示するように、コンピュータ1000は、例えば、メモリ1010と、CPU1020と、ハードディスクドライブインタフェース1030と、ディスクドライブインタフェース1040と、シリアルポートインタフェース1050と、ビデオアダプタ1060と、ネットワークインタフェース1070とを有し、これらの各部はバス1080によって接続される。
メモリ1010は、図22に例示するように、ROM(Read Only Memory)1011及びRAM1012を含む。ROM1011は、例えば、BIOS(Basic Input Output System)等のブートプログラムを記憶する。ハードディスクドライブインタフェース1030は、図22に例示するように、ハードディスクドライブ1031に接続される。ディスクドライブインタフェース1040は、図22に例示するように、ディスクドライブ1041に接続される。例えば磁気ディスクや光ディスク等の着脱可能な記憶媒体が、ディスクドライブ1041に挿入される。シリアルポートインタフェース1050は、図22に例示するように、例えばマウス1051、キーボード1052に接続される。ビデオアダプタ1060は、図22に例示するように、例えばディスプレイ1061に接続される。
ここで、図22に例示するように、ハードディスクドライブ1031は、例えば、OS1091、アプリケーションプログラム1092、プログラムモジュール1093、プログラムデータ1094を記憶する。すなわち、上記のプログラム解析プログラムは、コンピュータ1000によって実行される指令が記述されたプログラムモジュールとして、例えばハードディスクドライブ1031に記憶される。
また、上記実施形態で説明した各種データは、プログラムデータとして、例えばメモリ1010やハードディスクドライブ1031に記憶される。そして、CPU1020が、メモリ1010やハードディスクドライブ1031に記憶されたプログラムモジュール1093やプログラムデータ1094を必要に応じてRAM1012に読み出し、各種処理手順を実行する。
なお、プログラム解析プログラムに係るプログラムモジュール1093やプログラムデータ1094は、ハードディスクドライブ1031に記憶される場合に限られず、例えば着脱可能な記憶媒体に記憶され、ディスクドライブ等を介してCPU1020によって読み出されてもよい。あるいは、プログラム解析プログラムに係るプログラムモジュール1093やプログラムデータ1094は、ネットワーク(LAN(Local Area Network)、WAN(Wide Area Network)等)を介して接続された他のコンピュータに記憶され、ネットワークインタフェース1070を介してCPU1020によって読み出されてもよい。
なお、本実施形態において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的に行うこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
上記の実施形態やその変形は、本願が開示する技術に含まれると同様に、特許請求の範囲に記載された発明とその均等の範囲に含まれるものである。
1 プログラム解析装置
10 入力部
20 制御部
21 解析部
22 生成部
23 抽出部
30 記憶部
31 ソースコード記憶部
32 サブルーチン展開コード記憶部
33 関数記憶部
34 実行パス記憶部
35 関数ペア集合記憶部
40 出力部

Claims (8)

  1. ソースコード中、第1の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを1回からn回(nは2以上の自然数)まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する生成部と、
    生成した前記実行パスにおいて、前記第1の関数と、前記第1の関数の戻り値を格納する変数と、前記第1の関数とは異なり該第1の関数の戻り値を格納する前記変数を引数とする第2の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、前記第1の関数と前記第2の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する抽出部と、
    を備え
    前記生成部は、前記第1の関数の戻り値を前記変数に格納する第1の処理と、当該変数を引数とし、前記第1および第2の関数と異なる第3の関数を呼び出す第2の処理と、前記変数を引数とする前記第2の関数を呼び出す第3の処理と、の出現順序のみを示す実行パスを生成することを特徴とするプログラム解析装置。
  2. 前記生成部は、生成した前記実行パスに、前記第1および第2の関数がリソース捕捉関数とリソース解放関数であるとした場合に、リソース捕捉関数とリソース解放関数の出現パタンに合致しない箇所がある場合、合致しない箇所を一部を残して削除することにより、前記実行パスを短くすることを特徴とする請求項に記載のプログラム解析装置。
  3. 前記生成部は、生成した前記実行パスが、
    (1)前記第3の処理を3以上含む場合、2回目の前記第3の処理の出現より後の処理を削除し、
    (2)前記第1の処理の後、前記第2の処理を2以上含む場合、2回目以降の前記第2の処理を削除し、
    (3)前記第3の処理の後、前記第2の処理を2以上含む場合、2回目以降の前記第2の処理を削除する、
    ことにより、前記実行パスを短くすることを特徴とする請求項に記載のプログラム解析装置。
  4. ソースコード中、第1の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを1回からn回(nは2以上の自然数)まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する生成部と、
    生成した前記実行パスにおいて、前記第1の関数と、前記第1の関数の戻り値を格納する変数と、前記第1の関数とは異なり該第1の関数の戻り値を格納する前記変数を引数とする第2の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、前記第1の関数と前記第2の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する抽出部と、
    を備え、
    前記生成部は、前記ループをn回実行した場合に得られる実行パスと、前記ループを(n−1)回実行した場合に得られる実行パスと、が等しくなった場合に、前記実行パスの生成を終了することを特徴とするプログラム解析装置。
  5. 前記抽出部は、前記ソースコード中に、前記第1の関数を呼び出して戻り値を変数に格納する位置が複数ある場合に、各位置から辿ることができる1以上の実行パスのうち、前記出現パタンに合致する実行パスが少なくとも一つ存在することを条件として、前記第1の関数と前記第2の関数とを抽出することを特徴とする請求項1からのいずれか1項に記載のプログラム解析装置。
  6. ソースコード中、第1の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを1回からn回(nは2以上の自然数)まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する生成工程と、
    生成した前記実行パスにおいて、前記第1の関数と、前記第1の関数の戻り値を格納する変数と、前記第1の関数とは異なり前記変数を引数とする第2の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、前記第1の関数と前記第2の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する抽出工程と、
    をコンピュータが実行し、
    前記生成工程は、前記第1の関数の戻り値を前記変数に格納する第1の処理と、当該変数を引数とし、前記第1および第2の関数と異なる第3の関数を呼び出す第2の処理と、前記変数を引数とする前記第2の関数を呼び出す第3の処理と、の出現順序のみを示す実行パスを生成することを特徴とするプログラム解析方法。
  7. ソースコード中、第1の関数が呼び出された位置から処理が辿る可能性のある実行パスにループが含まれる場合に、当該ループを1回からn回(nは2以上の自然数)まで繰り返して実行した場合のそれぞれについて、処理が辿る可能性のある実行パスを生成する生成工程と、
    生成した前記実行パスにおいて、前記第1の関数と、前記第1の関数の戻り値を格納する変数と、前記第1の関数とは異なり前記変数を引数とする第2の関数と、の出現パタンが、リソース捕捉関数とリソース解放関数の出現パタンに合致する場合、前記第1の関数と前記第2の関数とをリソース捕捉関数とリソース解放関数のペアとして抽出する抽出工程と、
    をコンピュータが実行し、
    前記生成工程は、前記ループをn回実行した場合に得られる実行パスと、前記ループを(n−1)回実行した場合に得られる実行パスと、が等しくなった場合に、前記実行パスの生成を終了することを特徴とするプログラム解析方法。
  8. コンピュータを請求項1〜のいずれか1項に記載のプログラム解析装置として機能させるためのプログラム解析プログラム。
JP2016161559A 2016-08-19 2016-08-19 プログラム解析装置、プログラム解析方法およびプログラム解析プログラム Active JP6574151B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2016161559A JP6574151B2 (ja) 2016-08-19 2016-08-19 プログラム解析装置、プログラム解析方法およびプログラム解析プログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016161559A JP6574151B2 (ja) 2016-08-19 2016-08-19 プログラム解析装置、プログラム解析方法およびプログラム解析プログラム

Publications (2)

Publication Number Publication Date
JP2018028879A JP2018028879A (ja) 2018-02-22
JP6574151B2 true JP6574151B2 (ja) 2019-09-11

Family

ID=61248499

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016161559A Active JP6574151B2 (ja) 2016-08-19 2016-08-19 プログラム解析装置、プログラム解析方法およびプログラム解析プログラム

Country Status (1)

Country Link
JP (1) JP6574151B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10996906B2 (en) 2018-02-21 2021-05-04 Canon Kabushiki Kaisha Image processing apparatus that is connectable with information processing apparatus providing service to image processing apparatus, control method therefor, and storage medium storing control program therefor

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS62121553A (ja) * 1985-11-22 1987-06-02 Fujitsu Ltd パス解析処理方式
JPH0926897A (ja) * 1995-05-08 1997-01-28 Toshiba Corp プログラム解析装置及びプログラム解析方法
JP3418544B2 (ja) * 1998-03-24 2003-06-23 日立ソフトウエアエンジニアリング株式会社 プログラムのテストデータ自動生成装置
JP4257096B2 (ja) * 2002-10-21 2009-04-22 株式会社日立製作所 ソースプログラムの静的解析装置
JP2006127496A (ja) * 2004-10-01 2006-05-18 Matsushita Electric Ind Co Ltd Api仕様検証装置及び方法、当該方法を実行させるプログラム、当該プログラムを格納する記憶媒体
JP5440287B2 (ja) * 2010-03-15 2014-03-12 富士通株式会社 シンボリック実行支援プログラム、方法及び装置
US9811441B2 (en) * 2011-03-23 2017-11-07 Infosys Limited Method and system for detecting memory leaks in a program
JP2013065258A (ja) * 2011-09-20 2013-04-11 Nec Corp 情報処理装置、情報処理方法及び情報処理プログラム

Also Published As

Publication number Publication date
JP2018028879A (ja) 2018-02-22

Similar Documents

Publication Publication Date Title
US8291399B2 (en) Off-line program analysis and run-time instrumentation
JPWO2006038394A1 (ja) ソースコード検査器、方法、プログラム及び記憶媒体
JP5450840B2 (ja) プログラムの実行性能評価のためのテストデータ生成方法
JP2009176246A (ja) システムの動作を検証するシステムおよび方法
JP2016115175A (ja) ソフトウェアテスト装置およびソフトウェアテストプログラム
CN109961150B (zh) 一种应对退相干的量子程序变换方法及系统
US8752007B2 (en) Automatic generation of run-time instrumenter
JP6574151B2 (ja) プログラム解析装置、プログラム解析方法およびプログラム解析プログラム
Rodatz et al. Fault Tolerance by Construction
US12282412B2 (en) Coverage-guided fuzzing via dynamic instrumentation
Amalfitano et al. Improving code coverage in android apps testing by exploiting patterns and automatic test case generation
JP5163172B2 (ja) ソフトウェアテスト項目編集支援装置およびソフトウェアテスト項目編集支援方法
JP5207314B2 (ja) テストパタン圧縮方法およびテストパタン圧縮システム
JP2019148874A (ja) プロジェクト分析装置及びプログラム
JP7211228B2 (ja) 解析装置、解析方法、及びプログラム
Akimoto et al. Test case selection technique for regression testing using differential control flow graphs
JP6301851B2 (ja) プログラム解析装置、誤り検出装置、プログラム解析方法、誤り検出方法、プログラム解析プログラム及び誤り検出プログラム
US8930759B2 (en) Stream generation
Dhatchayani et al. Test Case Generation and Reusing Test Cases for GUI Designed with HTML.
JP7244756B2 (ja) 分析プログラム、プログラム分析方法およびプログラム分析装置
JP5578625B2 (ja) プログラム分析装置、プログラム分析方法、及びプログラム
JP2011100420A (ja) テストプログラム作成装置
JP5918102B2 (ja) 解析システム、解析装置、解析方法及び解析プログラム
CN117520191B (zh) 一种基于程序路径的测试完备性检查方法、设备及存储介质
JP6437396B2 (ja) トレース情報管理システム、方法、及びプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180830

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20190530

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190611

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190726

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190815

R150 Certificate of patent or registration of utility model

Ref document number: 6574151

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

S533 Written request for registration of change of name

Free format text: JAPANESE INTERMEDIATE CODE: R313533

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350