JP2014199569A - ソースプログラム解析システム、ソースプログラム解析方法およびプログラム - Google Patents

ソースプログラム解析システム、ソースプログラム解析方法およびプログラム Download PDF

Info

Publication number
JP2014199569A
JP2014199569A JP2013074623A JP2013074623A JP2014199569A JP 2014199569 A JP2014199569 A JP 2014199569A JP 2013074623 A JP2013074623 A JP 2013074623A JP 2013074623 A JP2013074623 A JP 2013074623A JP 2014199569 A JP2014199569 A JP 2014199569A
Authority
JP
Japan
Prior art keywords
matching
similar
source program
detected
matching part
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.)
Granted
Application number
JP2013074623A
Other languages
English (en)
Other versions
JP6090850B2 (ja
Inventor
久 坂本
Hisashi Sakamoto
久 坂本
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 Solution Innovators Ltd
Original Assignee
NEC Solution Innovators 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 Solution Innovators Ltd filed Critical NEC Solution Innovators Ltd
Priority to JP2013074623A priority Critical patent/JP6090850B2/ja
Priority to CN201480019304.0A priority patent/CN105122208A/zh
Priority to PCT/JP2014/058021 priority patent/WO2014157056A1/ja
Priority to US14/781,122 priority patent/US9880834B2/en
Publication of JP2014199569A publication Critical patent/JP2014199569A/ja
Application granted granted Critical
Publication of JP6090850B2 publication Critical patent/JP6090850B2/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/70Software maintenance or management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/22Indexing; Data structures therefor; Storage structures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/74Reverse engineering; Extracting design information from source code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Databases & Information Systems (AREA)
  • Computational Linguistics (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】文の挿入や削除、変更が施されているコードクローンを検出し、検出したコードクローンに基づいてプログラムの修正コストを算出するために有効な情報を出力するソースプログラム解析システム、ソースプログラム解析方法およびプログラムを提供する。
【解決手段】一致部分検出部11は、ソースプログラム1から内容が互いに一致する一致部分を検出する。類似部分検出部13は、一致部分検出部11が検出した一致部分に基づいて、ソースプログラム1から内容が互いに一致する部分と一致しない部分とで構成され、かつ、基準に合致する類似部分を検出する。非一致部分解析部14は、類似部分検出部13が検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する。
【選択図】図23

Description

本発明は、ソースプログラム解析システム、ソースプログラム解析方法およびプログラムに関する。
現在、多くの企業や組織で大規模なコンピュータシステムが様々な目的で稼働している。このようなコンピュータシステムの運営においては、稼働しているソフトウェアの不具合を修正したり、あるいは必要な機能を追加したりといった保守活動が必要となる。コンピュータシステムを利用する企業や組織には、ソフトウェアの修正や改良に必要となるコストを的確に把握したいという要求が存在する。
ソフトウェアの保守コストを見積もる際、いわゆるコードクローンの位置や数から保守コストを見積もる技術が存在する。コードクローンとは、プログラムのソースコード上に存在する部分的な複製を指し、コードクローンの存在はソフトウェアの保守性を低下させることが知られている。例えば、コードクローンの中に不具合が発見された場合、不具合を解消するために、開発者は同一の内容を持つコードクローンについて、個別に修正を要するか検討しなければならなくなるためである。特に大規模なシステムにおいては、一人の開発者がソフトウェア全体を検証し、全てのコードクローンについて修正の適否を検討することは困難である。
コードクローンを検出する技術について、現在までいろいろな研究がなされている。
非特許文献1によると、コードクローンは以下の3種類に分類される。タイプ1は、空白、括弧等を除いて完全に一致するコードクローンである。タイプ2は、変数名、ラベル名、手続き名等のユーザ定義名称、または変数の型など一部の予約語のみが異なるコードクローンである。タイプ3は、タイプ2のコードクローンに、さらに文の挿入や削除、変更が施されているコードクローンである。非特許文献1は、このうちタイプ1および2のコードクローンを検出する技術を開示している。
非特許文献2は、コードクローンを検出するシステムおよびソフトウェアを開示している。非特許文献2が開示するソフトウェア(CCFinderX)は、処理対象のソースプログラムを字句解析し、ソースプログラムに含まれるコードクローンを検出する。このソフトウェアは、上記のタイプ1およびタイプ2のコードクローンを検出することができる。
特許文献1は、関数単位でコードクローンを検出し、そのコードクローンの類似性を評価するシステムを開示している。特許文献1が開示するシステムは、ソースプログラムを関数単位で解析し、利用者が指定した類似度検出条件に合致するものを検出する。利用者は、内容が一致するもの(タイプ1のコードクローン)、あるいは一部が異なるもの(タイプ2または3のコードクローン)の検出を指定できる。
また、特許文献1が開示するシステムは、検出したコードクローンにおいて、ソースコードが互いに一致するか、関数インターフェースが同一かの2点から評価し、その結果からコードクローンを4カテゴリに分類する。操作者は、このカテゴリを参照することで、例えば関数インターフェースのみ異なるコードクローンが他にあるか、ソースコードが一致するコードクローンが他にあるかを知ることができ、コードクローンを再利用する際に参考にすることができる。
特開2012−164211号公報
肥後芳樹、楠本信二、井上克郎、「コードクローン検出とその関連技術」電子情報通信学会論文誌D、VOL.J91−D、No6(2008)、pp.1465−1481. CCFinderホームページ<URL: http://www.ccfinder.net >
上述の文献で開示された技術では、文の挿入や削除、変更が施されているコードクローンの保守コストを算出するための有効な情報を出力できないという課題がある。
より具体的に説明すると、非特許文献1および2は、文の挿入や削除、変更が施されているコードクローンを検出する技術を開示していない。ソフトウェア開発において開発者がソースプログラムの一部をコピーして再利用する場合、そのまま利用することよりも、改変を加えて利用することのほうが多い。従って、ソフトウェアを修正や改良する際にはタイプ3のコードクローンも対象とする必要がある。この点で、非特許文献1および2の技術によるコードクローンの検出だけでは不十分である。また、非特許文献1および2は、検出したコードクローンについて、類似性などの観点から評価する技術を開示していない。従って、検出したコードクローンへの修正や改良を行う際の作業コストの見積もりの指標となる情報を提供することができない。
また、特許文献1が開示する技術は、関数単位で再利用判定を行うものであり、関数内部に存在するコードクローンを検出することができない。ソフトウェアを保守する上では関数内のコードクローンへの修正を要するケースもあり、そのような場合は、特許文献1が開示する技術は十分な情報を得ることができない。また、関数のないプログラム言語で記述されたソースプログラムを解析することもできない。また、特許文献1が開示するシステムは、ソースコードが互いに一致するか、関数インターフェースが同一かの2点からコードクローンを評価する。しかし、この2つの観点の評価のみでは、ソフトウェアの修正や改良を行う際に、どのコードクローンをどの程度変更する必要があるかを示すことができない。従って、ソフトウェアの保守を行う上では、有効な情報とは言えなかった。
本発明は、以上の問題点に着目してなされたものであり、文の挿入や削除、変更が施されているコードクローンを検出し、検出したコードクローンに基づいてそのプログラムの修正コストを算出するために有効な情報を出力するソースプログラム解析システム、ソースプログラム解析方法およびプログラムを提供することを目的とする。
上記の目的を達成するため、本発明の第1の観点にかかるソースプログラム解析システムは、
ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出手段と、
前記一致部分検出手段が検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成され、かつ、基準に合致する類似部分を検出する類似部分検出手段と、
前記類似部分検出手段が検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析手段と、を備える、
ことを特徴とする。
上記の目的を達成するため、本発明の第2の観点にかかるソースプログラム解析方法は、
ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出ステップと、
前記一致部分検出ステップで検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成され、かつ、基準に合致する類似部分を検出する類似部分検出ステップと、
前記類似部分検出ステップで検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析ステップと、を備える、
ことを特徴とする。
上記の目的を達成するため、本発明の第3の観点にかかるプログラムは、コンピュータに、
ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出機能、
前記一致部分検出機能が検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成される所定の基準を満たす類似部分を検出する類似部分検出機能、
前記類似部分検出機能が検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析機能、を実現させる、
ことを特徴とする。
本発明によれば、文の挿入や削除、変更が施されているコードクローンを検出し、検出したコードクローンに基づいてプログラムの修正コストを算出するために有効な情報を出力するソースプログラム解析システム、ソースプログラム解析方法およびプログラムを実現できる。
本発明の実施形態にかかるソースプログラム解析システムのハードウェア構成を示した図である。 ソースプログラム解析システムの機能を示したブロック図である。 ソースプログラム解析システムのデータの流れを示した図である。 一致部分情報DBの内容を示した図である。 文法定義情報DBの内容を示した図である。 実行単位標識情報DBの内容を示した図である。 類似部分情報DBの内容を示した図である。 非一致構造情報DBの内容を示した図である。 実施形態の説明におけるソースプログラムを示した図である。 ソースプログラム解析処理を示したフローチャートである。 一致部分検出処理を示したフローチャートである。 一致部分検出処理後の一致部分情報DBの内容を示した図である。 実行単位標識検出処理を示したフローチャートである。 実行単位標識検出処理で参照される文法定義情報DBの内容を示した図である。 実行単位標識検出処理後の実行単位標識情報DBの内容を示した図である。 類似部分検出処理を示したフローチャートである。 一致部分の出現順による類似部分検出処理を示したフローチャートである。 一致部分の前後部分を含む類似部分検出処理を示したフローチャートである。 類似部分検出処理後の類似部分情報DBの内容を示した図である。 非一致構造分析処理を示したフローチャートである。 (a)〜(c)は、非一致構造分析処理により得られる構文構造例を示した図である。 非一致構造分析処理後の非一致構造情報DBの内容を示した図である。 本発明の実施形態にかかるソースプログラム解析システムの機能概要を示した図である。
以下、本発明の実施形態について、図面を参照しながら説明する。
(実施形態)
本発明の実施形態にかかるソースプログラム解析システムは、ソースプログラムを解析し、文の挿入や削除、変更が施されている(すなわち非一致部分を有する)コードクローンを検出した上で、コードクローンにおける非一致部分のプログラム構造を解析し、類似性に関する指標を出力する。操作者は、この類似性に関する指標を参照し、そのプログラムの修正コストを算出することができる。
本実施形態にかかるソースプログラム解析システム100は、図1に示すように、制御部110、記憶部120、操作部130、画面表示部140を備える。ソースプログラム解析システム100の構成要素は、バス101を介して相互に接続されている。
制御部110は、CPU(Central Processing Unit)111、ROM(Read Only Memory)112、RAM(Random Access Memory)113を備える。CPU111は、ROM112などに記憶されている制御用のプログラムに従って、ソースプログラム解析システム100全体の動作を制御する。ROM112は、制御用のプログラムを記憶する。RAM113は、CPU111が使用するデータを一時的に保存する。制御部110は、ソースプログラム解析システム100が備える他の構成要素との間で、バス101を介して信号を送受信することにより、これらの構成要素を制御する。
記憶部120は、ハードディスク、SSD(Solid State Drive)、あるいはCD−ROM(Compact Disc - Read Only Memory)等を備え、ソースプログラム解析システム100が稼動する上で必要な情報を記憶する。
操作部130は、操作者の操作を入力として受けとり、制御部110に情報として伝達する。操作部130は、例えばマウスやキーボード、あるいはタッチパネルなどを備える。
画面表示部140は、制御部110の制御に基づき、操作画面や結果表示画面などのソースプログラム解析システム100が操作者に対して表示すべき情報を表示する。画面表示部140は、液晶ディスプレイや有機エレクトロルミネセンスディスプレイ等で構成される。
ソースプログラム解析システム100が動作する際、図2に示すように、制御部110は、一致部分検出部11、実行単位標識検出部12、類似部分検出部13、非一致部分分析部14として機能する。また、記憶部120は、一致部分情報DB(データベース)21、文法定義情報DB22、実行単位標識情報DB23、類似部分情報DB24、非一致構造情報DB25として機能する。
次に、図2に示す各部の機能及び動作を、図3を参照して説明する。
ソースプログラム解析システム100は、全体としては、ソースプログラム1を解析し、検出したコードクローンの類似性に関する指標を非一致構造情報DB25に記録する。
一致部分検出部11は、ソースプログラム1を解析し、内容が互いに一致する一致部分を検出する。この一致部分は、上述したタイプ1あるいはタイプ2のコードクローンに該当する。一致部分検出部11は、検出した一致部分ごとに一致部分情報を生成し、生成した一致部分情報を一致部分情報DB21に記録する。
一致部分検出部11の機能を実現するには、例えば非特許文献2が開示する技術およびソフトウェアを用いることができる。本実施形態においては、非特許文献2が開示するソフトウェアのひとつであるCCfinderXを使用する。
一致部分検出部11は、一致部分を行ごとに検出し、検出した一致部分の位置をソースプログラム上の開始行番号および終了行番号で特定する。ここで行とは、ソースプログラム上において、改行を示すコードに挟まれた部分のコードの集合を指す。
実行単位標識検出部12は、文法定義情報DB22に記録された文法定義に基づき、入力されたソースプログラムの実行単位の開始あるいは終了を示す標識を検出し、実行単位標識情報を生成し、実行単位標識情報DB23に記録する。ここで実行単位とは、各プログラム言語の構文規則で定義されているセクション(節)、ディビジョン(部)、段落、手続き(サブルーチン)、関数、ブロック等、プログラムを分割する上で基準となる単位を指す。
類似部分検出部13は、一致部分情報DB21に記録された一致部分情報に基づいて、基準に合致する類似部分を検出し、類似部分情報を生成し、類似部分情報DB24に記録する。類似部分検出部13は、検出した類似部分の位置をソースプログラム上の開始行番号および終了行番号で特定する。
類似部分検出部13は、以下に示す2パターンのいずれかに合致する部分を、基準に合致する類似部分として検出する。
第1のパターンの類似部分は、複数の一致部分と、その一致部分にはさまれた部分からなるものである。この類似部分は、両端の一致部分と、その間の内容が一致しない非一致部分を有し、文の挿入や削除、変更が施されているコードクローン(タイプ3のコードクローン)に該当する。
第1のパターンの類似部分を検出するとき、類似部分検出部13は、一致部分情報DB21に記録された一致部分情報を参照し、複数の一致部分が、間に他の一致部分を挟まずに同じ出現順番でソースプログラムに配置されているものを検出する。そして、検出した複数の一致部分および当該一致部分の間にある部分を、ひとつの類似部分(第1のパターンの類似部分)として抽出する。
第2のパターンの類似部分は、一致部分と、ソースプログラム上その一致部分の直前にある非一致部分(前部分)と、その一致部分の直後にある非一致部分(後部分)とからなるものである。この類似部分は、一致部分と、その前あるいは後の非一致部分(前部分あるいは後部分)から構成されるため、文の挿入や削除、変更が施されているコードクローンに該当する。
類似部分検出部13は、一致部分情報DB21に記録された一致部分情報、および実行単位標識情報DB23に記録された実行単位標識情報を参照し、各一致部分の前部分および後部分を検出する。ここで、前部分とは、所定の区切りからその一致部分の開始行までの部分を指し、後部分とは、その一致部分の終了行から所定の区切りまでの部分を指す。所定の区切りとは、実行単位標識または他の一致部分の開始行もしくは終了行の中で、その一致部分に最も近いものを指す。
第2のパターンの類似部分を検出するとき、類似部分検出部13は、前部分あるいは後部分が検出された一致部分について、前部分から一致部分を経て後部分までの範囲を、ひとつの類似部分として抽出する。
なお、類似部分検出部13は、前部分のみが検出された一致部分があると、前部分からその一致部分までを類似部分として抽出する。類似部分検出部13は、後部分のみが検出された一致部分があると、一致部分から後部分までを類似部分として抽出する。
非一致部分分析部14は、各類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を非一致構造情報DB25に記録する。具体的には、非一致部分分析部14は、類似部分情報DB24から類似部分の位置と含有一致部分情報を読み出し、また一致部分情報DB21から一致部分の位置を読み出し、類似部分の非一致部分の位置を特定する。非一致部分分析部14は、特定した非一致部分の位置のプログラム記述をソースプログラム1から読み出す。非一致部分分析部14は、読み出したプログラム記述を、文法定義情報DB22に記録された文法定義に従って構文解析し、構文構造を取得する。非一致部分分析部14は、取得した構文構造を比較し、各類似部分の非一致部分で共通する構文構造(非一致部分共通構文構造)を検出する。非一致部分分析部14は、各類似部分の非一致部分の構文構造と、非一致部分共通構文構造とを比較し、類似する度合いを構文類似度として算出する。
構文解析の際、非一致部分分析部14は、LR法(Left-to-Right scanning)によって非一致部分のプログラム記述を解析し、構文木構造で表された構文構造を取得する。
また、図3に示す一致部分情報DB21は、図4に示すように、コードクローンID(T2101)、グループID(T2102)、ファイル名(T2103)、開始行番号(T2104)、終了行番号(T2105)を有する。
コードクローンIDは、一致部分検出部11が、ソースプログラム1から検出した一致部分(タイプ1あるいはタイプ2のコードクローン)にユニークに付ける識別情報である。
グループIDは、その一致部分が属するグループを示す識別情報である。同一のグループに属する一致部分は、互いに内容が一致する。
ファイル名は、ソースプログラム1のファイル名を指す。
開始行番号は、ソースプログラム1上で当該一致部分が存在する部分の最初の行番号を示す。
終了行番号は、ソースプログラム1上で当該一致部分が存在する部分の最後の行番号を示す。
図3に示す文法定義情報DB22は、図5に示すように、プログラム言語種別(T2201)、文法定義(T2202)を有する。
プログラム言語種は、後述する文法定義がどのプログラム言語に対応するものであるかを示す情報である。例えば「C(C言語)」「JAVA(登録商標)」などといった形で表現される。
文法定義は、プログラム言語種別で示されたプログラム言語の文法を定義する情報である。文法定義は、例えば、関数の開始を示すコード、関数の終了を示すコード、変数の範囲、数値の範囲、演算子の種類やコード、代入演算子を示すコード、式の形式、代入式の形式等が、対象のプログラム言語ではどのように規定されているかを示す。
図3に示す実行単位標識情報DB23は、図6に示すように、実行単位標識ID(T2301)、実行単位種別(T2302)、開始終了属性(T2303)、ファイル名(T2304)、開始行番号(T2305)、終了行番号(T2306)を有する。
実行単位標識IDは、実行単位標識検出部12が、ソースプログラム1から検出した実行単位の開始あるいは終了を示すコード(標識)に付ける識別情報である。
実行単位標識種別は、検出されたコードが、セクション(節)、ディビジョン(部)、段落、手続き(サブルーチン)、関数、ブロック等の実行単位のどれに対応するものであるかを示す情報である。
開始終了属性は、検出されたコードが実行単位の開始に対応するものであるか、終了に対応するものであるかを表す情報である。
ファイル名は、ソースプログラム1のファイル名を示す情報である。
開始行番号は、検出されたコードが開始する行を示す情報である。
終了行番号は、検出されたコードが終了する行を示す情報である。
図3に示す類似部分情報DB24は、図7に示すように、類似部分ID(T2401)、類似部分グループID(T2402)、ファイル名(T2403)、開始行番号(T2404)、終了行番号(T2405)、一致部分リスト(T2406)からなる類似部分情報を記録する。
類似部分ID(T2401)は、類似部分検出部13が、ソースプログラム1から検出した類似部分にユニークに付ける識別情報である。
類似部分グループID(T2402)は、類似部分が属する類似部分グループを示す情報である。同一の類似部分グループに属する類似部分は、同一のグループに属する一致部分を含む。
ファイル名(T2403)は、ソースプログラム1のファイル名を示す。
開始行番号(T2404)は、検出された類似部分が開始する行を示す。
終了行番号(T2405)は、検出された類似部分が終了する行を示す。
一致部分リスト(T2406)は、当該類似部分に含まれる一致部分のコードクローンIDを示す。一致部分リストは、一致部分に存在するコードクローンIDを出現する順にリスト化された形で保有する。
図3に示す非一致構造情報DB25は、図8に示すように、類似部分ID(T2501)、類似部分グループID(T2502)、非一致部分構文構造(T2503)、非一致部分共通構文構造(T2504)非一致部分構文類似度(T2505)からなる非一致構造情報を記録する。
類似部分ID(T2501)は、類似部分を識別するための識別情報である。
類似部分グループID(T2502)は、類似部分のグループを識別するための識別情報である。
非一致部分構文構造(T2503)は、類似部分が保持する非一致部分の構文構造を示す。非一致部分構文構造は、XML(eXtensible Markup Language)、あるいはDOM(Document Object Model)等の方式によって階層構造で表現されたデータとして、あるいはバイナリデータとして記録される。
非一致部分共通構文構造(T2504)は、同一類似部分グループIDを有する類似部分の非一致部分が共通に保持する構文構造(非一致部分共通構文構造)を示す。非一致部分共通構文は、XML(eXtensible Markup Language)、あるいはDOM(Document Object Model)等の方式によって階層構造で表現されたデータとして、あるいはバイナリデータとして記録される。
非一致部分構文類似度(T2505)は、各類似部分の非一致部分が、非一致部分共通構文構造とどの程度類似しているかを示す数値指標である。具体的には、階層構造で表現された非一致部分構文構造において、全体のノード数のうちどれだけの割合のノードが非一致部分共通構文構造と共通しているかをパーセンテージで示す。
次に、ソースプログラム解析システム100がソースプログラムを解析する動作について、図9に示すソースプログラムを解析する場合を例に説明する。
操作者が、操作部130を介してソースプログラム解析システム100に、ソースプログラム1の解析処理を開始する指示をすると、ソースプログラム解析システム100は、図10に示すソースプログラム解析処理を開始する。
最初に、制御部110は、一致部分検出処理を開始する(ステップS100)。
この一致部分検出処理(ステップS100)の詳細を図11を参照して説明する。
制御部110は、図11に示すように、ソースプログラム1に存在する一致部分を検出する(ステップS101)。
具体的には、制御部110は図9に示すソースプログラム1のプログラム記述を解析し、第05行から第06行のソースコードと、第11行から第12行のソースコードとが内容が一致することを検出する。これを受けて、制御部110は、第05行から第06行のソースコードと、第11行から第12行のソースコードを一致部分として検出する。同様に、制御部110は、第08行から第10行、および第14行から第16行の各ソースコードも一致部分として検出する。
次に制御部110は、ステップS101で検出した各一致部分に識別番号を付与する(ステップS102)。具体的には、制御部110は第05行から第06行、第08行から第10行、第11行から第12行、および第14行から第16行の各ソースコードに識別番号としてコードクローンID、グループIDを付与する。
コードクローンIDを付与する際、制御部110は、検出した一致部分間でコードクローンIDが重複しないように採番する。
グループIDを付与する際、制御部110は、内容が一致する一致部分間でグループIDが一致するように、また内容が一致しないコードクローン間ではグループIDが重複しないように採番する。
以上を踏まえ、制御部110は第05行から第06行のソースコードにコードクローンID「1」、グループID「1」を付与し、第08行から第10行のソースコードにコードクローンID「2」グループID「2」を付与する。
また、第11行から第12行のソースコードは第05行から第06行のソースコードと内容が一致する。そこで、制御部110は第11行から第12行のソースコードにはコードクローンID「3」を付与するとともに、グループIDは第05行から第06行のソースコードと一致する「1」を付与する。同様に、制御部110は第14行から第16行のソースコードにはコードクローンID「4」グループID「2」を付与する。
次に制御部110は、ステップS101で検出した各コードクローンのそれぞれについて、一致部分情報を一致部分情報DB21に記録する(ステップS103)。一致部分情報は、各一致部分のコードクローンID、グループID、ファイル名、開始行番号、終了行番号からなる情報である。
具体的には、第05行から第06行のソースコードは、コードクローンID「1」、グループID「1」であり、ファイル名はソースプログラム1のファイル名から「src.c」であり、開始行番号は「05」であり、終了行番号は「06」である。制御部110は、これらを連結し、一致部分情報DB21に記録する。また制御部110は、第08行から第10行、第11行から第12行、および第14行から第16行の各ソースコードについても同様の処理を行う。
以上の処理を経て、一致部分情報DB21には、図12に示す情報が記録される。また、制御部110は、以上の処理において一致部分検出部11として機能する。
以上の処理が終了すると、制御部110は一致部分検出処理(ステップS100)を終了し、図10に示すフローチャートに従い、次に実行単位標識検出処理(ステップS200)を開始する。
ここから、制御部110が実行する実行単位標識検出処理について、図13を参照しながら説明する。
実行単位標識検出処理の最初に、制御部110は、文法定義情報DB22から、ソースプログラム1の記述言語に対応する文法定義情報を読み込む(ステップS201)。図9に示すようにソースプログラム1はC言語で記載されているため、制御部110は、図14に示す文法定義情報DB22から、C言語に対応する文法定義情報を読み込む。
文法定義情報DB22は、図14に示すとおり、C言語に対応する文法定義情報を記録している。この文法定義情報には、関数の開始として「{」記号、関数の終了として「}」記号が定義されている。制御部110はこの文法定義情報に従い、ソースプログラム1の中で「{」を関数の開始を示す記号として、「}」を関数の終了を示す記号として扱う。
次に、制御部110は、ソースプログラム1から実行単位の開始あるいは終了を示す標識を検出する(ステップS202)。具体的には、制御部110は、図9に示されたソースプログラム1を解析し、第01行の「{」記号、および第18行の「}」記号を実行単位の開始あるいは終了を示す標識として検出する。
次に制御部110は、ステップS202で検出した実行単位の開始あるいは終了を示す標識のそれぞれについて、識別番号を付与する(ステップS203)。具体的には、制御部110は、ソースプログラム1の第01行にある「{」記号、および第18行にある「}」記号に、それぞれ実行単位標識IDとして「1」「2」を付与する。実行単位標識IDを付与する際、制御部110は、実行単位標識IDが重複しないように採番する。
次に制御部110は、ステップS202で検出した実行単位の開始あるいは終了を示す標識のそれぞれについて、実行単位標識情報を実行単位標識情報DB23に記録する(ステップS204)。実行単位標識情報は、上述したとおり実行単位標識ID、実行単位種別、開始終了属性、ファイル名、開始行番号、終了行番号からなる情報である。
具体的には、ソースプログラム1の第01行にある「{」記号は、実行単位標識ID「1」を付与されており、「関数」の「開始」を示す属性を有しており、ファイル名はソースプログラム1のファイル名から「src.c」であり、開始行番号は「01」であり、終了行番号「01」である。制御部110は、これらの情報を連結し、実行単位標識情報DB23に記録する。また制御部110は、ソースプログラム1の第18行にある「}」記号についても同様の処理を行う。
以上の処理を経て、実行単位標識情報DB23には、図15に示す情報が記録される。また、制御部110は、以上の処理において実行単位標識検出部12として機能する。
以上の処理が終了すると、制御部110は実行単位標識検出処理(ステップS200)を終了する。次に、図10に示すフローチャートに従い、制御部110は類似部分検出処理を開始する(ステップS300)。
ここから、制御部110が実行する類似部分検出処理について、図16を参照しながら説明する。
制御部110は、類似部分検出処理の最初に、一致部分の出現順による類似部分検出処理(ステップS310)を行い、一致部分情報DB21から第1のパターンの類似部分を検出する。一致部分の出現順による類似部分は、複数のタイプ1あるいはタイプ2のコードクローンと、そのコードクローンにはさまれた部分からなるものであり上述の第1のパターンの類似部分に該当する。
ここから、図17を参照し、一致部分の出現順による類似部分検出処理について説明する。
制御部110は、一致部分の出現順による類似部分検出処理の最初に、一致部分情報DB21から一致部分情報を読み出す(ステップS311)。具体的には、制御部110は、一致部分情報DB21からコードクローンID1〜4の一致部分情報を読み出す。
次に制御部110は、読み出した一致部分情報から、複数の一致部分が、間に他の一致部分を挟まずに同じ出現順番でソースプログラムに配置されているものを検出する(ステップS312)。具体的には、制御部110は、読み出したコードクローンID1〜4の一致部分情報から、コードクローンID1および2の一致部分がある部分と、コードクローンID3および4の一致部分がある部分とは、どちらもグループID1と2のコードクローンが順に現れる構造を有していることを検出する。制御部110は、コードクローンID1の一致部分から、コードクローンID2の一致部分までを、類似部分1として検出する。同様に制御部110は、コードクローンID3の一致部分からコードクローンID4の一致部分までを、類似部分2として検出する。
類似部分1は、コードクローンID1の一致部分の開始位置から開始するため、開始行番号は第05行となる。また類似部分1は、コードクローンID2のコードクローンの終了位置で終了するため、終了行番号は第10行となる。また、類似部分1は、その両端のコードクローンが、それぞれグループID「1」と「2」を有するため、一致部分リストとして「1、2」を有する。
類似部分2は、コードクローンID3の一致部分の開始位置から開始するため、開始行番号は第11行となる。また類似部分2は、コードクローンID4の一致部分の終了位置で終了するため、終了行番号は第16行となる。また、類似部分2は、その両端のコードクローンが、それぞれグループID「1」と「2」を有するため、一致部分リストとして「1、2」を有する。
以上の処理が終了すると、制御部110は一致部分の出現順による類似部分検出処理(ステップS310)を終了する。次に制御部110は、図16に示すフローに従い、一致部分の前後部分を含む類似部分検出処理を開始する(ステップS320)。
ここから、図18を参照し、一致部分の前後部分を含む類似部分検出処理について説明する。
制御部110は、一致部分の前後部分を含む類似部分検出処理の最初に、一致部分情報DB21から一致部分情報を読み出す(ステップS321)。具体的には、制御部110は、一致部分情報DB23からコードクローンID1〜4の一致部分情報を読み出す。
次に制御部110は、実行単位標識情報DB23から実行単位標識情報を読み出す(ステップS322)。具体的には、制御部110は、一致部分情報DB21から実行単位標識ID1〜2の実行単位標識情報を読み出す。
次に制御部110は、読み出した各一致部分の前部分を検出する(ステップS323)。一致部分の前部分とは、ソースコード上にある所定の区切り部分からその一致部分の開始行までの部分のことをいう。ここで所定の区切り部分とは、(1)その一致部分直前の他の一致部分の終了行、あるいは(2)その一致部分直前の実行単位の開始あるいは終了を示すコードのある行を指し、制御部110は(1)(2)のうち後にある方からその一致部分の開始行までの部分を前部分として抽出する。
具体的には、制御部110は、一致部分情報DB21から読み出したコードクローンID1の一致部分について、(1)その直前には他の一致部分がないこと、および(2)その直前の実行単位の開始あるいは終了を示すコードは、第01行の「{」であることを検出する。(1)では他の一致部分を検出できなかったため、制御部110は(2)の検出に基づいて前部分を判別する。その結果、制御部110はコードクローンID1のコードクローンの前部分として、第02行(記号「{」がある行の次行)から第04行まで(その一致部分開始行の前行)を検出する。
同様に制御部110は、コードクローンID2の一致部分についても前部分を検出する。この場合、制御部110は、(1)コードクローンID2の一致部分の直前の一致部分はコードクローンID1の一致部分であり、その終了行は第06行であること、(2)コードクローンID2の一致部分の直前の実行単位の開始あるいは終了を示すコードは、第01行の「{」であることを検出する。この結果、制御部110は(1)で検出した第06行のほうが後にあるため、(1)の検出に基づいて前部分を抽出する。従って、制御部110は、コードクローンID2の一致部分の前部分として、第07行(直前コードクローンの終了行の次行)から第07行まで(そのコードクローン開始行の前行)を検出する。
続いて制御部110は、コードクローンID3の一致部分についても前部分を検出する。この場合、制御部110は、(1)コードクローンID3の一致部分の直前の他の一致部分はコードクローンID2の一致部分であり、その終了行は第10行であること、(2)コードクローンID2の一致部分の直前の実行単位の開始あるいは終了を示すコードは、第01行の「{」であることを検出する。この結果、制御部110は(1)で検出した第10行のほうが後にあるため、(1)の検出に基づいて前部分を検出する。
ここで、制御部110は、(1)に基づいて検出した所定の区切り部分が、コードクローンID3の一致部分の開始行(第11行)の前行であることを検出する。その結果、制御部110は、コードクローンID3の一致部分は前部分を持たないと検出する。
続いて制御部110は、コードクローンID4の一致部分についても前部分を検出する。上記同様の処理により、制御部110は、コードクローンID4の一致部分の前部分として、第13行(直前の一致部分の終了行の次行)から第13行まで(その一致部分開始行の前行)を検出する。
次に制御部110は、読み出した各一致部分の後部分を検出する(ステップS324)。一致部分の後部分とは、その一致部分の終了行から、ソースコード上にある所定の区切り部分までの部分のことをいう。ここで所定の区切り部分とは、(1)その一致部分直後の他の一致部分の開始行、あるいは(2)その一致部分直後の実行単位の開始あるいは終了を示すコードのある行を指し、制御部110はその一致部分の終了行から(1)(2)のうち前にある方までの部分を後部分として検出する。
具体的には、制御部110は、一致部分情報DB21から読み出したコードクローンID1のコードクローンについて、(1)コードクローンID1の一致部分の直後の一致部分はコードクローンID2の一致部分であり、その開始行は第08行であること、(2)コードクローンID1の一致部分の直後の実行単位の開始あるいは終了を示すコードは、第18行の「}」であることを検出する。この結果、制御部110は(1)で検出した第08行のほうが前にあるため、(1)の検出に基づいて後部分を抽出する。従って、制御部110は、コードクローンID1の一致部分の後部分として、第07行(その一致部分終了行の次行)から第07行まで(直後にある他の一致部分開始行の前行)を検出する。
続いて制御部110は、同様の処理によりコードクローンID2〜4の一致部分について後部分を検出する。制御部110は、コードクローンID2の一致部分は後部分を持たないと検出する。また制御部110は、コードクローンID3の一致部分の後部分は第13行から第13行まで、コードクローンID4の一致部分の後部分は第17行から第17行までと検出する。
次に制御部110は、読み出した各一致部分に基づいて、検出した前部分、一致部分、検出した後部分から構成される部分を類似部分として検出する(ステップS325)。
具体的には、制御部110は、コードクローンID1の一致部分に基づいて、前部分(第02行から第04行)、一致部分(第05行から第06行)、後部分(第07行から第07行)を連結し、類似部分3として検出する。類似部分3は、開始行番号は第02行であり、終了行番号は第07行である。また、類似部分3は、グループID「1」を有する一致部分に基づいて検出されており、一致部分リストとして「1」を有する。
同様にコードクローンID2〜4に基づき、類似部分4〜6を検出する。ただし、コードクローンID2の一致部分は後部分を有さず、またコードクローンID3の一致部分は前部分を有さないため、それぞれ一致部分自身の終了行、開始行が類似部分の終了行、開始行となる。この結果、制御部110は、類似部分4(第07行から第10行まで、一致部分リストは「2」)、類似部分5(第11行から第13行まで、一致部分リストは「1」)、類似部分6(第13行から第17行まで、一致部分リストは「2」)を検出する。
次に制御部110は、図16に示すとおり、ステップS310およびステップS320で検出した各類似部分について、識別番号を付与する(ステップS330)。具体的には、制御部110は類似部分(類似部分1〜6)に、類似部分IDおよび類似部分グループIDを付与する。
類似部分IDを付与する際、制御部110は、検出した類似部分間で類似部分IDが重複しないように採番する。本実施例においては、制御部110は、類似部分1に類似部分ID「1」を付与し、以降類似部分6まで順に類似部分IDを付与する。
また類似部分グループIDを付与する際、制御部110は、同一のグループIDを有するコードクローンに基づいて、同一のステップ(ステップS310またはステップS320)で検出された類似部分は同一の類似部分グループIDを有するように採番する。ステップS310で制御部110が検出した類似部分はすべて第1のパターンの類似部分であり、すべて同一のパターンで検出されたものである。同様に、ステップS320で制御部110が検出した類似部分はすべて第2のパターンの類似部分であり、同一のパターンで検出されたものである。
具体的には、上記ステップS310において、類似部分1と2が、同一のグループID(1および2)を有するコードクローンから検出されているため、制御部110は、類似部分1と2に同一の類似部分グループID「1」を付与する。また上記ステップS320において、類似部分3と5が、同一のグループID「1」を有するコードクローンから検出されているため、制御部110は、類似部分3と5に同一の類似部分グループID「2」を付与する。同様に制御部110は、類似部分4と6に同一の類似部分グループID「3」を付与する。
次に制御部110は、図16に示すとおり、各類似部分に基づいて類似部分情報を生成し、類似部分情報DB24に記録する(ステップS340)。
具体的には、制御部110は、ステップS310で検出した類似部分1に基づいて、類似部分情報(類似部分ID「1」、類似部分グループID「1」、ファイル名「src.c」、開始行番号「05」、終了行番号「10」、一致部分リストとして「1、2」を記録する。同様に制御部110は、類似部分2〜6についても類似部分情報DB24に記録する。
以上の処理を経て、類似部分情報DB24には、図19に示す情報が記録される。また、制御部110は、以上の処理において類似部分検出部13として機能する。
以上の処理が終了すると、制御部110は図10に示す類似部分検出処理(ステップS300)を終了する。次に、図10に示すフローチャートに従い、制御部110は非一致構造分析処理(ステップS400)を開始する。
ここから、非一致構造分析処理について、図20を参照しながら説明する。
図20に示す非一致構造分析処理の最初に、制御部110は、類似部分情報DB24に格納されている類似部分の中から、同じ類似部分グループIDを持つ類似部分を取得する(ステップS401)。以降では、類似部分グループIDとして「1」を有する類似部分(類似部分1および2)を例として説明する。
次に制御部110は、同一の類似部分グループIDを有する各類似部分が含む非一致部分を特定し、そのプログラム記述を前記ソースプログラム1から読み出す(ステップS402)。具体的には、制御部110は、類似部分1に関する類似部分情報を類似部分DB24から読み出し、開始行番号が第05行、終了行番号が第10行であることを読み出す。また制御部110は、類似部分1の一致部分リストが「1、2」であることから、ソースプログラム1の第05行から第10行までのソースコードのうち、コードクローンID1のコードクローンに該当する部分(第05行から第06行)、およびコードクローンID2のコードクローンに該当する部分(第08行から第10行)、を除いた部分を抽出する。すなわち、制御部110は、ソースプログラム1の第07行を、類似部分1における非一致部分として特定し、抽出する。
同様に制御部110は、ソースプログラム1の第13行を、類似部分2における非一致部分として特定し、抽出する。
次に制御部110は、ステップS402で特定した非一致部分の構文を解析し、構文構造を取得する(ステップS403)。具体的には、制御部110は、類似部分1の非一致部分(第07行)のプログラム記述をソースプログラム1から読み出し、文法定義情報DB22に格納されている文法定義情報に基づいて構文を解析する。本例では、上述したLR法によりソースプログラム1の第07行を構文解析する。ソースプログラム1の第07行には、変数(c)、代入演算子(=)、数値(30)を順に接続した式が記載されている。この式を構文木構造に基づいて解析することにより、制御部110は、図21(a)に示す構文構造を取得する。
また同様に、制御部110は、類似部分2の非一致部分(第13行)より、ソースプログラム1の第13行を構文解析する。ソースプログラム1の第13行には、変数(c)、代入演算子(=)、変数(a)、演算子(+)、変数(b)、演算子(+)、変数(c)を順に接続した式が記載されている。この式を構文木構造に基づいて解析することにより、制御部110は、図21(b)に示す構文構造を取得する。
次に制御部110は、同一類似部分グループIDを有する類似部分間で、ステップS403で取得した構文構造を比較する(ステップS404)。具体的には、制御部110は、同一類似部分IDを有する類似部分1および2の非一致部分の構文構造(図21(a)、(b))を比較し、両者が共通に有する構文構造(以下、非一致部分共通構文構造と表記)を抽出する。
制御部110は、両者の構文構造を構文木の上部から順にたどることにより比較する。制御部110は、両者において代入演算子(=)およびその左辺(変数(c))は共通するが、その右辺は違う構造を有することを識別し、かつ、その右辺は「式」として共通する性質を有すると識別する。その結果、制御部110は、図21(c)に示すとおり、変数(c)、代入演算子(=)、式を順に接続した構文構造を非一致部分共通構文構造として抽出する。
次に制御部110は、各類似部分の非一致部分の構文構造と、ステップS404で抽出した非一致部分共通構文構造とを比較し、構文類似度を算出する(ステップS405)。具体的には、制御部110は、類似部分1および2の各非一致部分の構文構造と、非一致部分共通構文構造とを比較し、どれだけのノードが一致するかを示す構文類似度を算出する。
制御部110は、図21(a)に示す類似部分1の非一致部分の構文構造と図21(c)に示す非一致部分共通構文構造とを比較する。その結果、制御部110は、非一致部分の構文構造が有する3ノードのうち、代入演算子(=)のノードと、変数(c)のノードとは非一致部分共通構文構造と一致し、数値(30)のノードも非一致部分共通構文構造のノード(「式」)と一致することを検出する。非一致部分の構文構造が有する3ノードのうち、3ノードが一致することから、制御部110は、類似部分1の構文類似度を3/3=100%と算出する。
同様に制御部110は、類似部分2の非一致部分の構文構造と非一致部分共通構文構造とを比較する。その結果、制御部110は、非一致部分の構文構造が有する7ノードのうち、3ノードが一致することから、制御部110は、類似部分1の構文類似度を3/7=42.8%と算出する。
次に制御部110は、非一致構造情報を生成し、非一致構造情報DB25に記録する(ステップS406)。制御部110は、上述したステップS401からステップS405までの過程で検出した情報から、類似部分ID、類似部分グループID、非一致部分の構文構造、非一致部分共通構文構造、構文類似度を抽出し、非一致構造情報として非一致構造情報DB25に記録する。制御部110は、非一致部分の構文構造および非一致部分共通構文構造を、構文の階層構造を示すバイナリデータとして記録する。
制御部110は、類似部分1について、類似部分ID「1」、類似部分グループID「1」、非一致部分の構文構造の情報(図21(a)に示す構文の階層構造を示すバイナリデータ)、非一致部分共通構文構造の情報(図21(c)に示す構文の階層構造を示すバイナリデータ)、構文類似度「100%」からなる非一致構造情報を生成し、非一致構造情報DB25に記録する。同様に、類似部分2についても、非一致構造情報を生成し、非一致構造情報DB25に記録する。この結果、非一致構造情報DB25には、図22に示す非一致構造情報が記録される。
制御部110は、以上のステップS401からS406までの処理を、類似部分3〜6についても同様に実施する。その結果、抽出された6つの類似部分に対応する非一致構造情報が、非一致構造情報DB25に記録される。
以上の処理の結果、非一致構造情報DB25に非一致構造情報が記録される。また、制御部110は、以上の処理において類似部分検出部13として機能する。
制御部110は、ステップS406の処理を完了すると、図20に示す非一致構造分析処理を完了する。制御部110は、非一致構造分析処理を完了すると、図10に示すソースプログラム解析処理を完了する。
以上に示したとおり、制御部110は、入力されたソースプログラム1にあるタイプ3のコードクローンを、類似部分として非一致構造情報DB25に記録する。従って操作者は、非一致構造情報DB25のデータを閲覧することにより、ソースプログラム1のどこにタイプ3のコードクローンがあるかを知ることができる。
また、制御部110は、各類似部分の構文類似度を非一致構造情報DB25に記録する。この構文類似度は、プログラムを保守する観点で重要となる構造的、構文的な類似性を数値化したものである。従って、操作者は、構文類似度を参照することにより、プログラムを修正する上での作業量や所要時間を見積もることができる。
以上のとおり、本発明によれば、ソースプログラムからタイプ3のコードクローンを検出し、そのプログラムの修正コストを算出するために有効な情報を出力するソースプログラム解析システムを実現できる。
上記の処理によって得られた構文類似度を参照することにより、例えばシステムの移行にあたって提案された移行方法の作業量や所要時間を見積もることが可能となり、移行方法を評価することができる。また、既存システムのソースコードのリファクタリングにおいて、必要な箇所を特定し作業量を見積もることができる。
以上、本発明の実施形態について説明したが、本発明の実施形態はこれに限定されない。
本実施形態では、制御部110は一致部分検出処理を行う際、非特許文献2が開示するソフトウェアであるCCfinderXにより一致部分を検出したが、これに限定されない。ソースプログラムから、タイプ1あるいは2のコードクローンを検出することができるソフトウェアであれば、任意のものによって一致部分検出処理を行うことができる。
類似部分検出部13は、ステップS311において、複数の一致部分が、間に他の一致部分を挟まずに同じ出現順番でソースプログラムに配置されているものを類似部分として検出している。しかし、類似部分検出部13は、間に他の一致部分を挟んで同じ出現順番でソースプログラムに配置されているものも、類似部分として検出してもよい。このようにした場合、例えば上述の実施形態では、コードクローンID1の一致部分からコードクローンID4の一致部分までを、類似部分グループID1の類似部分として検出する。
本実施形態においては、ソースプログラム解析システム100は、ソースプログラム1を行単位に解析した。しかし、解析する単位は行に限定されず、改行コードとは異なるコードにより区分けされた部分ごとに一致部分を検出してもよい。例えば、単語あるいは文字ごとに解析するようにしてもよい。
本実施形態においては、類似部分検出部13は、類似部分として第1のパターンおよび第2のパターンの類似部分を検出した。これに限られず、類似部分検出部13は、第1のパターンの類似部分のみを検出してもよいし、第2のパターンの類似部分のみを検出してもよい。また、他のスキームによって類似部分を検出してもよい。
本実施形態においては、一致部分検出部11は一致部分情報を一致部分情報DB21に記録し、類似部分検出部13は、一致部分情報DB21から一致部分情報を読み出した。しかし、必ずしも一旦データベースに一致部分情報を記録するものでなくともよく、一致部分検出部11は直に類似部分検出部13へ一致部分情報を供給してもよい。また、本実施形態において一致部分情報DB21は記憶部120に存在するが、記憶部120上に限られず、例えば制御部110のRAMに存在するものであってもよいし、またネットワークを介してアクセス可能な他機器に存在するものであってもよい。
同様のことは、他のDB(文法定義情報DB22、実行単位標識情報DB23、類似部分情報DB24、非一致構造情報DB25)にも当てはまる。すなわち、各DBが存在する場所は任意であり、また各情報が、当該情報を必要とする機能部あるいは操作者に伝わるのであればDBとして存在する必要はない。
また、各DBのフォーマットは任意であり、一般的なファイルでも、データベース構造を有するデータセット等でも実現することができる。
本発明の特徴は、ソースプログラムから内容が互いに一致する一致部分を検出すること、検出された一致部分に基づいてソースプログラムに存在する類似部分を検出すること、検出された類似部分にある非一致部分の類似性を示す指標を出力することにある。本発明の対象はソースプログラムに限られず、以下のような応用も可能である。
すなわち、本発明のソースプログラム解析システムにより、例えば提出された課題の論文等における類似部分とその類似度を取得することができる。これにより、提出者間でのテキストのコピーの有無を判断する材料とすることも可能である。
本発明の実施形態にかかるソースプログラム解析システムは、専用のシステムによらず、通常のコンピュータシステムを用いても実現可能である。例えば、コンピュータに、上記動作を実行するためのプログラムを、フレキシブルディスク、CD−ROM(Compact Disk-Read Only Memory)、DVD(Digital Versatile Disk)、MO(Magnet Optical Disk)などのコンピュータ読み取り可能な記憶媒体に記憶して配布し、これをコンピュータシステムにインストールすることにより、上述の処理を実行するソースプログラム解析システムを構成しても良い。さらに、インターネット上のサーバ装置が有するディスク装置等にプログラムを記憶しておき、例えば、搬送波に重畳させて、コンピュータにダウンロード等するものとしてもよい。
本願発明の実施形態にかかるソースプログラム解析システム100は、図23に示すように、一致部分検出部11、類似部分検出部13、非一致部分分析部14から構成されうるものである。
一致部分検出部11は、ソースプログラム1から内容が互いに一致する一致部分を検出する。
類似部分検出部13は、一致部分検出部11が検出した一致部分に基づいて、ソースプログラム1から内容が互いに一致する部分と一致しない部分とで構成される類似部分を検出する。
非一致部分分析部14は、類似部分検出部13が検出した類似部分の一致しない部分の構文を分析し、他の類似部分とどれだけ類似しているかを示す指標を分析結果2として出力する。
操作者は、非一致部分分析部14が生成した分析結果2により、ソースプログラム1にある文の挿入や削除、変更が施されているコードクローンの位置や数、構文類似度を知ることができる。すなわち、操作者は、ソースプログラム1の修正コストを算出するために有効な情報を得ることができる。
このように、上記の構成により、本発明の課題は達成され、また、本願発明の効果が奏される。
なお、上記の実施例の一部または全部は、以下の付記のようにも記載されうるが、以下には限られない。
(付記1)
ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出手段と、
前記一致部分検出手段が検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成され、かつ、基準に合致する類似部分を検出する類似部分検出手段と、
前記類似部分検出手段が検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析手段と、を備える、
ことを特徴とするソースプログラム解析システム。
(付記2)
前記類似部分検出手段は、前記一致部分検出手段が検出した一致部分から、間に他の一致部分を挟まずに同じ出現順番で配置されている複数の一致部分を検出し、当該複数の一致部分と、当該複数の一致部分にはさまれた一致しない部分とで構成される類似部分を検出する、
ことを特徴とする付記1に記載のソースプログラム解析システム。
(付記3)
前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分の構文が、他の類似部分の一致しない部分の構文とどれだけ類似しているかを示す構文類似度を算出する、
ことを特徴とする付記1または2に記載のソースプログラム解析システム。
(付記4)
前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分を構成要素に分割し、当該構成要素のうち他の類似部分の一致しない部分と共通する構成要素の割合から構文類似度を算出する、
ことを特徴とする付記3に記載のソースプログラム解析システム。
(付記5)
前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分を構成要素に分割し、他の類似部分の一致しない部分と共通する構成要素の構文構造を出力する、
ことを特徴とする付記3または4に記載のソースプログラム解析システム。
(付記6)
前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分を構文木構造に基づいて分析することにより、構成要素ごとに分割し、あるいは他の類似部分の一致しない部分と共通する構成要素の構文構造を出力する、
ことを特徴とする付記4または5に記載のソースプログラム解析システム。
(付記7)
ソースプログラムから、実行単位の開始あるいは終了を示す標識を検出する実行単位標識検出手段をさらに備え、
前記類似部分検出手段は、前記一致部分検出手段が検出した一致部分の直前にある実行単位標識検出手段が検出した第1の標識および当該一致部分の直後にある実行単位標識検出手段が検出した第2の標識を検出し、
前記類似部分検出手段は、前記ソースプログラムにおける前記第1の標識の終了位置と、前記一致部分の直前にある他の一致部分の終了位置とのうち後にある方から前記一致部分の開始位置までの部分を前部分として抽出し、かつ、前記一致部分の終了位置から前記ソースプログラムにおける前記第2の標識の開始位置と、前記一致部分の直後にある他の一致部分の開始位置とのうち前にある方までの部分を後部分として抽出し、
前記類似部分検出手段は、前記前部分と、前記一致部分と、前記後部分とを有する類似部分を検出する、
ことを特徴とする付記1から6のいずれか1つに記載のソースプログラム解析システム。
(付記8)
前記類似部分検出手段は、前記前部分と前記一致部分とを有する類似部分、および前記一致部分と前記後部分とを有する類似部分を検出する、
ことを特徴とする付記7に記載のソースプログラム解析システム。
(付記9)
ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出ステップと、
前記一致部分検出ステップで検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成され、かつ、基準に合致する類似部分を検出する類似部分検出ステップと、
前記類似部分検出ステップで検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析ステップと、を備える、
ことを特徴とするソースプログラム解析方法。
(付記10)
コンピュータに、
ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出機能、
前記一致部分検出機能が検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成される所定の基準を満たす類似部分を検出する類似部分検出機能、
前記類似部分検出機能が検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析機能、を実現させる、
ことを特徴とするプログラム。
1:ソースプログラム
2:分析結果
11:一致部分検出部
12:実行単位標識検出部
13:類似部分検出部
14:非一致部分分析部
21:一致部分情報DB
22:文法定義情報DB
23:実行単位標識情報DB
24:類似部分情報DB
25:非一致構造情報DB
100:ソースプログラム解析システム

Claims (10)

  1. ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出手段と、
    前記一致部分検出手段が検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成され、かつ、基準に合致する類似部分を検出する類似部分検出手段と、
    前記類似部分検出手段が検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析手段と、を備える、
    ことを特徴とするソースプログラム解析システム。
  2. 前記類似部分検出手段は、前記一致部分検出手段が検出した一致部分から、間に他の一致部分を挟まずに同じ出現順番で配置されている複数の一致部分を検出し、当該複数の一致部分と、当該複数の一致部分にはさまれた一致しない部分とで構成される類似部分を検出する、
    ことを特徴とする請求項1に記載のソースプログラム解析システム。
  3. 前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分の構文が、他の類似部分の一致しない部分の構文とどれだけ類似しているかを示す構文類似度を算出する、
    ことを特徴とする請求項1または2に記載のソースプログラム解析システム。
  4. 前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分を構成要素に分割し、当該構成要素のうち他の類似部分の一致しない部分と共通する構成要素の割合から構文類似度を算出する、
    ことを特徴とする請求項3に記載のソースプログラム解析システム。
  5. 前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分を構成要素に分割し、他の類似部分の一致しない部分と共通する構成要素の構文構造を出力する、
    ことを特徴とする請求項3または4に記載のソースプログラム解析システム。
  6. 前記非一致部分分析手段は、前記類似部分検出手段が検出した類似部分の一致しない部分を構文木構造に基づいて分析することにより、構成要素ごとに分割し、あるいは他の類似部分の一致しない部分と共通する構成要素の構文構造を出力する、
    ことを特徴とする請求項4または5に記載のソースプログラム解析システム。
  7. ソースプログラムから、実行単位の開始あるいは終了を示す標識を検出する実行単位標識検出手段をさらに備え、
    前記類似部分検出手段は、前記一致部分検出手段が検出した一致部分の直前にある実行単位標識検出手段が検出した第1の標識および当該一致部分の直後にある実行単位標識検出手段が検出した第2の標識を検出し、
    前記類似部分検出手段は、前記ソースプログラムにおける前記第1の標識の終了位置と、前記一致部分の直前にある他の一致部分の終了位置とのうち後にある方から前記一致部分の開始位置までの部分を前部分として抽出し、かつ、前記一致部分の終了位置から前記ソースプログラムにおける前記第2の標識の開始位置と、前記一致部分の直後にある他の一致部分の開始位置とのうち前にある方までの部分を後部分として抽出し、
    前記類似部分検出手段は、前記前部分と、前記一致部分と、前記後部分とを有する類似部分を検出する、
    ことを特徴とする請求項1から6のいずれか1項に記載のソースプログラム解析システム。
  8. 前記類似部分検出手段は、前記前部分と前記一致部分とを有する類似部分、および前記一致部分と前記後部分とを有する類似部分を検出する、
    ことを特徴とする請求項7に記載のソースプログラム解析システム。
  9. ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出ステップと、
    前記一致部分検出ステップで検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成され、かつ、基準に合致する類似部分を検出する類似部分検出ステップと、
    前記類似部分検出ステップで検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析ステップと、を備える、
    ことを特徴とするソースプログラム解析方法。
  10. コンピュータに、
    ソースプログラムから、内容が互いに一致する一致部分を検出する一致部分検出機能、
    前記一致部分検出機能が検出した一致部分に基づいて、ソースプログラムから内容が互いに一致する部分と一致しない部分とで構成される所定の基準を満たす類似部分を検出する類似部分検出機能、
    前記類似部分検出機能が検出した類似部分を分析し、他の類似部分とどれだけ類似しているかを示す指標を出力する非一致部分分析機能、を実現させる、
    ことを特徴とするプログラム。
JP2013074623A 2013-03-29 2013-03-29 ソースプログラム解析システム、ソースプログラム解析方法およびプログラム Active JP6090850B2 (ja)

Priority Applications (4)

Application Number Priority Date Filing Date Title
JP2013074623A JP6090850B2 (ja) 2013-03-29 2013-03-29 ソースプログラム解析システム、ソースプログラム解析方法およびプログラム
CN201480019304.0A CN105122208A (zh) 2013-03-29 2014-03-24 源程序分析系统、源程序分析方法和记录有程序的非瞬时记录介质
PCT/JP2014/058021 WO2014157056A1 (ja) 2013-03-29 2014-03-24 ソースプログラム解析システム、ソースプログラム解析方法およびプログラムを記録した記録媒体
US14/781,122 US9880834B2 (en) 2013-03-29 2014-03-24 Source program analysis system, source program analysis method, and recording medium on which program is recorded

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013074623A JP6090850B2 (ja) 2013-03-29 2013-03-29 ソースプログラム解析システム、ソースプログラム解析方法およびプログラム

Publications (2)

Publication Number Publication Date
JP2014199569A true JP2014199569A (ja) 2014-10-23
JP6090850B2 JP6090850B2 (ja) 2017-03-08

Family

ID=51624030

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013074623A Active JP6090850B2 (ja) 2013-03-29 2013-03-29 ソースプログラム解析システム、ソースプログラム解析方法およびプログラム

Country Status (4)

Country Link
US (1) US9880834B2 (ja)
JP (1) JP6090850B2 (ja)
CN (1) CN105122208A (ja)
WO (1) WO2014157056A1 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2017010476A (ja) * 2015-06-26 2017-01-12 三菱電機株式会社 類似判定装置、類似判定方法及び類似判定プログラム
JP6439623B2 (ja) * 2015-08-05 2018-12-19 富士通株式会社 計算機、動作周波数決定プログラム及び動作周波数決定方法
US10725763B1 (en) * 2017-06-28 2020-07-28 Amazon Technologies, Inc. Update and rollback of configurations in a cloud-based architecture
US10565470B2 (en) 2017-12-15 2020-02-18 International Business Machines Corporation System, method and recording medium for user interface (UI)-level clone detection
US11099842B2 (en) 2019-01-08 2021-08-24 Saudi Arabian Oil Company Source code similarity detection using digital fingerprints
US11237805B2 (en) * 2019-07-09 2022-02-01 Disney Enterprises, Inc. Techniques for automatically detecting programming deficiencies
WO2021039110A1 (ja) * 2019-08-28 2021-03-04 三菱電機株式会社 改善提案装置、および、改善提案方法
US11416245B2 (en) * 2019-12-04 2022-08-16 At&T Intellectual Property I, L.P. System and method for syntax comparison and analysis of software code
US20220222165A1 (en) * 2021-01-12 2022-07-14 Microsoft Technology Licensing, Llc. Performance bug detection and code recommendation

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003216425A (ja) * 2002-01-24 2003-07-31 Japan Science & Technology Corp 類似度計測システム
JP2006018693A (ja) * 2004-07-02 2006-01-19 Fujitsu Ltd 類似ソースコード抽出プログラム、類似ソースコード抽出装置および類似ソースコード抽出方法
US20110246968A1 (en) * 2010-04-01 2011-10-06 Microsoft Corporation Code-Clone Detection and Analysis

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8627290B2 (en) * 2009-02-03 2014-01-07 International Business Machines Corporation Test case pattern matching
WO2012031165A2 (en) * 2010-09-02 2012-03-08 Zaretsky, Howard System and method of cost oriented software profiling
US20120159434A1 (en) * 2010-12-20 2012-06-21 Microsoft Corporation Code clone notification and architectural change visualization
JP5564448B2 (ja) 2011-02-08 2014-07-30 株式会社日立製作所 ソフトウェアの類似性評価方法
US20120272207A1 (en) * 2011-04-20 2012-10-25 Sony Computer Entertainment America Llc Social interactive code development
US9201649B2 (en) * 2012-10-26 2015-12-01 Inforsys Limited Systems and methods for estimating an impact of changing a source file in a software
EP2801906B1 (en) * 2013-05-08 2017-01-11 Accenture Global Services Limited Source code flow analysis using information retrieval

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003216425A (ja) * 2002-01-24 2003-07-31 Japan Science & Technology Corp 類似度計測システム
JP2006018693A (ja) * 2004-07-02 2006-01-19 Fujitsu Ltd 類似ソースコード抽出プログラム、類似ソースコード抽出装置および類似ソースコード抽出方法
US20110246968A1 (en) * 2010-04-01 2011-10-06 Microsoft Corporation Code-Clone Detection and Analysis

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
JPN6013064691; 肥後 芳樹,楠本 真二,井上 克郎: 'コードクローン検出とその関連技術' 電子情報通信学会論文誌 Vol.J91-D,No.6, 20080601, pp.1465-1481, 社団法人電子情報通信学会 *
JPN6014022578; Yasushi UEDA, Toshihiro KAMIYA, Shinji KUSUMOTO and Katsuro INOUE: 'On Detection of Gapped Code Clones using Gap Locations' Proceedings of the Ninth Asia-Pacific Software Engineering Conference (APSEC'02) , 20021206, pp.327-336, IEEE *

Also Published As

Publication number Publication date
US20160054994A1 (en) 2016-02-25
US9880834B2 (en) 2018-01-30
WO2014157056A1 (ja) 2014-10-02
CN105122208A (zh) 2015-12-02
JP6090850B2 (ja) 2017-03-08

Similar Documents

Publication Publication Date Title
JP6090850B2 (ja) ソースプログラム解析システム、ソースプログラム解析方法およびプログラム
KR101961970B1 (ko) 실행 페이지의 동적 갱신 기법
JP5756386B2 (ja) 動的なウェブ・アプリケーションの問題を修正するメタデータの生成・管理の支援方法、装置、およびプログラム
US20130204874A1 (en) Hyper Adapter and Method for Accessing Documents in a Document Base
CN109359026A (zh) 日志上报方法、装置、电子设备及计算机可读存储介质
CN102193810A (zh) 模块间内联候选标识
JP6866551B2 (ja) 数式処理方法、装置、デバイス及びプログラム
KR20140038469A (ko) 소스 코드를 실행 요소에 링크시키는 기법
CN111797351A (zh) 页面数据管理方法、装置、电子设备及介质
CN114020256A (zh) 前端页面生成方法、装置、设备及可读存储介质
CN115048111B (zh) 基于元数据的代码生成方法、装置、设备及介质
Bender et al. Signature required: Making Simulink data flow and interfaces explicit
CN110889013A (zh) 一种基于xml的数据关联方法、装置、服务器及存储介质
US20080005662A1 (en) Server Device and Name Space Issuing Method
US20150161090A1 (en) Analyzing document content and generating an appendix
CN113704343A (zh) 一种数据治理中的数据血缘可视化实现方法及系统
JP4954674B2 (ja) ソフトウェア開発支援方法、ソフトウェア開発支援装置、ソフトウェア開発支援プログラム、及び計算機システム
Yano et al. Labeling feature-oriented software clusters for software visualization application
CN110989991A (zh) 检测应用程序中源代码克隆开源软件的方法及系统
WO2022134820A1 (zh) 网页的数据抽取方法、装置、电子设备及存储介质
US8239362B1 (en) Using metadata fragments as authoritative manufacturing work instructions
CN114385167A (zh) 前端页面生成方法、装置、设备及介质
CN111209075B (zh) 多语言界面维护方法、系统、存储介质和智能设备
CN110309062A (zh) 用例生成方法、装置、电子设备及存储介质
Benis et al. Building pathway graphs from BioPAX data in R

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160204

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160927

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20161121

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170202

R150 Certificate of patent or registration of utility model

Ref document number: 6090850

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150