JP6502044B2 - データ解析装置、データ解析方法、および、プログラム。 - Google Patents

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

Info

Publication number
JP6502044B2
JP6502044B2 JP2014176926A JP2014176926A JP6502044B2 JP 6502044 B2 JP6502044 B2 JP 6502044B2 JP 2014176926 A JP2014176926 A JP 2014176926A JP 2014176926 A JP2014176926 A JP 2014176926A JP 6502044 B2 JP6502044 B2 JP 6502044B2
Authority
JP
Japan
Prior art keywords
block
dfg
node
data flow
nodes
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
JP2014176926A
Other languages
English (en)
Other versions
JP2016051367A (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.)
NEC Communication Systems Ltd
Original Assignee
NEC Communication Systems Ltd
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 NEC Communication Systems Ltd filed Critical NEC Communication Systems Ltd
Priority to JP2014176926A priority Critical patent/JP6502044B2/ja
Publication of JP2016051367A publication Critical patent/JP2016051367A/ja
Application granted granted Critical
Publication of JP6502044B2 publication Critical patent/JP6502044B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Description

本発明は、プログラムのデータフローを解析するデータ解析装置、データ解析方法、および、プログラムに関する。
特許文献1は、対象変数に関する関数のコントロールフローグラフを生成し、その生成されたコントロールフローグラフに対して解析を行い、対象変数毎の解析結果に基づいてデータフローグラフを生成する装置を開示する。
特許文献2は、プログラムのソースコードを入力して、そのプログラムの変数依存関係を導出するシステムを開示する。このシステムは、ソースコードを入力して、構文木を作成し、その構文木から制御フローを導出し、最終的に、制御フローから変数依存関係を導出する。
特開2012−164024号公報 特開2013−156786号公報
特許文献1に記載された装置は、データフロー解析の入力情報として制御フローグラフを用いる。このため、この装置は、データフロー解析の前段階で、構文解析、制御フロー解析を行い、制御フローグラフを作成する。
制御フローグラフは、分岐を含まない逐次的コード列の纏まりのノードと、ノード間の制御の流れを表すリンクの情報を持つ。この装置が、このような制御フローグラフを作成すると、当該装置は、主記憶装置に各ソースファイルに対応する制御フローグラフとデータフローグラフの情報を同時に持つことになる。さらに制御フローグラフとデータフローグラフが同じサイズの情報であった場合、当該装置は、主記憶装置に同じソースファイルの情報を2重に持つこととなり主記憶装置を圧迫する。
特許文献2に記載されたシステムも、同様の課題を持つ。
本願発明は、上述の課題を解決するデータ解析装置、データ解析方法、および、プログラムを提供することを目的とする。
本発明の一実施形態のデータフロー解析装置は、ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、a)ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをDFG記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、b)前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記DFG記憶部に追加する順次関係形成手段、を備える。
本発明の一実施形態のデータフロー解析方法は、ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、a)ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをDFG記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、b)前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記DFG記憶部に追加する。
本発明の一実施形態のプログラムは、ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、a)ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをDFG記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、b)前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記DFG記憶部に追加する処理をコンピュータに実行させる。
本発明にかかるデータ解析装置は、効率の良いデータフローグラフ作成ができる。
図1は、第1の実施形態のデータフロー解析装置10の全体構成を示す図である。 図2は、ブロック対応作業域30のデータ構造を示す図である。 図3は、順次関係形成部21の動作フローチャート(その1)である。 図4は、順次関係形成部21の動作フローチャート(その2)である。 図5は、順次関係形成部21の動作フローチャート(その3)である。 図6は、順次関係形成部21の動作フローチャート(その4)である。 図7は、if文がthen節を含むサンプルソースコード(その1)である。 図8は、上位ブロック(関数:func1)のブロック対応作業域30を示す図である。 図9は、下位ブロック(if文のthen節)のブロック対応作業域30を示す図である。 図10は、下位ブロック(if文のthen節)のブロック対応作業域30に登録しているDFGノードを、上位ブロック(関数:func1)のブロック対応作業域30に登録した状況を示す図である。 図11は、上位ブロック(関数:func1)のブロック対応作業域30に、上位ブロック(関数:func1)内のDFGノードを登録した状況を示す図である。 図12は、サンプルソースコード(その1)のデータフローグラフを示す図である。 図13は、if文がthen節とelse節を含むサンプルソースコード(その2)である。 図14は、上位ブロック(関数:func2)のブロック対応作業域30を示す図である。 図15は、下位ブロック(if文のthen節)のブロック対応作業域30を示す図である。 図16は、下位ブロック(if文のthen節)のブロック対応作業域30のDFGノードを登録した後の上位ブロック(関数:func2)のブロック対応作業域30を示す図である。 図17は、下位ブロック(if文のelse節)のブロック対応作業域30を示す図である。 図18は、下位ブロック(if文のelse節)のブロック対応作業域30のDFGノードを登録した後の上位ブロック(関数:func2)のブロック対応作業域30を示す図である。 図19は、上位ブロック内(関数:func2)のDFGノードを登録した後の上位ブロック(関数:func2)のブロック対応作業域30を示す図である。 図20は、サンプルソースコード(その2)のデータフローグラフを示す図である。 図21は、ネストが多段であるif文のサンプルソースコード(その3)である。 図22は、下位ブロックのさらに下位ブロックのブロック対応作業域30を示す図である。 図23は、下位ブロック(if文のthen節)のブロック対応作業域30を示す図である。 図24は、最下位ブロックのブロック対応作業域30に登録しているDFGノードを登録した後の、下位ブロックの(if文のthen節)のブロック対応作業域30を示す図である。 図25は、上位ブロック(関数:func3)のブロック対応作業域30を示す図である。 図26は、下位ブロック(if文のthen節)のブロック対応作業域30に登録しているDFGノードを登録した後の、上位ブロック(関数:func3)のブロック対応作業域30を示す図である。 図27は、上位ブロック(関数:func3)のDFGノードを登録した後の、上位ブロック(関数:func3)のブロック対応作業域30を示す図である。 図28は、サンプルソースコード(その3)のデータフローグラフを示す図である。 図29は、while文のサンプルソースコード(その4)である。 図30は、上位ブロック(関数:func4)のブロック対応作業域30を示す図である。 図31は、下位ブロック(while文)のブロック対応作業域30を示す図である。 図32は、下位ブロック(while文)のブロック対応作業域30に登録している最終DFGノードを登録した後の、上位ブロック(関数:func4)のブロック対応作業域30を示す図である。 図33は、下位ブロックの(while文)のブロック対応作業域30の先頭DFGノードを登録した後の、上位ブロック(関数:func4)のブロック対応作業域30を表した図である。 図34は、上位ブロックのDFGノードを登録した後の、上位ブロック(関数:func4)のブロック対応作業域30を示す図である。 図35は、サンプルソースコード(その4)のデータフローグラフを示す図である。 図36は、第2の実施形態のデータフロー解析装置10の全体構成を示す図である。 図37は、抽象構文木の例(その1)を示す図である。 図38は、抽象構文木の例(その2)を示す図である。
<第1の実施の形態>
本実施の形態のデータフロー解析装置10は、ソースコードを構文解析して作成した抽象構文木(以降、AST:Abstract Syntax Tree )を入力情報とする。データフロー解析装置10は、データフロー解析過程で、制御フローグラフを生成せずにデータフローグラフ(以降、DFG:Data Flow Graph)を作成する。このデータフロー解析装置10は、制御構文に対してのみ制御フロー解析を行い、制御構文の処理の流れに沿った変数のデータフローグラフを作成する。
ここで、以降で用いる用語について説明する。
本実施の形態のデータフロー解析装置10は、一ファイルのソースコードに対応するASTを解析してDFGを作成する。ASTは木構造のデータ構造であり、分岐点や葉に演算子と非演算子(変数や定数、ブロック文)の情報を持つ。ASTの分岐点や葉がASTノードである。ブロック文は、複数の文の纏まりである。
ASTノードは、0個以上の子ASTノードを持つ。子ASTノードを持つASTノードは、子ノードから見れば親ノードである。あるASTノードの親ASTノードの先の親ASTノードは先祖ASTノードである。あるASTノードの子ASTノードの先の子ASTノードは子孫ASTノードである。
ブロック文は、ブロック文の内部に0個以上のブロック文を持つ。下位ブロックは、あるブロック文の内部にあるブロック文である。また、下位ブロックから見た、当該下位ブロックを含むブロックは上位ブロックである。
制御構文は、例えば、if文、繰り返し処理制御文である。繰り返し処理制御文は、処理のループを制御する文であり、例えば、C言語における、while文、for文、dowhile文である。
図37及び図38は、(a)ソースコードの一部分と(b)その部分に対応するASTの例を示す。両図の(b)が示すように、ASTは、制御構文に対応して、制御構文を表す最上位ノードと、その直下の制御構文内のブロックを表すノードを有する。ここで、ブロックは、図において{…}で表されている。ASTは、ブロックを表すノードの配下に、ブロック内の各命令文に対応した演算子及び変数、定数をノードとしたサブツリーを有する。なお、プログラムにおいて、ブロックは制御構文、下位ブロックを包含することが有り、この場合ASTは、ブロックを表すノード配下に、制御構文、更に下位ブロックに対応するサブツリーを包含する。
データフロー解析装置10が作成するDFGは、変数毎のデータフローの集まりである。DFGは変数の宣言毎に作成され、ノードとリンクを含むグラフ構造のデータである。データフローにおいて、変数の「宣言」、「参照」、「代入」はそれぞれノード(以降、データフローのノードをDFGノードと呼ぶ)で表され、順次関係、代入関係はDFGノード間のリンクで表現される。
DFGノードは、情報として「DFGノード識別子」、「変数名」、「DFGノードの種別(宣言、参照、代入の区別)」、「変数の行桁情報」、「変数が所属する関数定義名」、「変数が所属するファイルパス」を持つ。
順次関係は、ソースコード上の処理の流れに沿った同じ変数名の変数における出現順序を表す。例えば、ソースコード上に「int a;」 と変数:aが宣言され、その宣言された変数の次行に「int b = a;」と変数:bが変数:aを参照する場合、宣言のDFGノード:aから、参照のDFGノード:aにかけて順次関係が形成される。
代入関係は、ソースコード上の変数を、値や変数で置き換える場合の流れを表す。例えば、ソースコード上に「b = a;」という代入式が有る場合、参照のDFGノード:aから代入のDFGノード:bにかけて代入関係が形成される。
順次関係や代入関係が形成されると、データフロー解析装置10は、作成しているDFGにDFGノード間の順次関係のリンクや、代入関係のリンクを登録する。
DFGノード間のリンクは、順次関係、代入関係というリンク種別と、依存元のDFGノード、依存先のDFGノードの情報を持つ。例えば、ソースコード上に「int a;」 と変数:aが宣言され、次行で「a++;」と変数:aが参照される場合、宣言のDFGノード:aから参照のDFGノード:aにかけて順次関係が形成される。この場合、宣言のDFGノード:aが依存元のDFGノード、参照のDFGノード:aが依存先のDFGノードである。
順次関係や代入関係を結ぶ、あるいは、順次関係や代入関係を形成するということは、順次関係や代入関係のリンクを作成中のDFGに登録することを意味する。
<構成>
次に、本実施形態のデータフロー解析装置10の構成を説明する。
図1は、本実施形態のデータフロー解析装置10の全体構成を示す図である。データフロー解析装置10は、抽象構文木抽出部20、順次関係形成部21、依存元ノード候補保持部22、および、DFG記憶部23を備える。
抽象構文木抽出部20は、プログラムファイルのソースコードを読み込んで、構文解析を行い、ASTを出力する。抽象構文木抽出部20は、よく知られた方法で構文解析を行えばよい。
順次関係形成部21は、ASTを入力情報として、制御構文の処理の流れに沿ってDFGのノードを作成し、ノード間の順次関係を結ぶ。順次関係形成部21は、DFG記憶部23にDFGを作成していく。DFG記憶部23は、ノードの情報と、ノード間のリンク情報との両者を記憶する。
依存元ノード候補保持部22は、DFGノード間で順次関係を結ぶために、順次関係の依存元DFGノードの情報を一時的に保持する。順次関係形成部21は、或るブロック内のデータフロー解析を行っている間、当該ブロック対応に一時的な記憶域であるブロック対応作業域30を作成する。依存元ノード候補保持部22は、ブロック対応作業域30を格納する。
順次関係形成部21は、ブロック内のデータフロー解析の開始時にブロック対応作業域30を作成し、ブロックの解析が終了すると当該ブロックのブロック対応作業域30を削除する。ブロックがネストしている場合、順次関係形成部21は、ネストしている各レベルのブロック対応にブロック対応作業域30を作成する。
図2は、ブロック対応作業域30のデータ構造を示す図である。ブロック対応作業域30は、依存元DFGノード候補一覧表、下位ブロックの先頭DFGノード一覧表、下位ブロックの最終DFGノード一覧表を包含する。
依存元DFGノード候補一覧表、下位ブロックの先頭DFGノード一覧表、下位ブロックの最終DFGノード一覧表は、変数名をキーとし、DFGノードを値とした連想コンテナである。
依存元DFGノード候補一覧表は、そのブロック対応作業域30に対応するブロック内の変数参照を表すDFGノード情報を変数名ごとに記憶する。具体的に、依存元DFGノード候補一覧表は、各変数の先頭DFGノードと最終DFGノードの情報を記憶する。ここで、先頭DFGノードは、その変数に関してブロックで最初に登録したDFGノードである。最終DFGノードは、その変数に関してブロックで最後に登録したDFGノードである。
下位ブロックの先頭DFGノード一覧表は、ブロック対応作業域30に対応するブロックの下位ブロック内の変数参照を表すDFGノードのうち先頭DFGノードの情報を変数名ごとに記憶する。下位ブロックの最終DFGノード一覧表は、ブロック対応作業域30に対応するブロックの下位ブロック内の変数参照を表すDFGノードのうち最終DFGノードの情報を変数名ごとに記憶する。
なお、抽象構文木抽出部20、および、順次関係形成部21は、論理回路で構成される。抽象構文木抽出部20、または、順次関係形成部21は、コンピュータであるデータフロー解析装置10の図示されないメモリに格納され、図示されないプロセッサによって実行されるプログラムによって実現されても良い。
依存元ノード候補保持部22、および、DFG記憶部23は、IC(Integrated Circuit)メモリ、ディスク装置等の記憶装置である。
<動作>
次に、本実施形態のデータフロー解析装置10の動作を説明する。
図3乃至図6は、順次関係形成部21の動作フローチャートである。順次関係形成部21は、抽象構文木抽出部20からASTを入力として受け取ると、データフロー解析を開始する。
まず、図3が示すように、順次関係形成部21は、受け取ったASTからASTノードを一つ取り出す(A4-2)。ブロック文を表すASTノードを検出した場合(A4−3でYes)、順次関係形成部21は、当該ブロック対応のブロック対応作業域30を作成し(A4−4)、ブロック間のDFGノードの順次関係を制御構文に基づいて形成する(A4-5)。このステップで、順次関係形成部21は、取得したブロック文を表すASTノードの親ASTノード、先祖ASTノードと調べていき、制御構文を表すものであるASTノードを検出した場合に、制御構文の処理に沿った順次関係をDFGノード間で結ぶ。図5及び図6はこの処理の詳細を示す。
その後、順次関係形成部21は、当該ブロック対応のブロック対応作業域30を削除し(A4-6)、次のASTノードの処理(A4−2)に移行する(A4-12でNo)。すべてのASTノードの処理が終了した場合(A4-12でYes)、DFGがDFG記憶部23の中で完成している。
順次関係形成部21は、DFGの読み出し要求を受けた際にDFG記憶部23からDFGを読み出して、外部に出力する(A4−13)。順次関係形成部21は、例えば、DFGをネットワーク経由で送信する、あるいは、順次関係形成部21に接続されている、図示されないディスプレイ装置に表示する。
取り出したASTノードが、ブロック文を表すASTノードでない場合(A4−3でNo)、順次関係形成部21は、図4の処理に移行する。
図4において、順次関係形成部21は、当該ASTノードが変数を表すかどうかを調べ、変数であれば(A4-7でYes)、当該変数参照に対するDFGノードをDFG記憶部23に作成する(A4-8)。
次いで、順次関係形成部21は、作成したDFGノードと、ブロック対応作業域30の下位ブロックの先頭DFGノード一覧表に登録されている別ブロックのDFGノードとの間で順次関係を形成する(A4-9)。さらに、順次関係形成部21は、作成したDFGノードと、ブロック対応作業域30の依存元DFGノード候補一覧表に登録されている同じブロック内のDFGノードと、の間で順次関係を形成する(A4-10)。最後に、順次関係形成部21は、作成したDFGノードを、ブロック対応作業域30の依存元DFGノード候補一覧表に登録して(A4-11)、当該ASTノードの処理を終了し、図3のA4-12に移行する。
順次関係形成部21は、当該ASTノードが変数でなければ(A4-7でNo)、当該ASTノードについては何もせず、図3のA4-12に移行する。
次に、図5を用いて、ブロック間のDFGノードの順次関係を形成する動作について説明する。
順次関係形成部21は、ブロックを表すASTノードから子ASTノードを取得し(A5-1)、取得した子ASTノード以下のサブツリーを対象に図3と図4の処理を実行し、子ASTノード内を探索する(A5-2)。これは、順次関係形成部21が、子ASTノード以下のサブツリーを入力して、自身をリカーシブに起動することを意味する。
リカーシブに起動されたとき、順次関係形成部21は、子ASTノード内の変数を表すASTノードからDFGノードを作成し、ブロック対応作業域30にDFGノードを登録する。ブロック対応作業域30に登録したDFGノードは、後述する図6のフローの処理で用いる。図6は、ブロック間に跨ったDFGノード間の順次関係を形成する処理のフローチャートである。
子ASTノード内の探索が完了したら、順次関係形成部21は、ブロックを表すASTノードから親ASTノードを取り出す(A5-3)。取り出した親ASTノードが制御構文を表すASTノードである場合(A5-4でYes)、順次関係形成部21は、図6の処理を行う(A5-5)。
取り出した親ASTノードが制御構文を表すASTノードでない場合(A5-4でNo)、順次関係形成部21は図5のフロー処理を終了する。
図6において、順次関係形成部21は、上位ブロック内のDFGノードと下位ブロック内のDFGノード間の順次関係を結ぶ(A6−2)。この時、順次関係形成部21は、ブロック対応作業域30の依存元DFGノード候補一覧表、下位ブロックの最終DFGノード一覧表、下位ブロックの先頭DFGノード一覧表を用いる。
この動作において、順次関係形成部21は、まず依存元ノード候補保持部22から上位ブロックの「依存元DFGノード候補一覧表」から変数毎の最終DFGノードを取得する。次に順次関係形成部21は、下位ブロックの「依存元DFGノード候補一覧表」から下位ブロックの変数毎の先頭DFGノードを取得する。同部は更に、下位ブロックの「下位ブロックの先頭DFGノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の先頭DFGノードを取得する。次に、順次関係形成部21は、取得した最終DFGノードから下位ブロックの先頭DFGノードと、最終DFGノードから下位ブロックのさらに下位ブロックの先頭DFGノードにかけて同じ変数名のDFGノード間で順次関係を結ぶ。
次に、順次関係形成部21は、ブロックを表すASTノードの親ASTノードを調べ、制御構文で無い場合は、さらに親ASTノード(先祖ASTノード)を調べていく(A6−3)。調べた結果、親ASTノード または 先祖ASTノードがif文を表すASTノードであった場合は(A6-4でif文)、順次関係形成部21はA6−5の処理に移る。親ASTノード または 先祖ASTノードがfor文 またはwhile文または dowhile文を表すASTノードであった場合は(A6−4で繰り返し処理制御文)、順次関係形成部21は、A6−10の処理に移る。
A6−5において、順次関係形成部21は、下位ブロック(if文then節)の「依存元DFGノード候補一覧表」から下位ブロックに含まれる変数毎の最終DFGノードを取得する。さらに、同部は、下位ブロックの「下位ブロックの最終DFGノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の最終DFGノードを取得する。順次関係形成部21は、上位ブロックの「下位ブロックの最終DFGノード一覧表」に取得した最終DFGノードを登録する(A6-5)。
A6−5の処理を行うことにより、順次関係形成部21は、if文のブロックの後に出現するDFGノードを作成した際に、この処理で登録した下位ブロックの最終DFGノードと、ブロック後に出現するDFGノード間で順次関係を結ぶことが可能となる。
次に、順次関係形成部21は、下位ブロック(if文のthen節)の「依存元DFGノード候補一覧表」から下位ブロックに含まれる先頭DFGノードを取得する。同部はさらに、下位ブロックの「下位ブロックの先頭DFGノード一覧表」から下位ブロックのさらに下位ブロックに含まれる先頭DFGノードを取得する。順次関係形成部21は、取得したそれぞれの先頭DFGノードに対して先頭DFGノードのDFGノード種別が「宣言」で無いか確認する。DFGノード種別が「宣言」である場合、順次関係形成部21は何もしない。DFGノード種別が「宣言」で無い場合、順次関係形成部21は、取得したそれぞれの先頭DFGノードを依存元ノード候補保持部22に登録されている上位ブロックの「下位ブロックの先頭DFGノード一覧表」に登録する(A6−6)。
ここで、取得した先頭DFGノードに対してDFGノード種別が「宣言」で無いことを確認する理由は、変数のスコープが上位ブロックで含まれていることを確認するためである。
A6−6の処理を行うことにより、順次関係形成部21は、ネストが深い場合でも、A6−2において、上位ブロックと下位ブロックのDFGノード間で順次関係を結ぶことが出来る。
A6−6の処理が終了した後、順次関係形成部21は、A6−4の処理と同じようにブロックを表すASTノードの親ASTノードを確認していき、if文にelse節があるか判断する(A6−7)。if文にelse節が有る場合は(A6−7でYes)、A6−8に処理が移り、無い場合は(A6−7でNo)処理を終了する。
if文にelse節が有る場合、順次関係形成部21は、A6−2と同じ処理で上位ブロックのDFGノードと、else節である下位ブロックのDFGノード間の順次関係を結ぶ(A6−8)。
A6−8の後、順次関係形成部21は、依存元ノード候補保持部22に登録されている上位ブロックの「下位ブロックの最終DFGノード一覧表」からif文then節に含まれる変数毎の最終DFGノードを取得する。同部は更に、下位ブロックの「依存元DFGノード候補一覧表」からif文else節に含まれる変数毎の最終DFGノードも取得する。同部は、下位ブロックの「下位ブロックの最終DFGノード一覧表」からif文else節に含まれるさらに下位ブロックの変数毎の最終DFGノードも取得する。
その後、順次関係形成部21は、取得した最終DFGノードを、依存元ノード候補保持部22にある上位ブロックの「依存元DFGノード候補一覧表」に登録する(A6−9)。
A6−9の処理を行うことにより、if文のブロック以降で作成するDFGノードと、A6−9で登録した上位ブロックの「依存元DFGノード候補一覧表」の最終DFGノード間に順次関係を結ぶことが可能となる。この結果、順次関係形成部21は、if文then節を通る場合と、if文のelase節を通る場合のデータフローを求めることができる。
親ASTノードまたは先祖ASTノードが、繰り返し処理制御文(for文 、while文または dowhile文)であった場合について説明する。
順次関係形成部21は、依存元ノード候補保持部22に登録されている下位ブロック(繰り返し処理制御文のブロック)の「依存元DFGノード候補一覧表」から下位ブロックに含まれる変数毎の最終DFGノードを取得する。さらに同部は、下位ブロックの「下位ブロックの最終DFGノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の最終DFGノードを取得する。順次関係形成部21は、上位ブロックの「下位ブロックの最終DFGノード一覧表」に取得した最終DFGノードを登録する(A6−10)。
A6−10の処理を行うことで、順次関係形成部21は、この処理で登録した下位ブロックの最終DFGノードと、繰り返し制御構文のブロック以降に作成するDFGノードとの間に順次関係を結ぶことが出来る。その結果、順次関係形成部21は、繰り返し制御構文を通る場合のデータフローを求めることが出来る。
また同じように、順次関係形成部21は、依存元ノード候補保持部22に登録されている下位ブロック(繰り返し処理制御文のブロック)の「依存元DFGノード候補一覧表」から下位ブロックに含まれる変数毎の先頭DFGノードを取得する。さらに同部は、下位ブロックの「下位ブロックの先頭DFGノード一覧表」から下位ブロックのさらに下位ブロックに含まれる変数毎の先頭DFGノードを取得する。順次関係形成部21は、上位ブロックの「下位ブロックの先頭DFGノード一覧表」に取得した先頭DFGノードを登録する(A6−11)。
A6−11の処理を行うことにより、順次関係形成部21は、ネストが深い場合でも、A6−2において、上位ブロックと下位ブロックのDFGノード間で順次関係を結ぶことが出来る。
A6−2からA6−11までの処理が完了したら、順次関係形成部21は、図6の処理を終了する。
<具体例>
図7のif文のサンプルソースコードを例に説明する。まず、順次関係形成部21は、上位ブロック(関数:func1)のブロック対応作業域30(図8)の最終DFGノードと、下位ブロック(if文のthen節)のブロック対応作業域30(図9)の先頭DFGノード間で順次関係を結ぶ(A6-2)。これにより、3行目の変数:aから4行目の変数:aにかけて、変数aに対応するDFGノード間で順次関係が結ばれる。
次に、順次関係形成部21は、下位ブロック(if文のthen節)のブロック対応作業域30(図9)にあるDFGノードを上位ブロック(関数:func1)のブロック対応作業域30(図8)に登録(A6-4〜A6-6)する。これにより、上位ブロック(関数:func1)のブロック対応作業域30が図8から図10のように変化する。
この後、順次関係形成部21は、6行目の変数:aに対応するDFGノードを作成する(A4-8)。次に順次関係形成部21は、上位ブロックのブロック対応作業域30(図10)のDFGノードの情報を元に4行目の変数:aから6行目の変数:a、3行目の変数:aから6行目の変数:aに対応するDFGノード間で順次関係を結ぶ(A4−9/10)。
順次関係を結んだ後、順次関係形成部21は、作成した6行目の変数:aに対応するDFGノードを上位ブロック(関数:func1)のブロック対応作業域30(図10)に登録する(A4-11)。これにより、上位ブロック(関数:func1)の記憶部が図10から図11のように変化する。
最終的に、図7のソースコードのデータフローは、図12のようになる。
次に、図13のif文にthen節、else節の両方が含まれるサンプルソースコードを例に説明する。まず、順次関係形成部21は、上位ブロック(関数:func2)のブロック対応作業域30(図14)の最終DFGノードと、下位ブロック(if文のthen節)のブロック対応作業域30(図15)の先頭DFGノード間で順次関係を結ぶ(A6-2)。これにより、3行目の変数:aから4行目の変数にかけて、変数に対応するDFGノード間で順次関係が結ばれる。
次に順次関係形成部21は、下位ブロック(if文のthen節)のブロック対応作業域30(図15)の最終DFGノードを上位ブロック(関数:func2)のブロック対応作業域30(図14)に登録する(A6-5)。また順次関係形成部21は、下位ブロック(if文のthen節)のブロック対応作業域30(図15)の先頭DFGノードを上位ブロック(関数:func2)のブロック対応作業域30(図14)に登録する(A6-6)。これにより、上位ブロック(関数:func2)のブロック対応作業域30が、図14から図16のように変化する。
図13のサンプルソースコードはif文のelse節を含む。従って、順次関係形成部21は、上位ブロック(関数:func2)のブロック対応作業域30(図16)の最終DFGノードと下位ブロック(if文のelse節)のブロック対応作業域30(図17)の先頭DFGノード間で順次関係を結ぶ(A6-8)。
次に、順次関係形成部21は、下位ブロック(if文のelse節)のブロック対応作業域30(図17)のDFGノードを、上位ブロック(関数:func2)のブロック対応作業域30(図16)に登録し直す(A6-9)。これで、上位ブロック(関数:func2)のブロック対応作業域30が、図15から図18のように変化する。順次関係形成部21は、A6-8を行うことで、3行目の変数:aから7行目の変数:aにかけてDFGノード間で順次関係を結ぶ。
その後順次関係形成部21は、上位ブロック(関数:func2)のブロック対応作業域30(図18)の情報を用いて、9行目の変数:aに対応するDFGノードを作成する(A4-8)。このとき順次関係形成部21は、4行目の変数:aから9行目の変数:aに、また7行目の変数:aから9行目の変数:aにかけて、対応するDFGノード間で順次関係を結ぶ(A4−10)。順次関係形成部21が、9行目の変数:aに対応するDFGノードを登録すると、上位ブロック(関数:func2)のブロック対応作業域30は、図18から図19のように変化する。
最終的に、図13のソースコードのデータフローグラフは、図20のようになる。
図21のネストが多段であるif文のサンプルソースコードを例について、変数:aに着目して説明する。
まず順次関係形成部21は、下位ブロックのさらに下位ブロック(最下位ブロックと呼ぶ)のブロック対応作業域30(図22)の最終DFGノードを、下位ブロック(if文のthen節)のブロック対応作業域30(図23)に登録する(A6-5)。順次関係形成部21は、同じように最下位ブロックのブロック対応作業域30(図22)の先頭DFGノードを下位ブロック(if文のthen節)のブロック対応作業域30(図23)に登録し直す(A6-6)。これで、下位ブロック(if文のthen節)のブロック対応作業域30が図23から図24のように変化する。
その後順次関係形成部21は、上位ブロック(関数:func3)のブロック対応作業域30(図25)のDFGノードから最下位ブロックのDFGノードに対して順次関係を結ぶ(A6-2)。これにより、2行目の変数:aと、6行目の変数:aに対応するDFGノード間で順次関係が結ばれる。
その後、順次関係形成部21は、下位ブロック(if文のthen節)のブロック対応作業域30に登録しているDFGノードを、上位ブロック(関数:func3)のブロック対応作業域30(図25)に登録し直す(A6-6)。これで、上位ブロック(関数:func3)のブロック対応作業域30が図25から図26のように変化する。
その後、順次関係形成部21は、9行目の変数:aに対応するDFGノードを作成する。このとき、順次関係形成部21は、上位ブロック(関数:func3)のブロック対応作業域30(図26)の情報を用いて、6行目の変数:aから9行目の変数:aにかけて、対応するDFGノード間で順次関係を結ぶ(A4-9)。さらに、順次関係形成部21は、2行目の変数:aから9行目の変数:aにかけて、対応するDFGノード間で順次関係を結ぶ(A4-10)。上位ブロック(関数:func.3)のブロック対応作業域30は、9行目の変数:aに対応するDFGノードが登録されると(A4-11)、図26から図27のように変化する。
最終的に、図21のサンプルソースコードの変数aのデータフローグラフは、図28(a)のようになる。なお、変数bのデータフローグラフは、図28(b)のようになる。
次に、図29のwhile文のサンプルソースコードを例に説明する。順次関係形成部21は、上位ブロック(関数:func4)のブロック対応作業域30(図30)の最終DFGノードから下位ブロック(while文)のブロック対応作業域30(図31)の先頭DFGノードにかけて順次関係を結ぶ(A6-2)。これにより、3行目の変数:aから4行目の変数:aにかけて、変数aに対応するDFGノード間の順次関係が結ばれる。
次に、順次関係形成部21は、下位ブロック(while文)のブロック対応作業域30(図31)の最終DFGノードを、上位ブロック(関数:func4)のブロック対応作業域30(図30)に登録する(A6-10)。上位ブロック(関数:func.4)のブロック対応作業域30は、5行目の変数:aに対応するDFGノードを登録されると、図30から図32のように変化する。
その後、順次関係形成部21は、下位ブロックの(while文)のブロック対応作業域30(図31)の先頭DFGノードを、上位ブロック(関数:func4)のブロック対応作業域30(図32)に登録する(A6-11)。これにより、上位ブロック(関数:func4)のブロック対応作業域30は、図32から図33のように変化する。
最後に、順次関係形成部21は、7行目の変数:aに対応するDFGノードを作成する(A4-8)。この際、順次関係形成部21は、上位ブロック(関数:func4)のブロック対応作業域30(図33)の情報を用いて、5行目の変数:aから9行目の変数:aにかけて、対応するDFGノード間で順次関係を結ぶ(A4-9)。さらに、順次関係形成部21は、3行目の変数:aから7行目の変数:aにかけて、対応するDFGノード間で順次関係を結ぶ(A4-10)。その後、上位ブロック(関数:func.4)のブロック対応作業域30は、7行目の変数:aに対応するDFGノードが登録されて(A4-11)、図33から図34のように変化する。
最終的に、図29のソースコードのデータフローは、図35のようになる。
<効果>
本実施の形態のデータフロー解析装置10は、効率の良いデータフローグラフ作成ができる。その理由は、順次関係形成部21が制御フローグラフを生成することなく、ASTからデータフローグラフを作成するからである。このため、制御フローグラフの作成領域が不要となる。
本実施の形態のデータフロー解析装置10の順次関係形成部21は、データフロー解析中にデータフロー解析に必要な制御フロー解析のみを行う。当該制御フロー解析の出力情報は制御フローグラフでは無く、データフローグラフのノード間のリンク情報である。順次関係形成部21は、データフロー解析中に制御フロー解析を行うことで、データフロー解析で必要の無い処理を行わず、制御フロー解析の結果をデータフローグラフの情報として出力できる。
<第2の実施形態>
図36は、第2の実施形態のデータフロー解析装置10の全体構成を示す図である。本実施の形態のデータフロー解析装置10は、抽象構文木抽出部20を備えない。ソースコードからASTの抽出は他の装置で行われ、本実施の形態のデータフロー解析装置10は、その結果のASTをネットワーク経由で受信するなどして、データフロー解析を行う。
さらに、本実施の形態のデータフロー解析装置10は、依存元ノード候補保持部22及びDFG記憶部23を備えない。例えば、他の装置が依存元ノード候補保持部22及びDFG記憶部23を備え、データフロー解析装置10は、ネットワーク経由でそれらをアクセスする。
本実施の形態のデータフロー解析装置10は、順次関係形成部21を備える。順次関係形成部21は、ブロック構造を有するプログラムの抽象構文木を取得する。
順次関係形成部21は、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをDFG記憶部23に作成して、両端ノード情報をブロック対応に記憶する。
順次関係形成部21は、当該抽象構文木から、ブロック内の対象変数の参照を検出すると、対応するノードと、当該ノードとブロック対応に記憶している下位ブロックのノード間のリンクと、を生成してDFG記憶部23に追加する。
本実施の形態のデータフロー解析装置10は、効率の良いデータフローグラフ作成ができる。その理由は、順次関係形成部21が制御フローグラフを生成することなく、ASTからデータフローグラフを作成するからである。このため、制御フローグラフの作成領域が不要となる。
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
10 データフロー解析装置
20 抽象構文木抽出部
21 順次関係形成部
22 依存元ノード候補保持部
23 DFG記憶部
30 ブロック対応作業域

Claims (10)

  1. ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをDFG記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記DFG記憶手段に追加する順次関係形成手段、を備え
    前記順次関係形成手段は、前記リンクの生成が終了すると、当該ブロックに対応する前記両端ノード情報を削除するデータフロー解析装置。
  2. 前記順関係形成手段は、前記制御構文がthen節とelse節を有するif文である場合、両節の各々に付随する下位ブロックについてデータフローグラフを作成して、両データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと前記ブロック対応に記憶している両下位ブロックのノード間のリンクを生成して前記DFG記憶手段に追加する、請求項1のデータフロー解析装置。
  3. 前記順関係形成手段は、前記制御構文がelse節の無いif文、または、繰り返し処理制御文である場合、前記制御構文に付随する1つの下位ブロックについてデータフローグラフを作成して、当該データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと、前記ブロック対応に記憶している1つの下位ブロックのノード間のリンクを生成して前記DFG記憶手段に追加する、請求項1のデータフロー解析装置。
  4. 前記プログラムのソースコードを取得して、前記抽象構文木を抽出する抽象構文木抽出手段と、
    前記DFG記憶手段と、をさらに備えた請求項1乃至3の何れか1項のデータフロー解析装置。
  5. ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをDFG記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記DFG記憶手段に追加し、前記リンクの生成が終了すると、当該ブロックに対応する前記両端ノード情報を削除する、データフロー解析方法。
  6. 前記制御構文がthen節とelse節を有するif文である場合、両節の各々に付随する下位ブロックについてデータフローグラフを作成して、両データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと前記ブロック対応に記憶している両下位ブロックのノード間のリンクを生成して前記DFG記憶手段に追加する、請求項5のデータフロー解析方法。
  7. 前記制御構文がelse節の無いif文、または、繰り返し処理制御文である場合、前記制御構文に付随する1つの下位ブロックについてデータフローグラフを作成して、当該データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと、前記ブロック対応に記憶している1つの下位ブロックのノード間のリンクを生成して前記DFG記憶手段に追加する、請求項5のデータフロー解析方法。
  8. ブロック構造を有するプログラムの抽象構文木を取得して、当該抽象構文木から、ブロックに含まれる制御構文を検出すると、当該制御構文に付随する下位ブロックの対象変数についてのデータフローグラフをDFG記憶手段に作成して、両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照を検出すると、対応するノードと、当該ノードと前記ブロック対応に記憶している下位ブロックのノード間のリンクと、を生成して前記DFG記憶手段に追加し、前記リンクの生成が終了すると、当該ブロックに対応する前記両端ノード情報を削除する処理を、コンピュータに実行させるプログラム。
  9. 前記制御構文がthen節とelse節を有するif文である場合、両節の各々に付随する下位ブロックについてデータフローグラフを作成して、両データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと前記ブロック対応に記憶している両下位ブロックのノード間のリンクを生成して前記DFG記憶手段に追加する処理をコンピュータに実行させる、請求項8のプログラム。
  10. 前記制御構文がelse節の無いif文、または、繰り返し処理制御文である場合、前記制御構文に付随する1つの下位ブロックについてデータフローグラフを作成して、当該データフローグラフの両端ノード情報を前記ブロック対応に記憶し、前記ブロック内の前記対象変数の参照に対応するノードと、前記ブロック対応に記憶している1つの下位ブロックのノード間のリンクを生成して前記DFG記憶手段に追加する処理をコンピュータに実行させる、請求項8のプログラム。
JP2014176926A 2014-09-01 2014-09-01 データ解析装置、データ解析方法、および、プログラム。 Active JP6502044B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2014176926A JP6502044B2 (ja) 2014-09-01 2014-09-01 データ解析装置、データ解析方法、および、プログラム。

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014176926A JP6502044B2 (ja) 2014-09-01 2014-09-01 データ解析装置、データ解析方法、および、プログラム。

Publications (2)

Publication Number Publication Date
JP2016051367A JP2016051367A (ja) 2016-04-11
JP6502044B2 true JP6502044B2 (ja) 2019-04-17

Family

ID=55658808

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014176926A Active JP6502044B2 (ja) 2014-09-01 2014-09-01 データ解析装置、データ解析方法、および、プログラム。

Country Status (1)

Country Link
JP (1) JP6502044B2 (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110704053B (zh) * 2019-09-03 2023-05-23 五八有限公司 一种样式信息的处理方法及装置
CN111666216B (zh) * 2020-06-05 2024-01-23 中国银行股份有限公司 一种智能合约分析方法及装置

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05181652A (ja) * 1992-01-07 1993-07-23 Nec Corp プログラムリバース装置
JPH06149551A (ja) * 1992-11-06 1994-05-27 Fujitsu Ltd プログラム仕様書自動生成方法
JP3997495B2 (ja) * 1998-02-05 2007-10-24 新日鉄ソリューションズ株式会社 ソフトウェア解析装置及びソフトウェア解析方法
JP2012164024A (ja) * 2011-02-03 2012-08-30 Toyota Motor Corp データフローグラフ生成装置、データフローグラフ生成方法及びデータフローグラフ生成プログラム

Also Published As

Publication number Publication date
JP2016051367A (ja) 2016-04-11

Similar Documents

Publication Publication Date Title
Collard et al. srcml: An infrastructure for the exploration, analysis, and manipulation of source code: A tool demonstration
US10664655B2 (en) Method and system for linear generalized LL recognition and context-aware parsing
CN106843840B (zh) 一种基于相似度分析的源代码版本演化注释复用方法
US9122540B2 (en) Transformation of computer programs and eliminating errors
JP2016157407A (ja) テキスト分析及び応答システムのための語彙意味パターンの事前構築方法
Verbitskaia et al. Relaxed parsing of regular approximations of string-embedded languages
JP6440895B2 (ja) ソフトウェア分析装置及びソフトウェア分析方法
JP6502044B2 (ja) データ解析装置、データ解析方法、および、プログラム。
Michelon et al. Mining feature revisions in highly-configurable software systems
US9002772B2 (en) Scalable rule-based processing system with trigger rules and rule evaluator
JP2011191985A (ja) シンボリック実行支援プログラム、方法及び装置
JP2008198103A (ja) 状態遷移図作成装置および状態遷移図作成方法
Jnanamurthy et al. Analysis of industrial control system software to detect semantic clones
JP6364332B2 (ja) 仕様生成方法、仕様生成装置、及びプログラム
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
JP6175306B2 (ja) 制御プログラム分割装置、制御プログラム分割方法及びその記録媒体
JP5578625B2 (ja) プログラム分析装置、プログラム分析方法、及びプログラム
JP2015022356A (ja) テストシナリオバリエーション生成装置及び方法及びプログラム
EP3167382A1 (en) Method and system for linear generalized ll recognition and context-aware parsing
US9792197B2 (en) Apparatus and program
KR20180115921A (ko) 프로그래밍 언어간 변환 방법
JP6011988B2 (ja) 影響範囲調査方法及び影響範囲調査装置
JP2010165205A (ja) モデルのテンプレート自動生成システム、方法及びプログラム
JP6077694B1 (ja) デシジョンテーブル生成装置、デシジョンテーブル生成方法およびデシジョンテーブル生成プログラム
CN107273386B (zh) 一种数据库的XML Schema约束文件生成方法和装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170809

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180628

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180710

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180904

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190320

R150 Certificate of patent or registration of utility model

Ref document number: 6502044

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150