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

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

Info

Publication number
JP6933012B2
JP6933012B2 JP2017117277A JP2017117277A JP6933012B2 JP 6933012 B2 JP6933012 B2 JP 6933012B2 JP 2017117277 A JP2017117277 A JP 2017117277A JP 2017117277 A JP2017117277 A JP 2017117277A JP 6933012 B2 JP6933012 B2 JP 6933012B2
Authority
JP
Japan
Prior art keywords
source codes
unit
graph
analysis
terminal
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
JP2017117277A
Other languages
English (en)
Other versions
JP2019003385A (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.)
Fujitsu Ltd
Original Assignee
Fujitsu 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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2017117277A priority Critical patent/JP6933012B2/ja
Priority to US16/003,693 priority patent/US10628139B2/en
Publication of JP2019003385A publication Critical patent/JP2019003385A/ja
Application granted granted Critical
Publication of JP6933012B2 publication Critical patent/JP6933012B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates
    • G06F8/658Incremental updates; Differential updates
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9014Indexing; Data structures therefor; Storage structures hash tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Stored Programmes (AREA)

Description

本発明の実施形態は、解析装置、解析プログラムおよび解析方法に関する。
従来、例えばソフトウェア開発等において、プログラムの更新を行った際に、プログラムの振舞いの等価性を比較するために、変更前および変更後のソースコードを解析する解析装置がある。
ソースコードを解析する手法として、変更前および変更後のソースコードの文字列を一定の単位毎に比較し、比較結果に基づいて2つのソースコードの等価性を判定する技術が提案されている。
特開2014−10699号公報
しかしながら、上述した従来技術では、例えば、プログラムの振舞いを変えないソースコードの変更、いわゆるリファクタリングを行った際に、プログラムの振舞いが変わったと誤検知する場合がある、という問題がある。
1つの側面では、リファクタリングを行った際の振舞いの誤検知を防止できる解析装置、解析プログラムおよび解析方法を提供することを目的とする。
一つの態様では、解析装置は、解析部と、変換部と、縮約部と、比較部とを有する。前記解析部は、比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成する。前記変換部は、生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化する。前記縮約部は、所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約する。前記比較部は、縮約された前記各グラフを比較して前記2つのソースコードの差異を出力する。
本発明の1実施形態によれば、リファクタリングを行った際の振舞いの誤検知を防止できる。
図1は、実施例に係る解析装置の構成を示す機能ブロック図である。 図2は、解析処理を説明する説明図である。 図3は、変換処理を説明する説明図である。 図4は、3部グラフテーブルの一例を示す図である。 図5は、3部グラフテーブルの一例を示す図である。 図6は、3部グラフテーブルの一例を示す図である。 図7は、結合処理を説明する説明図である。 図8は、縮約処理を説明する説明図である。 図9は、縮約処理を説明する説明図である。 図10は、縮約処理を説明する説明図である。 図11は、算出処理を説明する説明図である。 図12は、実施形態に係る解析装置が実行する全体処理を例示するフローチャートである。 図13は、変換処理を例示するフローチャートである。 図14は、第1処理(MD)を例示するフローチャートである。 図15は、第2処理(PS)を例示するフローチャートである。 図16は、第3処理(B)を例示するフローチャートである。 図17は、第4処理(LVD)を例示するフローチャートである。 図18は、第5処理(RS)を例示するフローチャートである。 図19は、第6処理(MIX)を例示するフローチャートである。 図20は、第7処理(X)を例示するフローチャートである。 図21は、結合処理を例示するフローチャートである。 図22は、縮約処理を例示するフローチャートである。 図23は、第1処理(ルール適用)を例示するフローチャートである。 図24は、ノードスキップ処理を例示するフローチャートである。 図25は、算出処理を例示するフローチャートである。 図26は、解析プログラムを実行するコンピュータを示す図である。
以下に、本願の開示する解析装置、解析プログラムおよび解析方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
図1は、実施例に係る解析装置1の構成を示す機能ブロック図である。図1に示すように、この解析装置1は、受付部11と、解析部12と、変換部13と、結合部14と、縮約部15と、算出部16と、比較部17と、ソースコードファイル群格納部111と、抽象構文木格納部112と、3部グラフ格納部113と、結合グラフ格納部114と、縮約グラフ格納部115と、ハッシュ値格納部116とを有する。
受付部11は、比較対象となる2つのソースコードSCa,SCbを受け付け、ソースコードファイル群格納部111に格納する。ソースコードSCa,SCbは、Java(登録商標)やC言語といったプログラミング言語の言語仕様に従って書かれたテキストファイルである。なお、以下では、JavaにおけるソースコードSCa,SCbを一例に挙げて説明することとする。
また、2つのソースコードSCa,SCbの関係としては、例えば、リビジョンの異なるソースコードである。より具体的には、2つのソースコードSCa,SCbは、リファクタリング前後のソースコードである。なお、2つのソースコードSCa,SCbをまとめてソースコードSCと記載する場合がある。
解析部12は、比較対象の2つのソースコードSCa,SCbを取得し、取得したソースコードSCa,SCb毎に解析して、解析結果を抽象構文木格納部112に格納する。なお、解析部12は、2つのソースコードSCa,SCbを受付部11から直接取得してもよく、ソースコードファイル群格納部111から取得してもよい。ここで、図2を用いて、解析部12の解析処理について具体的に説明する。
図2は、解析処理を説明する説明図である。図2には、JavaにおけるソースコードSCaおよびJavaの構文規則SRを示している。図2に示すように、解析部12は、ソースコードSCを構文規則SRに従って解析して抽象構文木ASTを生成する。なお、図2には、抽象構文木ASTの主な要素のみを示している。また、図2には、比較対象の2つのソースコードSCa、SCbのうち一方のソースコードSCaを示しており、他方のソースコードSCbについては、図7で説明する。
また、図2に示すソースコードSCや構文規則SRは、一例であり、これに限定されるものではなく、より複雑なソースコードSCであってもよく、また、他の構文規則SRであってもよい。
図1に戻って、変換部13について説明する。変換部13は、生成した抽象構文木ASTに基づき、2つのソースコードSCa,SCbにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化する。変換部13は、例えば抽象構文木格納部112から抽象構文木ASTを取得し、生成したグラフのデータを3部グラフ格納部113に格納する。
ここで、図3を用いて、変換部13の変換処理について具体的に説明する。図3は、変換処理を説明する説明図である。図3に示すように、変換部13は、生成した抽象構文木ASTを3部グラフ130に変換する。
ここで、3部グラフ130は、第1ノードn1(以下、主ノードn1と記載する場合がある)と、第2ノードn2(以下、端子n2と記載する場合がある)と、第3ノードn3(以下、端子n3と記載する場合がある)と、エッジeとを有する。
第1ノードn1は、ソースコードSCのメソッド内およびメソッド間の処理に対応する。なお、図3では、各主ノードn1を矩形状で示すとともに、矩形内にクラスを示す。また、図3に示す各主ノードn1のクラスについては、図6で後述する。
第2ノードn2は、ソースコードSCにおけるデータの参照に対応する。第2ノードn2は、例えば、メソッド呼び出しの戻り値、ローカル変数の参照値、メソッド処理内容の定義で引き渡されるパラメータの値、処理を行ったあとの環境等が設定される。図3では、第2ノードn2を、円形状で示すとともに、円形内に正の値「1」または「2」を示す。正の値「1」は、環境を示し、「2」は、パラメータを示す。
第3ノードn3は、ソースコードSCにおけるデータの設定、更新に対応する。第3ノードn3は、例えば、メソッド呼び出し時に引き渡すパラメータの値、ローカル変数の設定値、定義したメソッドの処理内容の実行の結果返される戻り値、直前の処理を行ったあとの環境等が設定される。図3では、第3ノードn3を、円形状で示すとともに、円形内に負の値「―1」または「―2」を示す。負の値「―1」は、環境を示し、「―2」は、パラメータを示す。
エッジeは、処理の実行順序を示す。図3では、エッジeを矢印で示す。具体的には、エッジeは、所定の主ノードn1(例えば、図3に示す「D申請」)の端子n2と、かかる主ノードn1の次に実行される主ノードn1(例えば、図3に示す「BN」)の端子n3とを接続する。また、図示していないが、エッジeは、主ノードn1と各端子n2、n3とを接続する。
このように、3部グラフ130に変換することで、2つのソースコードSCa、SCbを統一した条件化で比較できるようになるため、比較結果から差異を検出する際の精度を向上させることができる。
変換部13は、変換した3部グラフ130の情報を3部グラフ格納部113に格納する。ここで、図4〜図6を用いて、3部グラフ格納部113に格納される3部グラフ130のデータ構造を示す3部グラフテーブルについて説明する。
図4〜図6は、3部グラフテーブルの一例を示す図である。図4には、第1〜第3ノードn1〜n3の情報であるノードテーブルを示す。図5には、エッジeの情報であるエッジテーブルを示す。図6には、第1ノードn1のクラスに関する情報であるクラステーブルを示す。
図4に示すように、ノードテーブルは、「ID」、「格納位置」、「ノード種類」、「クラス」、「属性」といった項目を有する。「ID」は、各ノードを識別する識別情報である。「格納位置」は、対応するソースコードSCが格納された位置を示す。「ノード種類」は、第1〜第3ノードn1〜n3のいずれであるかを示す。「クラス」は、第1ノードn1のクラスを示す。「属性」は、データの属性を示す。
例えば、図4に示すように、IDが「11」のノードは、第1ノードn1であり、クラスが「D」であり、属性が「申請」である。また、IDが「1」のノードに対応するソースコードSCは、「/src/rev.1/」に格納されている。
また、図5に示すように、エッジテーブルは、「起点ID」、「終点ID」といった項目を含む。「起点ID」は、エッジeの起点となるノードを識別する識別情報である(図3参照)「終点ID」は、エッジeの終点となるノードを識別する識別情報である(図3参照)。
例えば、起点IDが「11」であり、終点IDが「12」であるエッジeは、主ノードn1と端子n2とを接続するエッジである。
また、図6に示すように、クラステーブルは、「名称」、「内容」といった項目を含む。「名称」は、各主ノードn1の名称を示す。「内容」は、各名称における主ノードn1の処理内容を示す。
例えば、名称が「D」の主ノードn1の処理内容は、「メソッドの処理内容の定義(Method Definition)」であることを示している。例えば、図3に示す「D申請」は、処理内容が「申請」であることを示している。
次に、図1に戻って結合部14について説明する。結合部14は、変換部13によってグラフ化された2つのソースコードSCa、SCbにおける各グラフ(3部グラフ130)の部分グラフを結合して、所定のメソッドの定義の部分グラフを生成する。結合部14は、例えば、受付部11がユーザからメソッドの定義の指定を受け付け、指定されたメソッドの定義の部分グラフを生成する。
ここで、結合部14による結合処理について説明する。図7は、結合処理を説明する説明図である。図7には、ソースコードSCbおよびソースコードSCbを変換して生成した3部グラフ130を示している。
また、図7に示すように、3部グラフ130は、部分グラフ130aおよび部分グラフ130bを含む。部分グラフ130aは、ソースコードSCbにおけるメソッドAを示すグラフであり、部分グラフ130bは、ソースコードSCbにおけるメソッドBを示すグラフである。
結合部14は、部分グラフ130aおよび部分グラフ130bをメソッドAの定義について結合し、結合グラフ140を生成する。具体的には、結合部14は、部分グラフ130aの主ノードn1である「C抽出」を部分グラフ130bに置き換える。
より具体的には、結合部14は、まず、部分グラフ130aの主ノードna11である「C抽出」および対応する端子na21、na31と、部分グラフ130bの主ノードnb11である「D抽出」および対応する端子nb21、nb31とを削除する。
つづいて、結合部14は、部分グラフ130aの主ノードna12である「DLr」の端子na22と、部分グラフ130bの主ノードnb12である「BN」の端子nb32とを接続する。
つづいて、結合部14は、部分グラフ130aの主ノードna13である「IV1」の端子na23の「2」と、部分グラフ130bの主ノードnb13である「ID」の端子nb33の「―2」とを接続する。
つづいて、結合部14は、部分グラフ130aの主ノードna14である「WLr」の端子na34の「―2」と、部分グラフ130bの主ノードnb14である「C処理」の端子nb24の「2」とを接続する。
つづいて、結合部14は、部分グラフ130aの主ノードna14である「WLr」の端子na34の「―1」と、部分グラフ130bの主ノードnb15である「BX」の端子nb25とを接続して、部分グラフ130a、130bが結合した結合グラフ140が完成する。
このように、注目しているメソッドAについて部分グラフ130a、130bを結合することで、2つのソースコードSCa、SCbの比較を容易に行うことができる。
図1に戻って、縮約部15について説明する。縮約部15は、所定のルールに基づき、グラフ化された2つのソースコードSCa、SCbにおける各グラフ(3部グラフ130または結合グラフ140)の冗長部分を縮約する。
ここで、図8〜10を用いて縮約部15による縮約処理について具体的に説明する。図8〜10は、縮約処理を説明する説明図である。図8〜10では、結合部14によって生成された結合グラフ140に対する縮約部15の縮約処理について説明する。なお、縮約処理は、結合グラフ140に限らず、3部グラフ130や、部分グラフ130a、130bに対して行ってもよい。
図8〜10に示すように、縮約部15は、所定のルール0〜5に従って、縮約処理を行う。まず、縮約部15は、結合グラフ140に対してルール0を適用して、主ノードn1fである「ID」および対応する端子n2f、n3fを除去する。ルール0は、適用のための条件はなく、常に処理が行われる。
このとき、縮約部15は、主ノードn1cである「IV1」の端子n2cの「2」と、主ノードn1gである「C処理」の端子n3gの「―2」とを接続する。これにより、縮約部15は、ルール0を適用した縮約グラフ150aを生成する。
つづいて、縮約部15は、縮約グラフ150aに対してルール1を適用して、主ノードn1jである「RLr」の端子n2jと、主ノードn1kである「C送信」の端子n3kとを接続しているエッジを除去する。
ルール1の適用条件は、主ノードn1iである「WLr」から「RLr」に至るパス(RL(−1)←(1)fn,・・・,f1(−1)←(1)WL)の中に、「RLr」の属性をrとし、f1,・・・,fnのうち対となる最も外側の「BN」,「BX」をf_{kN},f_{kX}として、∀i=1,・・・,kN,kX,・・・,n:fiが「WLr」でも「DLr」でも「D」でもないパス「WLr(属性がr)」から対象主ノードn1jである「RLr」へのパスが存在することである。なお、パスとは、複数の主ノードf1,・・・,fnとした場合、f1からfnの方向に接続された経路(パスfn,・・・,f1)を指す。
このとき、縮約部15は、主ノードn1gである「C処理」の端子n2gと、主ノードn1kである「C送信」の端子n3kとを接続する。これにより、縮約部15は、ルール1を適用した縮約グラフ150bを生成する。
つづいて、縮約部15は、縮約グラフ150bに対してルール2を適用して、主ノードn1jである「RLr」および対応する端子n2f、n3fを除去する。ルール2の適用条件は、主ノードn1jである「RLr」の端子n2j(円形内の数字が「2」の端子)から出るエッジがないことである。
このとき、縮約部15は、主ノードn1iである「WLr」の端子n2iと、主ノードn1kである「C送信」の端子n3kとを接続する。これにより、縮約部15は、ルール2を適用した縮約グラフ150cを生成する。
つづいて、縮約部15は、縮約グラフ150cに対してルール3を適用して、主ノードn1iである「WLr」および対応する端子n2i、n3iを除去する。
ルール3の適用条件は、主ノードn1iである「WLr」から「D」に至るパス(D(−1)←(1)fn,・・・,f1(−1)←(1)WL)の中に、「WLr」の属性をrとし、f1,・・・,fnのうち対となる最も外側の「BN」,「BX」をf_{kN},f_{kX}として、∃kT:fkT=BNなら、∀i=kT,・・,kN,kX,・・・,n:fiが「RLr」ではなく、そうでないなら∀i=1,・・・,kN,kX,・・・,n:fiが「RLr」でも「D」でもないパスが存在することである。
このとき、縮約部15は、主ノードn1hである「BX」の端子n2hと、主ノードn1kである「C送信」の端子n3kとを接続する。これにより、縮約部15は、ルール3を適用した縮約グラフ150dを生成する。
つづいて、縮約部15は、縮約グラフ150dに対してルール4を適用して、主ノードn1dである「DLr」および対応する端子n2d、n3dを除去する。
ルール4の適用条件は、主ノードn1dである「DLr」から「D」に至るパス(D(−1)←(1)fn,・・・,f1(−1)←(1)DL)の中に、「DLr」の属性をrとし、f1,・・・,fnのうち対となる最も外側の「BN」,「BX」をf_{kN},f_{kX}として、∃kT:fkT=BNなら、∀i=kT,・・,kN,kX,・・・,n:fiが「WLr」ではなく、そうでないなら∀i=1,・・・,kN,kX,・・・,n:fiが「WLr」でも「D」でもないパスが存在することである。
このとき、縮約部15は、主ノードn1cである「IV1」の端子n2cと、主ノードn1eである「BN」の端子n3eとを接続する。これにより、縮約部15は、ルール4を適用した縮約グラフ150eを生成する。
つづいて、縮約部15は、縮約グラフ150eに対してルール5を適用して、主ノードn1eである「BN」および対応する端子n2e、n3eと、主ノードn1hである「BX」および対応する端子n2h、n3hとを除去する。
ルール5の適用条件は、主ノードn1eである「BN」から「BX」に至るパス(BX(−1)←(1)fn,・・・,f1(−1)←(1)BN)の中に、f1,・・・,fnのうち対となる「BN」,「BX」をf_{kN},f_{kX}として、∀i=1,・・・,kN,kX,・・・,n:fiが「D」、「RL」、「WL」、「DL」、「BN」、「BX」のいずれでもないパスが存在することである。
このとき、縮約部15は、主ノードn1cである「IV1」の端子n2cと、主ノードn1gである「C処理」の端子n3gとを接続し、主ノードn1gである「C処理」の端子n2gと、主ノードn1kである「C送信」の端子n3kとを接続する。これにより、縮約部15は、ルール5を適用した縮約グラフ150fを生成する。
さらに、縮約部15は、縮約グラフ150fに対してルール5を適用して、主ノードn1bである「BN」および対応する端子n2b、n3bと、主ノードn1lである「BX」および対応する端子n2l、n3lとを除去する。
このとき、縮約部15は、主ノードn1aである「D申請」の端子n2aと、主ノードn1cである「IV1」の端子n3cとを接続し、主ノードn1kである「C送信」の端子n2kと、主ノードn1aである「D申請」の端子n3aとを接続する。これにより、縮約部15は、ルール5を適用した縮約グラフ150gを生成する。
図1に戻って算出部16について説明する。算出部16は、縮約部15によって縮約された各グラフ(縮約グラフ150g)に基づいてハッシュ値を算出する。ここで、図11を用いて、算出部16が算出する算出処理について具体的に説明する。
図11は、算出処理を説明する説明図である。図11には、縮約部15によって縮約された縮約グラフ150gを示している。図11に示すように、算出部16は、縮約グラフ150gに基づいて所定長さのハッシュ値を算出する。図11では、16バイトの長さのバイト列からなるハッシュ値を算出する。
より具体的には、算出部16は、各グラフを処理の流れおよびデータの流れの方向とは逆向きに辿ってハッシュ値を算出する。例えば、図11に示す例では、算出部16は、端子n3a←端子n2k←端子n3k(「−1」の端子)←端子n2g(「1」の端子)←端子n3g(「―1」の端子)←端子n2c(「1」の端子)←端子n3c←端子n2a←端子n3k(「−2」の端子)←端子n2g(「2」の端子)←端子n3g(「―2」の端子)←端子n2c(「2」の端子)の順に辿ることでハッシュ値を算出する。
なお、算出部16は、各グラフを処理の流れおよびデータの流れの方向とは逆向きに辿ってハッシュ値を算出したが、各グラフを処理の流れおよびデータの流れの方向と同じ方向に辿ってハッシュ値を算出してもよい。
このように、2つのソースコードSCa、SCbを比較する際に、ハッシュ値を用いることで、正確な比較処理を行うことができるため、リファクタリングにより誤検知を高精度に防止できる。
さらに、処理およびデータの流れとは逆向きに辿ってハッシュ値を算出することで、処理およびデータの流れの影響を除外できるため、比較処理をさらに正確に行うことができる。
図1に戻って、比較部17について説明する。比較部17は、縮約された各グラフ(縮約グラフ150f)を比較して、2つのソースコードSCa、SCbの差異を出力する。
例えば、比較部17は、算出部16によって算出されたハッシュ値を比較して、2つのソースコードSCa、SCbにおけるハッシュ値が一致する場合に、2つのソースコードSCa、SCbの差異が無いことを示す情報を比較結果として出力する。つまり、比較部17は、ハッシュ値が一致する場合には、2つのソースコードSCa、SCbにおける振舞いが同じであるとする比較結果を出力する。これにより、2つのソースコードSCa、SCbの振舞いに差異があるか否かを正確に検出することができる。
一方、比較部17は、ハッシュ値が一致しない場合には、2つのソースコードSCa、SCbの間に差異があることを示す比較結果を出力する。つまり、比較部17は、ハッシュ値が異なる場合には、2つのソースコードSCa、SCbにおける振舞いが異なるとする比較結果を出力する。
なお、比較部17は、ハッシュ値を比較することで、2つのソースコードSCa、SCbの間に差異があるか否かを判定したが、これに限らず、例えば、縮約グラフ150gの形状等を比較して差異の有無を判定してもよい。
次に、図12〜25を用いて、実施形態に係る解析装置1の動作について説明する。図12は、実施形態に係る解析装置1が実行する全体処理を例示するフローチャートである。
図12に示すように、受付部11は、比較対象の2つのソースコードSCa、SCbの格納位置が指定された格納指示があったか否かを判定する(ステップS11)。つづいて、解析部12は、受付部11が格納指示を受け付けた場合(ステップS11;Yes)、2つのソースコードSCa、SCb毎に解析して、抽象構文木を生成する(ステップS12)。
つづいて、変換部13は、格納位置にあるファイル全てを順に3部グラフ130に変換する(ステップS13)。具体的には、変換部13は、生成した抽象構文木に基づき、2つのソースコードSCa、SCbにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化する。
つづいて、受付部11は、比較指示があったか否かを判定する(ステップS14)。受付部11は、比較指示があった場合(ステップS14;Yes)、ソースコードファイル群の2つの格納位置d1,d2と、対象メソッドの名称nが指定された比較指示を受け付ける(ステップS15)。
つづいて、結合部14、縮約部15および算出部16は、格納位置d1および名称nを指定して、部分グラフ130a、130bの結合、冗長部分の縮約、ハッシュ値算出を行うことで、ハッシュ値h1を得る(ステップS16)。
つづいて、結合部14、縮約部15および算出部16は、格納位置d2および名称nを指定して、部分グラフ130a、130bの結合、冗長部分の縮約、ハッシュ値算出を行うことで、ハッシュ値h2を得る(ステップS17)。
つづいて、比較部17は、ハッシュ値h1およびハッシュ値h2が同一数値であるか否かを比較し、結果を出力し(ステップS18)、処理を終了する。
次に、図13を用いて、変換処理について説明する。図13は、変換処理を例示するフローチャートである。図13に示すように、まず、解析部12は、2つのソースコードSCa、SCb毎に構文解析し、抽象構文木(以下、ASTと記載)を得る(ステップS101)。
つづいて、変換部13は、ASTの根の各子要素(MethodDeclaration)に対し、その要素mを引数に第1処理(MD)を実行し(ステップS102)、変換処理を終了する。
次に、図14を用いて、第1処理(MD)について説明する。図14は、第1処理(MD)を例示するフローチャートである。図14に示すように、変換部13は、渡された要素mの2番目の子要素(Identifier)の文字列を属性値とする主ノード「D」(例えば、図8の主ノードn1a)を作る(ステップS110)。
つづいて、変換部13は、要素mの子要素(Parameters)を引数に第2処理(Ps)を実行し、返されたリストLpを保持する(ステップS111)。つづいて、変換部13は、主ノード「BN」(例えば、図8の主ノードn1b)を作る(ステップS112)。
つづいて変換部13は、主ノード「D」の端子「1」(例えば、図8の端子n2a)から主ノード「BN」の端子「−1」(例えば、図8の端子n3b)へのエッジを作る(ステップS113)。つづいて、変換部13は、主ノード「BX」(例えば、図8の主ノードn1l)を作り、主ノード「BX」の端子「1」(例えば、図8の端子n2l)から主ノード「D」の端子「−1」へのエッジeを作る(ステップS114)。
つづいて、変換部13は、子要素(MethodBody)の子要素(Block)と主ノード「BN」の端子「1」とリストLpと主ノード「D」とを引数に第3処理(B)を実行し、返された主ノードの端子「1」から主ノード「BX」の端子「−1」へのエッジを作る(ステップS115)このとき、返された端子があれば、かかる端子から主ノード「D」の端子「−2」へのエッジeを作り、第1処理を終了する。
次に、図15を用いて、第2処理(PS)について説明する。図15は、第2処理(PS)を例示するフローチャートである。図15に示すように、変換部13は、まず、リストLpを空にする(ステップS120)。
つづいて、変換部13は、渡された要素の各子要素(Parameter)の子要素(Identifier)の文字列をリストLpに追加する(ステップS121)。つづいて、変換部13は、リストLpを第1処理へ返し(ステップS122)、処理を終了する。
次に、図16を用いて、第3処理(B)について説明する。図16は、第3処理(B)を例示するフローチャートである。図16に示すように、変換部13は、渡された要素(Block)の子要素のリストをLc、渡された端子をt、リストをLp、主ノードをmとする(ステップS130)。
つづいて、変換部13は、Lcが空であるか否を判定する(ステップS131)。つづいて、変換部13は、Lcが空ではない場合(ステップS131;No)、Lcの先頭の要素cを取り出す(ステップS132)。このとき、端子vを「未設定」にする。
つづいて、変換部13は、要素cが子要素(LocalVariableDeclaration)であるか否かを判定する(ステップS133)。つづいて、変換部13は、要素cが子要素(LocalVariableDeclaration)ではない場合(ステップS133;No)、要素cが子要素(MethodInvocationExpr)であるか否かを判定する(ステップS134)。
つづいて、変換部13は、要素cが子要素(MethodInvocationExpr)である場合(ステップS134;Yes)、要素cと端子tとリストLpと主ノードmとを引数に第6処理(MIX)を実行する(ステップS135)。
つづいて、変換部13は、返された主ノードをeに設定し、eの端子「1」をtに設定し(ステップS136)。処理をステップS131に移行する。
一方、ステップS131において、変換部13は、Lcが空であった場合(ステップS131;Yes)、eと、vとを第1処理へ返し(ステップS137)、処理を終了する。
また、ステップS133において、変換部13は、要素cが子要素(LocalVariableDeclaration)であった場合(ステップS133;Yes)、要素cと端子tとリストLpと主ノードmを引数に第4処理(LVD)を実行し(ステップS138)、処理をステップS136に移行する。
また、ステップS134において、変換部13は、要素cが子要素(MethodInvocationExpr)でない場合(ステップS134;No)、要素cが子要素(ReturnStatement)であるか否かを判定する(ステップS139)。
変換部13は、要素cが子要素(ReturnStatement)であった場合(ステップS139;Yes)、要素cと端子tとリストLpと主ノードmを引数に第5処理(RS)を実行する(ステップS140)。つづいて、変換部13は、返された端子をvに設定し(ステップS141)、処理をステップS136に移行する。
一方、変換部13は、要素cが子要素(ReturnStatement)でない場合(ステップS139;No)、処理をステップS131に移行する。
次に、図17を用いて、第4処理(LVD)について説明する。図17は、第4処理(LVD)を例示するフローチャートである。図17に示すように、変換部13は、渡された要素cの子要素(Identifier)の文字列sを属性値とする主ノード「DL」(例えば、図8の主ノードn1d)を作り、渡された端子tから「DL」の端子「−1」へのエッジeを作る(ステップS150)。
つづいて、変換部13は、要素cの子要素(Expr)と「DL」の端子「1」と渡されたリストLpと主ノードmを引数に第7処理(X)を実行し、返された主ノードをdとする(ステップS151)。
つづいて、変換部13は、sを属性値とする主ノード「WL」(例えば、図8の主ノードn1i)を作り、dの端子「1」から「WL」の端子「−1」へのエッジeを作り、dの端子「2」から「WL」の端子「−2」へのエッジeを作る(ステップS152)。つづいて、変換部13は、「WL」を第3処理へ返し(ステップS153)、処理を終了する。
次に、図18を用いて、第5処理(RS)について説明する。図18は、第5処理(RS)を例示するフローチャートである。図18に示すように、変換部13は、渡された要素cの子要素(Expr)と渡された端子tとリストLpと主ノードmを引数に第7処理(X)を実行する(ステップS160)。つづいて、変換部13は、返された主ノードdとdの端子「2」を第3処理に返し(ステップS161)、処理を終了する。
次に、図19を用いて、第6処理(MIX)について説明する。図19は、第6処理(MIX)を例示するフローチャートである。図19に示すように、変換部13は、渡された要素cの子要素(Expr)のリストをLxとするとともに、端子tをeに設定し、端子のキューQrを空にする(ステップS170)。
つづいて、変換部13は、Lxが空であるか否かを判定する(ステップS171)。つづいて、変換部13は、Lxが空でない場合(ステップS171;No)、Lxの先頭の要素xを取り出す(ステップS172)。
つづいて、変換部13は、要素xと端子eと渡されたリストLpと主ノードmを引数に第7処理(X)を実行し、返された主ノードdの端子「2」をQrに追加し、dの端子「1」をeに設定し(ステップS173)、処理をステップS171に移行する。
一方、変換部13は、Lxが空であった場合(ステップS171;Yes)、要素cの子要素(Identifier)の文字列を属性値とする主ノード「C」(例えば、図8の主ノードn1g)を作り、端子eから「C」の端子「−1」へのエッジeを作る(ステップS174)。
つづいて、変換部13は、Qrの各要素rを先頭から順に「C」の端子「−2」「−3」・・・へ接続するエッジeを作る(ステップS175)。つづいて、変換部13は、「C」を第3処理へ返し(ステップS176)、処理を終了する。
次に、図20を用いて、第7処理(X)について説明する。図20は、第7処理(X)を例示するフローチャートである。図20に示すように、変換部13は、渡された要素xが子要素(MethodInvocationExpr)であるか否かを判定する(ステップS180)。
つづいて、変換部13は、要素xが子要素(MethodInvocationExpr)でない場合(ステップ180;No)、要素xが子要素(Identifier)であるか否かを判定する(ステップS181)。
つづいて、変換部13は、要素xが子要素(Identifier)である場合(ステップS181;Yes)、xの文字列sがリストLpの第i番目に現れるか否かを判定する(ステップS182)。
つづいて、変換部13は、xの文字列sがリストLpの第i番目に現れない場合(ステップS182;No)、sを属性値とする主ノード「RL」(例えば、主ノードn1j)を作り、渡された端子tから「RL」の端子「−1」へのエッジを作る(ステップS183)。つづいて、変換部13は、主ノード「RL」を第5処理に返し(ステップS184)、処理を終了する。
一方、ステップS180において、変換部13は、渡された要素xが子要素(MethodInvocationExpr)であった場合(ステップS180;Yes)、要素xと渡された端子tとリストLpと主ノードmとを引数に第6処理を実行し、返された主ノードを「C」とする(ステップS185)。つづいて、変換部13は、主ノード「C」を第5処理に返し(ステップS186)、処理を終了する。
一方、ステップS181において、変換部13は、要素xが子要素(Identifier)でない場合(ステップS181;No)、要素xが子要素(Literal)であるか否かを判定する(ステップS187)。
つづいて、変換部13は、要素xが子要素(Literal)である場合(ステップS187;Yes)、要素xの文字列を属性値とする主ノード「IV」(例えば、図8のn1c)を作り、渡された端子tから「IV」の端子「−1」へのエッジを作る(ステップS188)。つづいて、変換部13は、主ノード「IV」を第5処理へ返し(ステップS189)、処理を終了する。
一方、ステップS187において、変換部13は、要素xが子要素(Literal)でない場合(ステップS187;No)、エラーを提示して停止し(ステップ190)、処理を終了する。
また、ステップS182において、変換部13は、xの文字列sがリストLpの第i番目に現れる場合(ステップS182;Yes)、主ノード「ID」(例えば、図8の主ノードn1f)を作り、渡された主ノードmの端子「i+1」から「ID」の端子「−2」へのエッジを作り、渡された端子tから「ID」の端子「−1」へのエッジを作る(ステップS191)。つづいて、変換部13は、主ノード「ID」を第5処理へ返し(ステップS192)、処理を終了する。
次に、図21を用いて、結合処理について説明する。図21は、結合処理を例示するフローチャートである。図21に示すように、結合部14は、指定された格納位置のソースコードSCに対する3部グラフ130から属性値が指定されたメソッド名kとなっている主ノード「D」を見つける(ステップS201)。
つづいて、結合部14は、主ノード「D」(属性k)を含む部分グラフ130a,130bを3部グラフ格納部113から、結合グラフ格納部114へコピーする(ステップS202)。
つづいて、結合部14は、端子リストLを主ノード「D」(属性k)から出る端子すべてを含むリストに設定し、主ノードの集合Sを空に設定する(ステップS203)。つづいて、結合部14は、リストLが空であるか否かを判定する(ステップS204)。
つづいて、結合部14は、リストLが空でない場合(ステップS204;No)、リストLから、1つの端子tを取り出し、端子tから出るエッジを2ホップたどった位置にある主ノードをnとする(ステップS205)。
つづいて、結合部14は、nが集合Sに含まれない、かつ、nが主ノード「C」であるか否かを判定する(ステップS206)。結合部14は、nが集合Sに含まれない、かつ、nが主ノード「C」である場合(ステップS206;Yes)、nの属性をmとし、3部グラフ格納部113の3部グラフ130全体から主ノード「D」(属性m)を含む部分グラフ130a、130bを探す(ステップS207)。
つづいて、結合部14は、主ノード「D」(属性m)を含む部分グラフ130a、130bが見つかったか否かを判定する(ステップS208)。結合部14は、主ノード「D」(属性m)を含む部分グラフ130a、130bが見つかった場合(ステップS208;Yes)、見つけた部分グラフ130a、130bを結合グラフ格納部114にコピーする(ステップS209)。
つづいて、結合部14は、nの各端子iが他の端子と接する各エッジi→t(またはi
←t)について、コピーしたグラフ上の「D」の端子―iが他の端子と接する各エッジーi←s(またはーi→s)に対し、エッジs→t(またはs←t)を作る(ステップS210)。
つづいて、結合部14は、主ノード「D」(属性m)と主ノードn、これらの主ノードと接する端子、それらのノードと接するエッジを削除する(ステップS211)。つづいて、結合部14は、tから出るエッジを2ホップたどった位置にある主ノードを新たなnとして設定し(ステップS212)。処理をステップS206へ移行する。
一方、ステップS204において、結合部14は、リストLが空であった場合(ステップS204;Yes)、処理を終了する。
また、ステップS206において、結合部14は、nがSに含まれない、かつ、nが主ノード「C」であることがどちらか一方でも否定される場合(ステップS206;No)、nが主ノード「D」(属性k)ではなく、かつ、nがSに含まれないなら、nから出る端子全てをリストLに追加し、nを集合Sに追加し(ステップS213)、処理をステップS204に移行する。
また、ステップS208において、結合部14は、主ノード「D」(属性m)を含む部分グラフ130a、130bが見つからなかった場合(ステップS208;No)、処理をステップS213に移行する。
次に、図22を用いて、縮約処理について説明する。図22は、縮約処理を例示するフローチャートである。図22に示すように、縮約部15は、結合グラフ格納部114の内容を縮約グラフ格納部115へコピーする(ステップS301)。
つづいて、縮約部15は、ノードリストLdの内容を、主ノード「D」全てが含まれるリストに設定し、フラグmを「false」に設定する(ステップS302)。つづいて、縮約部15は、Ldが空であるか否かを判定する(ステップS303)。
縮約部15は、Ldが空ではない場合(ステップS303;No)、Ldから主ノードdを1つ取り出す(ステップS304)。つづいて、縮約部15は、リストLrの内容を、全ての縮約ルールのIDが含まれるリストに設定する(ステップS305)。
つづいて、縮約部15は、Lrが空であるか否かを判定する(ステップS306)。縮約部15は、Lrが空ではない場合(ステップS306;No)、LrからルールのIDを1つ取り出し、そのIDのルールをrとする(ステップS307)。
つづいて、縮約部15は、主ノードdとルールrを引数に第1処理(ルール適用)を実行する(ステップS308)。つづいて、縮約部15は、ルールrの実行でグラフ(縮約グラフ150a〜150g)が変化したらフラグmを「true」に設定し(ステップS309)、処理をステップS306に移行する。
一方、ステップS303において、縮約部15は、Ldから空であった場合(ステップS303;Yes)、mが「true」であるか否かを判定する(ステップS310)。縮約部15は、mが「true」でない場合(ステップS310;No)、処理を終了する。
また、縮約部15は、mが「true」である場合(ステップS310;Yes)、処理をステップS302に移行する。また、ステップS306において、縮約部15は、Lrが空であった場合(ステップS306;Yes)、処理をステップS303に移行する。
次に、図23を用いて、縮約処理における第1処理(ルール適用)について説明する。図23は、第1処理(ルール適用)を例示するフローチャートである。図23に示すように、縮約部15は、ノードリストLnの内容を渡された主ノードdのみからなるリストにする(ステップS320)。
つづいて、縮約部15は、Lnが空であるか否かを判定する(ステップS321)。縮約部15は、Lnが空ではない場合(ステップS321;No)、Lnから主ノードnを1つ取り出す(ステップS322)。
つづいて、縮約部15は、nから出るエッジを3ホップたどった位置にある主ノード全て(「D」を除く)をLnに追加する(ステップS323)。つづいて、縮約部15は、渡されたルールrの対象主ノードの種類を渡された主ノードdと比較する(ステップS324)。
つづいて、縮約部15は、比較した結果、合致したか否かを判定する(ステップS325)。縮約部15は、合致した場合(ステップS325;Yes)、nはrの条件を満たすか否かを判定する(ステップS326)。
つづいて、縮約部15は、nがrの条件を満たす場合(ステップS326;Yes)、rの処理を実施し(ステップS327)、処理をステップS321に移行する。
一方、ステップS321において、縮約部15は、Lnが空である場合(ステップS321;Yes)、処理を終了する。また、ステップS325において、縮約部15は、合致しない場合(ステップS325;No)、処理をステップS321に移行する。また、ステップS326において、縮約部15は、nがrの条件を満たさない場合(ステップS326;No)、処理をステップS321に移行する。
次に、図24を用いて、縮約処理におけるノードスキップ処理について説明する。図24は、縮約処理におけるノードスキップ処理を例示するフローチャートである。図24では、ノードスキップ処理の対象が主ノードnである場合について説明する。
図24に示すように、縮約部15は、主ノードnの端子「1」に接する端子tそれぞれについて、主ノードnの端子「−1」に接する各端子sからエッジs→tを追加する(ステップS330)。
つづいて、縮約部15は、主ノードnの各端子が接するエッジを削除する(ステップS331)。つづいて、縮約部15は、主ノードnの各端子を削除する(ステップS332)。つづいて、縮約部15は、主ノードnを削除し(ステップS333)、処理を終了する。
次に、図25を用いて、ハッシュ値の算出処理について説明する。図25は、算出処理を例示するフローチャートである。図25に示すように、算出部16は、渡された主ノードnに接する第3ノード(端子)を、空のスタックTtに、その属性数値(端子番号)の絶対値の大きい順にプッシュする(ステップS401)。
つづいて、算出部16は、pを空文字列に設定し、集合Svを{n}に設定する(ステップS402)。つづいて、縮約部15は、Ttが空であるか否かを判定する(ステップS403)。
算出部16は、Ttが空ではない場合(ステップS403;No)、Ttから端子tをホップする(ステップS404)。つづいて、算出部16は、tに向かうエッジs→tがあるか否かを判定する(ステップS405)。
算出部16は、tに向かうエッジs→tがある場合(ステップS405;Yes)、tに接する主ノードをd、sに接する主ノードをcとして、次の文字列「「dの種類名」「dの属性値」“。”「tの属性値」“←”、「cの種類名」「cの属性値」“。”「sの属性値」“;”」をpに追加する(ステップS406)。
つづいて、算出部16は、cがSvに含まれるか否かを判定する(ステップS407)。つづいて、算出部16は、cがSvに含まれない場合(ステップS407;No)、Svにcを加える(ステップS408)。つづいて、算出部16は、主ノードcに接する第3ノード(端子)を、空のスタックTtに、その属性数値(端子番号)の絶対値の大きい順にプッシュし(ステップS409)、処理をステップS403に移行する。
一方、ステップS403において、算出部16は、Ttが空であった場合(ステップS403;Yes)、md5(p)を算出したハッシュ値として返し(ステップS410)、処理を終了する。
また、ステップS405において、算出部16は、tに向かうエッジs→tがない場合(ステップS405;No)、処理をステップS403に移行する。また、ステップS407において、算出部16は、cがSvに含まれる場合(ステップS407;Yes)、処理をステップS403に移行する。
上述したように、実施形態に係る解析装置1は、解析部12と、変換部13と、縮約部15と、比較部17とを有する。解析部12は、比較対象の2つのソースコードSCa、SCbを取得し、取得したソースコードSC毎に解析して2つのソースコードSCa、SCbの抽象構文木を生成する。変換部13は、生成した抽象構文木に基づき、2つのソースコードSCa、SCbにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化する。縮約部15は、所定のルールに基づき、グラフ化された2つのソースコードSCa、SCbにおける各グラフの冗長部分を縮約する。比較部17は、縮約された各グラフを比較して2つのソースコードSCa、SCbの差異を出力する。
これにより、メソッドの分割やメソッドの結合によるソースコードSCa、SCbの変更の影響を除外できるため、リファクタリングを行った際に、プログラムの振舞いが変わったと誤検知することを防止できる。
また、図示した各部の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各部の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況等に応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、解析部12と変換部13とを統合してもよい。また、図示した各処理は、上記の順番に限定されるものではなく、処理内容を矛盾させない範囲において、同時に実施してもよく、順序を入れ替えて実施してもよい。
さらに、各装置で行われる各種処理機能は、CPU(又はMPU、MCU(Micro Controller Unit)等のマイクロ・コンピュータ)上で、その全部または任意の一部を実行するようにしてもよい。また、各種処理機能は、CPU(またはMPU、MCU等のマイクロ・コンピュータ)で解析実行されるプログラム上、またはワイヤードロジックによるハードウェア上で、その全部又は任意の一部を実行するようにしてもよいことは言うまでもない。
ところで、上記の各実施例で説明した各種の処理は、予め用意されたプログラムをコンピュータで実行することで実現できる。そこで、以下では、上記の各実施例と同様の機能を有するプログラムを実行するコンピュータの一例を説明する。図26は、解析プログラムを実行するコンピュータの一例を示す図である。
図26に示すように、コンピュータ300は、各種演算処理を実行するCPU370と、データ入力を受け付ける入力装置310と、出力装置320とを有する。また、コンピュータ300は、記憶媒体からプログラム等を読み取る媒体読取装置340と、各種装置との間でデータの授受を行う通信インターフェース(IF)330とを有する。また、コンピュータ300は、各種情報を一時記憶するRAM360と、ハードディスク装置(HDD)350とを有する。また、各装置310〜370は、バス380に接続される。
HDD350には、図1に示した受付部11、解析部12、変換部13、結合部14、縮約部15、算出部16および比較部17の各処理部と同様の機能を有する解析プログラム351が記憶される。また、HDD350には、ソースコードファイル群格納部111と、抽象構文木格納部112と、3部グラフ格納部113と、結合グラフ格納部114と、縮約グラフ格納部115と、ハッシュ値格納部116、および、解析プログラム351を実現するための各種データが記憶される。入力装置310は、例えば、コンピュータ300の管理者から各種情報の入力を受け付ける。出力装置320は、例えば、コンピュータ300の管理者に対して各種画面を表示する。通信IF330は、図示しないネットワークと接続され、各種装置と各種情報をやりとりする。
CPU370は、HDD350に記憶された各プログラムを読み出して、RAM360に展開して実行することで、解析プロセス371を行う。また、これらのプログラムは、コンピュータ300を図1に示した解析部12、変換部13、結合部14、縮約部15、算出部16および比較部17として機能させることができる。
なお、上記の解析プログラム351は、必ずしもHDD350に記憶されている必要はない。例えば、コンピュータ300が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ300が読み出して実行するようにしてもよい。コンピュータ300が読み取り可能な記憶媒体は、例えば、CD−ROMやDVDディスク、USB(Universal Serial Bus)メモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、LAN等に接続された装置にこの解析プログラムを記憶させておき、コンピュータ300がこれらから解析プログラムを読み出して実行するようにしてもよい。
以上の実施形態に関し、さらに以下の付記を開示する。
(付記1)比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成する解析部と、
生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化する変換部と、
所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約する縮約部と、
縮約された前記各グラフを比較して前記2つのソースコードの差異を出力する比較部と
を有することを特徴とする解析装置。
(付記2)前記変換部は、
前記処理に対応する第1ノードと、前記データの参照に対応する第2ノードと、前記データの設定に対応する第3ノードとの接続関係を示す3部グラフに変換する
ことを特徴とする付記1に記載の解析装置。
(付記3)グラフ化された前記2つのソースコードにおける前記各グラフの部分グラフを結合して、所定のメソッドの定義の部分グラフを生成する結合部をさらに備える、
ことを特徴とする付記1または2に記載の解析装置。
(付記4)縮約された前記各グラフに基づいてハッシュ値を算出する算出部をさらに備え、
前記比較部は、
前記各グラフの前記ハッシュ値を比較して前記差異を出力する
ことを特徴とする付記1〜3のいずれか一に記載の解析装置。
(付記5)前記算出部は、
前記各グラフを前記処理の流れおよび前記データの流れの方向とは逆向きに辿って前記ハッシュ値を算出する
ことを特徴とする付記4に記載の解析装置。
(付記6)前記比較部は、
算出された前記ハッシュ値同士が一致する場合に、前記2つのソースコードの前記差異が無いことを示す情報を出力する
ことを特徴とする付記4または5に記載の解析装置。
(付記7)コンピュータに、
比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成し、
生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化し、
所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約し、
縮約された前記各グラフを比較して前記2つのソースコードの差異を出力する
処理を実行させることを特徴とする解析プログラム。
(付記8)前記グラフ化する処理は、
前記処理に対応する第1ノードと、前記データの参照に対応する第2ノードと、前記データの設定に対応する第3ノードとの接続関係を示す3部グラフに変換する
ことを特徴とする付記7に記載の解析プログラム。
(付記9)グラフ化された前記2つのソースコードにおける前記各グラフの部分グラフを結合して、所定のメソッドの定義の部分グラフを生成する処理をさらにコンピュータに実行させる、
ことを特徴とする付記7または8に記載の解析プログラム。
(付記10)縮約された前記各グラフに基づいてハッシュ値を算出する処理をさらにコンピュータに実行させ、
前記出力する処理は、
前記各グラフの前記ハッシュ値を比較して前記差異を出力する
ことを特徴とする付記7〜9のいずれか一に記載の解析プログラム。
(付記11)前記算出する処理は、
前記各グラフを前記処理の流れおよび前記データの流れの方向とは逆向きに辿って前記ハッシュ値を算出する
ことを特徴とする付記10に記載の解析プログラム。
(付記12)前記出力する処理は、
算出された前記ハッシュ値同士が一致する場合に、前記2つのソースコードの前記差異が無いことを示す情報を出力する
ことを特徴とする付記10または11に記載の解析プログラム。
(付記13)コンピュータが、
比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成し、
生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化し、
所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約し、
縮約された前記各グラフを比較して前記2つのソースコードの差異を出力する
処理を実行することを特徴とする解析方法。
(付記14)前記グラフ化する処理は、
前記処理に対応する第1ノードと、前記データの参照に対応する第2ノードと、前記データの設定に対応する第3ノードとの接続関係を示す3部グラフに変換する
ことを特徴とする付記13に記載の解析方法。
(付記15)グラフ化された前記2つのソースコードにおける前記各グラフの部分グラフを結合して、所定のメソッドの定義の部分グラフを生成する処理をさらにコンピュータが実行する、
ことを特徴とする付記13または14に記載の解析方法。
(付記16)縮約された前記各グラフに基づいてハッシュ値を算出する処理をさらにコンピュータが実行し、
前記出力する処理は、
前記各グラフの前記ハッシュ値を比較して前記差異を出力する
ことを特徴とする付記13〜15のいずれか一に記載の解析方法。
(付記17)前記算出する処理は、
前記各グラフを前記処理の流れおよび前記データの流れの方向とは逆向きに辿って前記ハッシュ値を算出する
ことを特徴とする付記16に記載の解析方法。
(付記18)前記出力する処理は、
算出された前記ハッシュ値同士が一致する場合に、前記2つのソースコードの前記差異が無いことを示す情報を出力する
ことを特徴とする付記16または17に記載の解析方法。
1 解析装置
11 受付部
12 解析部
13 変換部
14 結合部
15 縮約部
16 算出部
17 比較部
111 ソースコードファイル群格納部
112 抽象構文木格納部
113 3部グラフ格納部
114 結合グラフ格納部
115 縮約グラフ格納部
116 ハッシュ値格納部
SC,SCa,SCb ソースコード

Claims (8)

  1. 比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成する解析部と、
    生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化する変換部と、
    所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約する縮約部と、
    縮約された前記各グラフを比較して前記2つのソースコードの差異を出力する比較部とを有し、
    前記変換部は、
    前記処理に対応する第1ノードと、前記データの参照に対応する第2ノードと、前記データの設定に対応する第3ノードとの接続関係を示す3部グラフに変換する
    ことを特徴とする解析装置。
  2. 比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成する解析部と、
    生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化する変換部と、
    所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約する縮約部と、
    縮約された前記各グラフに基づいて、前記各グラフを前記処理の流れおよび前記データの流れの方向とは逆向きに辿ってハッシュ値を算出する算出部と、
    縮約された前記各グラフの前記ハッシュ値を比較して前記2つのソースコードの差異を出力する比較部と
    を有することを特徴とする解析装置。
  3. グラフ化された前記2つのソースコードにおける前記各グラフの部分グラフを結合して、所定のメソッドの定義の部分グラフを生成する結合部をさらに備える、
    ことを特徴とする請求項1または2に記載の解析装置。
  4. 前記比較部は、
    算出された前記ハッシュ値同士が一致する場合に、前記2つのソースコードの前記差異が無いことを示す情報を出力する
    ことを特徴とする請求項に記載の解析装置。
  5. コンピュータに、
    比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成し、
    生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化し、
    所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約し、
    縮約された前記各グラフを比較して前記2つのソースコードの差異を出力する処理を実行させ
    前記グラフ化する処理は、
    前記処理に対応する第1ノードと、前記データの参照に対応する第2ノードと、前記データの設定に対応する第3ノードとの接続関係を示す3部グラフに変換する
    ことを特徴とする解析プログラム。
  6. コンピュータに、
    比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成し、
    生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化し、
    所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約し、
    縮約された前記各グラフに基づいて、前記各グラフを前記処理の流れおよび前記データの流れの方向とは逆向きに辿ってハッシュ値を算出し、
    縮約された前記各グラフの前記ハッシュ値を比較して前記2つのソースコードの差異を出力する
    処理を実行させることを特徴とする解析プログラム。
  7. コンピュータが、
    比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成し、
    生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化し、
    所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約し、
    縮約された前記各グラフを比較して前記2つのソースコードの差異を出力する処理を実行し、
    前記グラフ化する処理は、
    前記処理に対応する第1ノードと、前記データの参照に対応する第2ノードと、前記データの設定に対応する第3ノードとの接続関係を示す3部グラフに変換する
    ことを特徴とする解析方法。
  8. コンピュータが、
    比較対象の2つのソースコードを取得し、取得した前記ソースコード毎に解析して前記2つのソースコードの抽象構文木を生成し、
    生成した前記抽象構文木に基づき、前記2つのソースコードにおけるメソッド内およびメソッド間の処理の流れおよびデータの流れをグラフ化し、
    所定のルールに基づき、グラフ化された前記2つのソースコードにおける各グラフの冗長部分を縮約し、
    縮約された前記各グラフに基づいて、前記各グラフを前記処理の流れおよび前記データの流れの方向とは逆向きに辿ってハッシュ値を算出し、
    縮約された前記各グラフの前記ハッシュ値を比較して前記2つのソースコードの差異を出力する
    処理を実行することを特徴とする解析方法。
JP2017117277A 2017-06-14 2017-06-14 解析装置、解析プログラムおよび解析方法 Active JP6933012B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2017117277A JP6933012B2 (ja) 2017-06-14 2017-06-14 解析装置、解析プログラムおよび解析方法
US16/003,693 US10628139B2 (en) 2017-06-14 2018-06-08 Analysis apparatus, analysis method and recording medium on which analysis program is recorded

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017117277A JP6933012B2 (ja) 2017-06-14 2017-06-14 解析装置、解析プログラムおよび解析方法

Publications (2)

Publication Number Publication Date
JP2019003385A JP2019003385A (ja) 2019-01-10
JP6933012B2 true JP6933012B2 (ja) 2021-09-08

Family

ID=64656879

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017117277A Active JP6933012B2 (ja) 2017-06-14 2017-06-14 解析装置、解析プログラムおよび解析方法

Country Status (2)

Country Link
US (1) US10628139B2 (ja)
JP (1) JP6933012B2 (ja)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10915304B1 (en) * 2018-07-03 2021-02-09 Devfactory Innovations Fz-Llc System optimized for performing source code analysis
US10901708B1 (en) * 2018-11-23 2021-01-26 Amazon Technologies, Inc. Techniques for unsupervised learning embeddings on source code tokens from non-local contexts
US11074167B2 (en) 2019-03-25 2021-07-27 Aurora Labs Ltd. Visualization of code execution through line-of-code behavior and relation models
US11948118B1 (en) 2019-10-15 2024-04-02 Devfactory Innovations Fz-Llc Codebase insight generation and commit attribution, analysis, and visualization technology
JPWO2023021553A1 (ja) * 2021-08-16 2023-02-23
US11853732B1 (en) * 2022-06-21 2023-12-26 Microsoft Technology Licensing, Llc Source code structural inference based on indentation
CN116643732B (zh) * 2023-07-26 2023-10-24 成都谐盈科技有限公司 基于软件无线电通信的不同建模系统联合代码生成的方法

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2147036A1 (en) 1994-05-16 1995-11-17 Yih-Farn Robin Chen System and method for selective regression testing
US6594822B1 (en) * 1999-02-19 2003-07-15 Nortel Networks Limited Method and apparatus for creating a software patch by comparing object files
US7340732B2 (en) * 2003-11-26 2008-03-04 Sun Microsystems, Inc. Updating profile frequency for procedure inlining
JP3966518B2 (ja) * 2004-03-12 2007-08-29 インターナショナル・ビジネス・マシーンズ・コーポレーション プログラム解析装置、その解析方法及びプログラム
US7689559B2 (en) * 2006-02-08 2010-03-30 Telenor Asa Document similarity scoring and ranking method, device and computer program product
WO2007096935A1 (ja) * 2006-02-20 2007-08-30 Fujitsu Limited プログラム解析方法、プログラム解析装置およびプログラム解析プログラム
US7503027B1 (en) * 2006-03-31 2009-03-10 The Mathworks, Inc. Hardware description language code generation from a state diagram
US20090287641A1 (en) * 2008-05-13 2009-11-19 Eric Rahm Method and system for crawling the world wide web
WO2013088461A1 (ja) * 2011-12-12 2013-06-20 株式会社 日立製作所 ソフトウェア解析プログラム、および、ソフトウェア解析システム
US9294281B2 (en) * 2012-02-10 2016-03-22 Microsoft Technology Licensing, Llc Utilization of a protected module to prevent offline dictionary attacks
JP5900193B2 (ja) 2012-06-29 2016-04-06 富士通株式会社 更新判定プログラムおよび更新判定装置
US20140053285A1 (en) * 2012-08-16 2014-02-20 Infosys Limited Methods for detecting plagiarism in software code and devices thereof
US9043757B2 (en) * 2012-12-13 2015-05-26 Oracle International Corporation Identifying differences between source codes of different versions of a software when each source code is organized using incorporated files
JP5903038B2 (ja) * 2012-12-26 2016-04-13 株式会社日立製作所 ソースコード等価性検証装置、および、ソースコード等価性検証方法
US8984485B2 (en) * 2013-05-01 2015-03-17 International Business Machines Corporation Analysis of source code changes
US9760346B2 (en) * 2013-05-31 2017-09-12 Microsoft Technology Licensing, Llc Deeply parallel source code compilation
JP6364263B2 (ja) * 2014-07-08 2018-07-25 株式会社エヌ・ティ・ティ・データ 検証支援方法、検証支援装置、及びプログラム

Also Published As

Publication number Publication date
US20180364992A1 (en) 2018-12-20
JP2019003385A (ja) 2019-01-10
US10628139B2 (en) 2020-04-21

Similar Documents

Publication Publication Date Title
JP6933012B2 (ja) 解析装置、解析プログラムおよび解析方法
CN109426723B (zh) 使用释放后内存的检测方法、系统、设备及存储介质
CN105446723B (zh) 用于标识源代码版本之间的语义区别的方法和装置
KR101732764B1 (ko) 코드 클론 검출을 이용하는 지능형 코드 디퍼런싱을 수행하는 방법 및 시스템
US8312440B2 (en) Method, computer program product, and hardware product for providing program individuality analysis for source code programs
JP5775829B2 (ja) ソフトウェアの構造可視化プログラムおよびシステム
US20100199264A1 (en) Pattern inspection system, pattern inspection device, method and pattern inspection program
CN107122295B (zh) 测试用例脚本的生成方法和装置
CN108875317B (zh) 软件克隆检测方法及装置、检测设备及存储介质
US9092577B2 (en) Method for generating test data for evaluating program execution performance
Avetisyan et al. LLVM-based code clone detection framework
CN111240987A (zh) 移植程序检测方法、装置、电子设备及计算机可读存储介质
CN113515303B (zh) 一种项目转型方法、装置和设备
US9396239B2 (en) Compiling method, storage medium and compiling apparatus
CN108804308B (zh) 新版本程序缺陷检测方法及装置
JP2012181666A (ja) 情報処理装置、情報処理方法及び情報処理プログラム
CN116880847A (zh) 基于开源项目的溯源方法、装置电子设备及存储介质
JP2018073223A (ja) 解析プログラム、解析方法、および解析装置
US10417110B2 (en) Method for verifying traceability of first instructions in a procedural programming language generated from second instructions in a modelling language
JP2006277282A (ja) モデル評価解析システムおよびモデル評価解析プログラム
JP6002507B2 (ja) ソフトウェア検証用プログラムおよびソフトウェア検証システム
CN112954060B (zh) 一种数据分析方法、装置、电子设备以及存储介质
CN111736848B (zh) 包冲突定位方法、装置、电子设备及可读存储介质
CN115658492A (zh) 内核配置项异常值的检测方法及装置
CN114791865A (zh) 一种基于关系图的配置项自洽性检测方法、系统和介质

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20200310

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20210302

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20210309

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20210420

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20210802

R150 Certificate of patent or registration of utility model

Ref document number: 6933012

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150