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

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

Info

Publication number
JP2011096082A
JP2011096082A JP2009250678A JP2009250678A JP2011096082A JP 2011096082 A JP2011096082 A JP 2011096082A JP 2009250678 A JP2009250678 A JP 2009250678A JP 2009250678 A JP2009250678 A JP 2009250678A JP 2011096082 A JP2011096082 A JP 2011096082A
Authority
JP
Japan
Prior art keywords
program
program code
token
template
analysis
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
JP2009250678A
Other languages
English (en)
Other versions
JP5342407B2 (ja
Inventor
Shinichi Yokomizo
真一 横溝
Takayuki Takezawa
隆之 武澤
Noboru Sato
昇 佐藤
Ko Makiguchi
航 巻口
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.)
Hitachi Ltd
Original Assignee
Hitachi 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 Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2009250678A priority Critical patent/JP5342407B2/ja
Publication of JP2011096082A publication Critical patent/JP2011096082A/ja
Application granted granted Critical
Publication of JP5342407B2 publication Critical patent/JP5342407B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)

Abstract

【課題】クローンの系統を正確に表示することを目的とする。
【解決手段】プログラム解析装置は、記述形式が異なるが、同一の関数とみなせる関数を登録した関数辞書と、関数で使用されている変数の種類を登録したメモリアクセス辞書と、を記憶部に記憶しており、解析対象である複数のプログラムコードをトークンに分解する字句解析を行い、テンプレートと、字句解析の結果と、関数辞書と、メモリアクセス辞書と、を参照し、同一の関数とみなされたトークンの出現位置にプロットを行ったクローン解析図を作成し(S2)、クローン解析図を基に、テンプレートおよびプログラムコード間の親子関係を導出し(S3)、親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させる(S4)ことを特徴とする。
【選択図】図2

Description

本発明は、プログラム解析方法、プログラム解析プログラムおよびプログラム解析装置の技術に関する。
大量のプログラムコードから構成される大規模なプログラムシステムでは、制御対象設備の増減、さらには、ユーザからの要求事項実現のために、過去の信頼性の高いプログラムシステムを流用し、このプログラムシステムのプログラムコードに若干の改造、加筆修正などを施すことで、新しいプログラムシステムを開発するケースが多い。この開発手法を採用することは、実績あるプログラムシステムAを流用し、プログラムシステムBを新たに開発することになる。このような場合、これら2つのプログラムシステムは巨大なクローンとなる。
また、大規模なプログラムシステムA中でも、プログラムコード中に何度もあらわれる類似したプログラムコードが存在する場合が多い。このような、1つのプログラムシステムに現れるプログラムコードもクローンと呼ばれる。これは、プログラムコードを複製(コピー)、貼り付け(ペースト)することによって生じるものである。このような開発手法にて実現された大規模なプログラムシステムは、類似したプログラムコード(クローン)が多数存在し理解・解読性を著しく悪化させる原因となる。
例えば、専用のプログラムを搭載しているハードウェアが旧式となったため、新しいハードウェアと交換する場合、搭載されているプログラムも旧式であるため、新しいアーキテクチャのプログラムを開発する必要がある。このような場合、旧式のプログラムを流用して、新しいプログラムを開発することが、しばしば行われるが、グローバル変数の扱いの違いなどが原因でバグが生じたりすることがある。
プログラムの維持・保守においては、プログラムコード中のある箇所に不具合が発見され修正された場合、その箇所と類似している箇所についても同様の修正が必要であるかどうかの検討が必要となる。しかし、多くの場合はそれらプログラムコードに対して、大なり小なり修正が施されており、単純な文字列検索などでは、大量のプログラムコード中のどこにどれくらいそうした箇所が存在するのかを網羅的に把握することは困難である。
さらに、多くの社会インフラを支える制御システムは絶対品質を要求されるため、ハードウェアは耐寿命・耐環境・信頼性の高い装置から構成される場合が多い。このため、このようなハードウェアに搭載されているプログラムシステムについても、10年以上保守・改造が行われているプログラムシステムも数多く存在する。しかし近年、特殊なハードウェアにおいて10年以上稼動しているプログラムシステムも、半導体・ハードディスクなどの交換部品の調達が困難となりつつあるため、オープン系ハードウェアへ移行する開発を要求される場合が多くなっている。この場合においても、プログラムコード中に何度もあらわれる類似したコードは、前記した理由で開発効率・信頼性を阻害する要因となり問題となる。
また、プログラムシステムを他のシステムに移行する場合においては、レガシシステムの開発順番のとおりの更新順番となる保証がないため、どちらがクローンであるかが不明となってしまうケースもある。
このような場合は、更新システムを構成するプログラムコードだけを対象にプログラムコードのクローン解析を行うのではなく、過去のプログラムシステムにおける開発経緯や、履歴や、変遷を明らかにした上でのクローン関係を明らかにしなければ、やはり、開発効率や、信頼性を阻害する要因を引き起こし問題となる。
このような、既存のプログラムコードクローンを解析するソフトウェアとして、CCFinderが開示されている(例えば、非特許文献1参照)。CCFinderでは、プログラムコードにおいて字句解析を実施して、トークン列化し特定の文字列に変更する処理を実施した上で照合が実施されるもので、プログラムコードで変数名・呼び出しする関数(サブルーチン)名を変更してもプログラムコードの類似度を検出することが可能である。
また、特許文献1には、プログラムコードを標準化して、それぞれトークン列を作成し、各トークンから相関マトリックスを作成し相関マトリックスを2値化された画像と見なしテクスチャ量を算出し、さらにその相関マトリックスに対応する各参照ベクトル間の距離を算出することでプログラムコード間の類似度を算出する類似度評価プログラム、類似度評価装置および類似度評価方法が開示されている。
特開2008−46695号公報
神谷年洋、CCFinderホームページ、[online]、[平成21年10月2日検索]、インターネット<URL:http://www.ccfinder.net/ccfinderx-j.html>
非特許文献1に記載のプログラムコードクローン検出ツール(CCFinder)、および特許文献1に記載の技術は、字句解析を実施し、予め定義されたルールに従い計算処理によりプログラムコードクローンを解析する方法である。この方法では、クローンを抽出することが可能であるが、大規模なプログラムシステムでは無数のクローンが解析されてしまうため、例えば、使用している変数が異なるため、違う関数として分類したい場合など、本当に必要であるクローンの情報を選び出すことが困難になる場合が多く、要求を十分に満たすものとはいえなかった。
さらに、非特許文献1に記載のプログラムコードクローン検出ツールは、あるプログラムを字句解析し、プログラム構文の類似度を直接比較するため、プログラムの中から参照するメモリ領域が異なることにより処理上では意味が違うと判断すべきである場合でもクローンと判別してしまう問題がある。つまり、同じ文字列が使用されている変数でも、例えば一方はグローバル変数であり、他方がローカル変数である場合、これらの変数を使用している関数は、本質的に異なる機能をもつものであるにも拘わらず、同じ関数とみなされてしまう。
このような問題は、特許文献1においても解決されていない。
このような背景に鑑みて本発明がなされたのであり、本発明は、クローンの系統を正確に表示することを目的とする。
前記課題を解決するため、本発明は、プログラムコードおよび前記プログラムコードから任意のトークンを抽出したテンプレートにおいて、元のプログラムコードまたはテンプレートを親、親のプログラムまたはテンプレートに対するトークンの編集を行ったプログラムコードを子とした親子関係を導出および表示するプログラム解析装置によるプログラム解析方法であって、前記プログラム解析装置は、記述形式が異なるが、同一のトークンとみなせるトークンを登録したトークン辞書と、前記トークンで使用されている変数の種類を登録したメモリアクセス辞書と、を記憶部に記憶しており、前記プログラム解析装置が、(a1)解析対象である複数のプログラムコードを、トークンに分解する字句解析を行い、(a2)前記テンプレートと、前記字句解析の結果と、前記トークン辞書と、を参照し、記述形式が異なるが前記トークン辞書において同一のトークンとみなせるトークンを同一のトークンとし、(a3)前記テンプレートと、前記字句解析の結果と、前記メモリアクセス辞書と、を参照し、形式が同一のトークンであるが、異なる種類の変数を用いているトークンを異なるトークンとして、前記同一のトークンを絞り込み、(a4)前記複数のプログラムコードのうち、2つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記2つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をx、前記同一のトークンの出現位置に対応する縦軸の座標をyとしたとき、(x,y)の点にプロットを行ったクローン解析図を作成し、(a5)前記クローン解析図を基に、前記テンプレートおよびプログラムコード間の親子関係を導出し、(a6)前記(a4)および(a5)の処理を、解析対象となっているテンプレートおよびプログラムコードの各対に対して行い、(a7)前記親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させることを特徴とする。
その他の解決手段については、実施形態中に記載する。
本発明によれば、クローンの系統を正確に表示することができる。
本実施形態に係るプログラム解析装置の構成例を示す機能ブロック図である。 本実施形態に係るプログラム解析処理の概要を示す図である。 本実施形態に係るプログラム解析処理の手順を示すフローチャートである。 ステップS102における字句解析処理を説明するための図である。 ステップS104におけるテンプレート作成処理を説明するための図である。 ステップS105における関数辞書作成処理を説明するための図である。 ステップS106におけるメモリアクセス辞書作成処理を説明するための図である。 ステップS107における類似度算出処理を説明するための図である。 ステップS110における分類結果作成処理を説明するための図である(その1)。 ステップS110における分類結果作成処理を説明するための図である(その1)。 ステップS111におけるクローン解析処理を説明するためのクローン解析図である。 ステップS112の親子関係導出・派生率算出処理のうち、親子関係導出処理の部分を説明するための図である。 クローン解析処理が終了した後、結果表示部に表示されるクローン解析図の例である。 ステップS114における系統図作成処理を説明するための系統図の例を示す図である。 テンプレート、関数辞書、メモリアクセス辞書の具体例を示す図である。 テンプレートと、プログラムコードとの具体例を示す図である。 プログラムコード群αを構成する各プログラムコードのテンプレートaに対する類似度結果を示す図である。 プログラムコード群α,βの系統図を示す図である(その1)。 プログラムコード群α,βの系統図を示す図である(その2)。
次に、本発明を実施するための形態(「実施形態」という)について、適宜図面を参照しながら詳細に説明する。以下の説明において、プログラムコード群とは、複数のプログラムコードが集合することにより機能するプログラムのことである。例えば、1つのプログラムをプログラムコード群とすれば、プログラムコードはメイン関数や、サブ関数となる。あるいは、プロセスがプログラムコードとなる場合もある。
なお、本実施形態の各図において、同様の構成要素には同一の符号を付し、説明を省略する。
《装置構成》
図1は、本実施形態に係るプログラム解析装置の構成例を示す機能ブロック図である。
プログラム解析装置1は、装置の動作を制御する制御部100と、情報を記憶する記憶部200と、ディスプレイなどの結果表示部(表示部)300と、キーボードやマウスなどのユーザインタフェース部400とを有してなる。
制御部100は、解析対象プログラムコード群登録部101と、字句解析部102と、テンプレート作成部103と、関数辞書作成部104と、メモリアクセス辞書作成部105と、類似度算出部106と、類似度解析結果作成部107と、分類結果作成部108と、クローン解析部109と、系統図作成部110と、を有してなる。
解析対象プログラムコード群登録部101は、解析対象となる複数のプログラムコードからなるプログラムコード群201をユーザインタフェース部400を介して登録する処理を行う機能を有する。
字句解析部102は、登録されたプログラムコードをトークンに分解する字句解析処理を行う機能を有する。なお、トークンとは、関数などプログラムコードを構成する単語や記号の最小単位のことである。
テンプレート作成部103は、字句解析の結果(字句解析結果205)や、ユーザインタフェース部400から入力された情報などを基にテンプレート202を作成する処理を行う機能を有する。テンプレート202の詳細は後記して説明する。
関数辞書作成部104は、テンプレート202や、字句解析結果205や、ユーザインタフェース部400から入力された情報などを基に、関数の変形例などを登録した関数辞書(トークン辞書)203を作成する機能を有する。関数辞書203の詳細は後記して説明する。
メモリアクセス辞書作成部105は、テンプレート202や、ユーザインタフェース部400から入力された情報などを基に、関数で参照される変数の種類を登録したメモリアクセス辞書204を作成する機能を有する。メモリアクセス辞書204の詳細は後記して説明する。
類似度算出部106は、テンプレート202におけるプログラムコードの構造と、登録されているプログラムコードの構造とを比較して類似度を算出する機能を有する。
類似度結果作成部107は、類似度算出部106が出力した結果を結果表示部300に表示させる機能を有する。
分類結果作成部108は、テンプレート202毎に作成した類似度結果を分類結果として結果表示部300に表示させる機能を有する。
クローン解析部109は、字句解析結果205と、関数辞書203と、メモリアクセス辞書204とを基に、クローン解析を行い、このクローン解析の結果を結果表示部300に表示させる機能を有する。
系統図作成部110は、クローン解析の結果を基にプログラムコード間の親子関係を送出し、プログラムコード間の親子関係を系統図として結果表示部300に表示させる機能を有する。
なお、制御部100および各部101〜110は、図示しないROM(Read Only Memory)や、HD(Hard Disk)に格納されたプログラム解析プログラムが、RAM(Random Access Memory)に展開され、CPU(Central Processing Unit)によって実行されることによって具現化する。
記憶部200には、登録されたプログラムコード群201、字句解析結果205、テンプレート202、関数辞書203、メモリアクセス辞書204、トークン登録判別表206の各情報が格納される。前記したように字句解析結果205、テンプレート202、関数辞書203、メモリアクセス辞書204、トークン登録判別表206については後記して説明する。
《処理内容の概略》
図2は、本実施形態に係るプログラム解析処理の概要を示す図である。
まず、プログラムコード群αとして、プログラムコードa1,a2,a3,a4が登録され、プログラムコード群βとして、プログラムコードb1,b2,b3が登録されたとする。
まず、プログラム解析装置1は、テンプレート202、関数辞書203、メモリアクセス辞書204などを使用して、各プログラムコード群201内におけるプログラムコード間の類似度を算出する。すなわち、プログラムコードa1,a2,a3,a4間の類似度を算出し、プログラムコードb1,b2,b3の類似度を算出する(S1)。
次に、プログラム解析装置1はクローン解析処理を行い(S2)、作成されたクローン解析図を基に派生率の算出と、プログラムコード間の親子関係の導出を行う(S3)。
そして、プログラム解析装置1はプログラムコード間の親子関係を系統図として結果表示部300に表示する(S4)。ここで、親子関係とは、元のプログラムコードを親とし、親プログラムコードにトークンを追加、修正などの編集を行ったものを子とする。
なお、図2の系統図における「a」はテンプレート202である。
《処理手順》
次に、図1を参照しつつ、図3〜図19を参照して本実施形態に係るプログラム解析処理の手順を説明する。
まず、図3のフローチャートにおいて、処理手順の流れを説明し、図4〜図19を参照して各処理の詳細を説明することとする。
図3は、本実施形態に係るプログラム解析処理の手順を示すフローチャートである。
まず、ユーザインタフェース部400を介して、複数の解析対象プログラムコードが記憶部200に入力される。その後、ユーザインタフェース部400を介して、記憶部200に入力されたプログラムコードの中から、解析対象となるプログラムコードが選択・登録される解析対象プログラムコード登録処理が行われる(S101)。
次に、字句解析処理は、ステップS101で選択されたプログラムコードのうち、1つを選択し、このプログラムコードからコメント部のような直接的には関係のない情報を除去し、トークン単位で分割する字句解析処理を行う(S102)。
そして、制御部100は、ステップS101で選択されたすべてのプログラムコードについて、字句解析処理が完了したか否かを判定する(S103)。
ステップS103の結果、すべてのプログラムコードについて字句解析処理が完了していない場合(S103→No)、制御部100はステップS102の処理へ戻り、字句解析処理が行われていないプログラムコードについて字句解析処理を行う。
ステップS103の結果、すべてのプログラムコードについて字句解析処理が完了している場合(S103→Yes)、テンプレート作成部103が字句解析結果205と、ユーザインタフェース部400を介して入力された情報とを基にトークンに重み付けを行ったテンプレート202を作成するテンプレート作成処理を行う(S104)。
そして、関数辞書作成部104が、字句解析結果205と、テンプレート202と、ユーザインタフェース部400を介して入力された情報などを基に関数辞書203を作成する関数辞書作成処理を行う(S105)。
次に、メモリアクセス辞書作成部105が、テンプレート202と、ユーザインタフェース部400を介して入力された情報などを基にメモリアクセス辞書204を作成するメモリアクセス辞書作成処理を行う(S106)。
なお、異なるタイプのテンプレート202を複数作製してもよい。テンプレート202を複数作成するときはステップS104〜S106の処理を繰り返す。
そして、類似度算出部106が、テンプレート202や、テンプレート202から作成されるトークン登録判別表206を基に類似度を算出する類似度算出処理を行う(S107)。
次に、制御部100がテンプレート202に対するすべてのプログラムコードにおいて、類似度算出処理が完了したか否かを判定する(S108)。
ステップS108の結果、すべてのプログラムコードについて類似度算出処理が完了していない場合(S108→No)、制御部100はステップS107へ処理を戻し、類似度算出部106が類似度を算出していないプログラムコードについて類似度を算出する。
ステップS108の結果、すべてのプログラムコードについて類似度算出処理が完了している場合(S108→Yes)、類似度結果作成部107が類似度算出処理の結果を結果表示部300に表示させる類似度結果表示処理を行う(S109)。
次に、分類結果作成部108が、閾値以下の類似度を有するプログラムコードを処理の対象から除外し、テンプレート202毎にプログラムコードを分類する分類結果作成処理を行う(S110)。
そして、クローン解析部109が、テンプレート202、字句解析結果205、関数辞書203およびメモリアクセス辞書204を基に、テンプレート202およびプログラムコードの各組み合わせについてクローン解析を行い、その結果を結果表示部300に表示するクローン解析処理を行う(S111)。
次に、系統図作成部110が、クローン解析結果を基に、テンプレートやプログラムコード間の親子関係を導出したり、派生率を算出する親子関係導出・派生率算出処理を行う(S112)。
そして、制御部100がすべてのプログラムコードの組み合わせについて親子関係導出・派生率算出処理が完了したか否かを判定する(S113)。
ステップS113の結果、すべての組み合わせについて親子関係導出・派生率算出処理が完了していない場合(S113→No)、制御部100はステップS112の処理へ戻り、系統図作成部110は派生率を算出していないプログラムコードの組み合わせについて親子関係導出・派生率算出処理を行う。
ステップS113の結果、すべての組み合わせについて親子関係導出・派生率算出処理が完了している場合(S113→Yes)、プログラムコード間の親子関係を示した系統図を作成し、結果表示部300に表示させる系統図作成処理を行う(S114)。
(S102:字句解析処理)
以下、図1および図3を参照しつつ、図4〜図14に沿って主な処理の詳細な説明を行う。
図4は、ステップS102における字句解析処理を説明するための図である。
ここで、字句解析とは、プログラムコードから、コメント部のような直接的には類似度の比較に必要のない情報を除去し、さらにプログラムコードをトークン単位で分割する処理をいう。まず、字句解析部102が、ステップS101で選択・登録されたプログラムコードを読み込むと、以下のような字句解析処理を行う。
例えば、プログラムコードがC言語で記述されている場合、読み込んだプログラムコード内の「//」に続く文字列や「/*」と「*/」で囲まれたコメント文を削除する。さらにコメントを削除したプログラムコードをトークン毎に分割する処理を行う。
上記手順により字句解析されるプログラムコード及び字句解析されたトークン列の具体例が図4に示されている。
プログラムコード401を字句解析した結果が字句解析されたプログラムコード402であり、プログラムコード411を字句解析した結果が字句解析されたプログラムコード412である。一見して相互の類似度が低く見えるようなプログラムコード間であっても、このように、プログラムコードを字句解析することにより、それらの類似度を的確に算出することが可能となる。
なお、字句解析処理は公知の技術である。
(S104:テンプレート作成処理)
図5は、ステップS104におけるテンプレート作成処理を説明するための図である。
テンプレート202は、ステップS102で字句解析された結果が結果表示部300に表示され、ユーザが表示された字句解析結果205(図1)を参照して、ユーザインタフェース400を介して情報を入力することにより作成される。
例えば、図5に示すプログラムコード501からテンプレート202が作成される。
図5に示すように、テンプレート202には、プログラムコードで処理順に記載される関数、システムコール等を用いてプログラムコードの構造がトークン毎に記述されている。例えば、プログラムコード501がC言語であるなら、「if」文、「else」文、「for」文、共通関数、システムコールなどのトークンがテンプレート202に登録される。
ここで、テンプレート202に登録されるトークンは、プログラムコードにおけるすべてのトークンではなく、プログラムコードに特徴的なトークンが登録されていればよい。
さらに、図5に示すように、ユーザは、テンプレート202に登録した各々のトークンに対し重み付けを行うことが可能である。つまり、テンプレート202内で特に重要なトークンに対して強い重み付けをすることで、テンプレート202の特徴的な構造を定義することが可能である。
なお、例えば、プログラムコードAを基に作成したテンプレート202、プログラムコードBを基に作成したテンプレート202などというように、テンプレート202を複数作成することができる。例えば、プログラムコードAを基に作成したテンプレート202を用いることで、プログラムコードAに近いか否かを判定することができ、プログラムコードBを基に作成したテンプレート202を用いることで、プログラムコードBに近いか否かを判定することができる。
図6で後記する関数辞書203を作成することで、複数の異なる関数を共通の定義として扱うことが可能である。つまり、関数辞書203で同種の関数であると定義されている関数(またはトークン)は同種の関数であるとして、類似度を上げることができる。また、代入文やメモリのコピーを行っているトークンに関しては、図7で後記するメモリアクセス辞書204でコピー先の変数の属性を登録することができ、コピー先がグローバル変数、または、ローカル変数であることを定義することが可能である。
(S105:関数辞書作成処理)
図6は、ステップS105における関数辞書作成処理を説明するための図である。
ユーザは、テンプレート202と、結果表示部300に表示されている字句解析結果205(図1)を参照して、ユーザインタフェース400を介して情報を入力することにより関数辞書203を作成する。
図6に示すように、例えば、ほぼ同義の共通関数(つまり、コピーなどを利用して作成された関数)「sub_A1()」および「sub_A2()」をテンプレート202における「funcA()」と同グループの関数として関数辞書203を定義する。
このようにすることで、後記する類似度算出時に、コールしている共通関数のみ異なるプログラムコードを類似していることを判別することができる。つまり、異なる関数であっても、関数辞書203で同グループの関数として登録されている関数は同じ関数とすることができる。
また、関数辞書203に登録されている関数は、テンプレート202に登録されている関数でもよい。
(S106:メモリアクセス辞書作成処理)
図7は、ステップS106におけるメモリアクセス辞書作成処理を説明するための図である。
図7に示すように、ユーザは、テンプレート202に定義したトークンで使用している変数毎に、その変数がグローバル変数、ローカル変数、または複数のグローバル変数である複数グローバル変数群であるか否かといった変数の種類を、ユーザインタフェース400を介して入力することによりメモリアクセス辞書204を作成する。
このようにすることで、後記する類似度算出時に、同じ形式であるが参照している変数がグローバル変数と、ローカル変数であるなど、異なる種類の変数を参照している関数を異なる関数として判別することができる。
なお、メモリアクセス辞書204は、結果表示部300に表示されているテンプレート202や、字句解析結果205を参照しながら、ユーザによって作成されるものである。
テンプレート202、関数辞書203、メモリアクセス辞書204の記述内容は任意であるが、抽出したいクローンコードの特徴的な構造を定義することが望ましい。また、これらは一度作成した後、記憶部200に保存することが可能であり、何度でも読み込み・編集することが可能である。
また、テンプレート202、関数辞書203、メモリアクセス辞書204は、図2の処理が始まる前に予め作成されていてもよい。
(S107:類似度算出処理)
図8は、ステップS107における類似度算出処理を説明するための図である。
まず、類似度算出部106は、図8に示すようなトークン登録判別表206をプログラムコード毎に作成する。
まず、類似度算出部106は、ステップS104で作成したテンプレート202をコピーし、ステップS102で作成した字句解析結果205と比較することにより、処理対象となっているプログラムコードにおいて、テンプレート202に登録されているトークンがあるか否かを判定し、あれば該当する登録判別の欄に「○」を登録し、なければ「×」を登録する。
このとき、類似度算出部106は、関数辞書203や、メモリアクセス辞書204を参照して、異なる形式のトークンがあっても関数辞書203に登録されていれば、トークン登録判別表206の登録判別欄に「○」を登録し、同じ形式のトークンがあってもメモリアクセス辞書204において異なる変数を参照している場合はトークン登録判別表206の登録判別欄に「×」を登録する。
このトークン登録判別表206は、プログラムコード毎に作成される。例えば、テンプレートAとテンプレートBがあり、プログラムコードA〜プログラムコードDがあれば、テンプレートAを基にしたプログラムコードA〜プログラムコードDのトークン登録判別表206を作成し、これとは別にテンプレートBを基にしたプログラムコードA〜プログラムコードDのトークン登録判別表206を作成する。
次に、類似度算出部106は、各プログラムコードのトークン登録判別表206において「○」が登録されているトークンの重みを加算し、加算した結果を、すべての重みを加算した値(最大スコア)で除算し、さらに100を乗算することにより類似度を算出する。
すなわち、類似度算出部106は以下の式(1)より類似度を算出する。
類似度(%)=プログラムコードスコア÷最大スコア×100 ・・・ (1)
例えば、図8に示すプログラムコードDのトークン登録判別表206から求められる類似度は(1+2+1)÷(1+1+2+1+1)×100=66(%)となる。
類似度算出部106は、類似度を作成されているテンプレート202に対するすべてのプログラムコードについて算出する。
なお、類似度算出の処理対象となるテンプレート202および閾値は、ユーザによって指定されてもよい。指定のタイミングは、類似度算出処理の前であればいつでもよい。
(S110:分類結果作成処理)
図9および図10は、ステップS110における分類結果作成処理を説明するための図である。
分類結果作成部108は、予め設定してある閾値以上の類似度を有するプログラムコードをグループとして登録する。
図9の例では、閾値を「30」と設定しているため、類似度が「20(%)」のプログラムコードCはグループから除外されている。
また、前記したようにテンプレート202は複数作成することも可能であるため、図10に示すように異なるテンプレート202によるグループ化も可能である。
図10の例では、テンプレートAを基にグループ化されたプログラムコードA、B,Dと、テンプレートBを基にグループ化されたプログラムコードA,C、Dとの2つのグループが作成されている。
分類結果作成部108は、図9や図10に示すようなプログラムコードのグループを結果表示部300に表示させる。
(S111:クローン解析処理)
図11は、ステップS111におけるクローン解析処理を説明するためのクローン解析図である。
クローン解析部109が以下の手順でプログラムコードに対するクローン解析を行う。
まず、クローン解析部109は、図9に示すようなグループ化されたプログラムコードから、テンプレート202とプログラムコードの対、プログラムコードとプログラムコードの対を選択し、縦軸が一方のテンプレート202またはプログラムコードのトークン出現位置、横軸が他方のテンプレート202またはプログラムコードのトークン出現位置としたクローン解析図1101を作成する。
クローン解析部109は、比較対象となっているテンプレート202およびプログラムコードの字句解析結果205を基に、クローン解析図1101上において同じトークンが記述されている箇所にプロットする。
すなわち、クローン解析部109は、2つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記2つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をx、前記同一のトークンの出現位置に対応する縦軸の座標をyとし、(x,y)の点にプロットを行うことによりクローン解析図を作成する。
このとき、クローン解析部109は、形式が異なっても関数辞書203に登録されている関数や、メモリアクセス辞書204で同じ種類の変数を参照している関数を、同じトークンとしてクローン解析図1101にプロットする。逆に、クローン解析部109は、形式が同じでも、メモリアクセス辞書204において異なる変数を参照している関数は異なる関数とし、プロットを行わない。
図11に示すように、クローン解析図1101では、同じであると判定されたトークン列間のプロット部分のうち、長い直線となっている部分が各プログラムコード間の共通トークン部分である。この直線となっている部分をクローン片と称することとする。仮に、2つのプログラムコードが同一である場合は、原点から右下にかけて連続した直線がプロットされることとなる。
なお、クローン解析図1101において、水平方向および垂直方向に複数プロットされている箇所、つまり一方のトークン出現位置に対し、複数の他方のトークン出現位置が対応している箇所は、関数辞書203や、メモリアクセス辞書204によって一方のプログラムコードにおける1つのトークンに対し、他方のプログラムコードにおける複数のトークンが同一であると判定されたものである。
(S112:親子関係導出処理)
図12は、ステップS112の親子関係導出・派生率算出処理のうち、親子関係導出処理の部分を説明するための図である。
また、図12では、プログラムコードAの途中に条件文が挿入された場合、クローン解析図1201に不連続部分(破線矢印)が生じることを示している。このように、クローン解析図1201において、クローン片が不連続となっている場合、その行にはプログラムコード特有の処理が記述されているものと考えられる。
すなわち、元のプログラムコードをプログラムコードA、プログラムコードAに条件文を追加挿入したものをプログラムコードA1とすると、図12のクローン解析図1201において、条件文が追加挿入されたところで、クローン片が水平右方向にずれた状態で不連続となっている。このように、クローン片が水平右方向にずれていれば、横軸のトークン出現位置が示すプログラムコード(ここでは、プログラムコードA1)は、縦軸のトークン出現位置が示すプログラムコード(ここでは、プログラムコードA)にトークンが追加挿入されたものであることがわかる。
なお、逆にプログラムコードA1にトークンが追加挿入されたものがプログラムコードAだとすると、クローン解析図では垂直下方向にクローン片がずれた状態の不連続部分が生じることとなる。
(S112:親子関係導出・派生率算出処理)
図13は、クローン解析処理が終了した後、結果表示部に表示されるクローン解析図の例である。
図13では、テンプレートA‐プログラムコードA(クローン解析図1301)、テンプレートA‐プログラムコードB(クローン解析図1302)、テンプレートA‐プログラムコードD(クローン解析図1303)、プログラムコードA‐プログラムコードB(クローン解析図1304)、プログラムコードA‐プログラムコードD(クローン解析図1305)、プログラムコードB‐プログラムコードD(クローン解析図1306)、・・・の組み合わせに対するクローン解析図が表示されている。ここで、プログラムコードCを含んだ組み合わせがないのは、図9に示すようにプログラムコードCの類似度が閾値以下であるため、グループから除外された例を示しているためである。
ここで、テンプレートAは、プログラムコードAを基に作成したテンプレート202(図1)である。プログラムコードAを基にしているが、完全に同じわけではないため、テンプレートA−プログラムコードAのクローン解析図には不連続部分が生じている。なお、図13において、不連続部分は破線矢印で示している。
また、プログラムコードAはオリジナルのプログラムコードであり、プログラムコードBはプログラムコードAに対して処理を追加したプログラムコードとする。そして、プログラムコードDはプログラムコードAに対して処理を修正したプログラムコードとする。
図12で、説明したようにあるプログラムコードにトークンが追加挿入されている場合、クローン片は水平右方向あるいは垂直下方向にずれた状態で不連続となっている。
従って、あるプログラムコードに対し、単純にトークンが追加されているだけであれば、水平右方向あるいは垂直下方向に対し、すべての不連続部分が一定の方向にずれた状態となる。そのため、すべての不連続部分が水平右方向もしくは垂直下方向にずれている場合、そのプログラムコードは元のプログラムコードに対し、単純にトークンが追加されているだけなので、元のプログラムコードを親、トークンが追加されたプログラムコードを子とみなすことができる。
なお、水平右方向にずれていれば、クローン解析図の縦軸が示すプログラムコード(テンプレート)が親となり、横軸が示すプログラムコード(テンプレート)がトークンを追加された子となる。また、垂直下方向にずれていれば、クローン解析図の横軸が示すプログラムコード(テンプレート)が親となり、縦軸が示すプログラムコード(テンプレート)がトークンを追加された子となる。図13の例では、クローン解析図1301,1302,1304の不連続部分1311がこれらの例に相当する。
例えば、図13のクローン解析図1301では、プログラムコードAは、テンプレートAに対しトークンが追加されているだけなので、テンプレートA>プログラムコードAであることがわかる。なお、「>」は「親>子」であることを示す。
同様に、クローン解析図1302では、テンプレートA>プログラムコードB、クローン解析図1304からプログラムコードA>プログラムコードBであることがわかる。従って、系統図作成部110は、クローン解析図1301,1302,1304からテンプレートA>プログラムコードA>プログラムコードBという親子関係を導出する。
さらに、トークンが修正されたり、異なるトークンに置換えられたりした部分は、クローン解析図1305の符号1321に示すように、クローン片が完全に断裂した状態となっている。これを断裂部分と称することとする。
このような断裂部分や、クローン解析図1305の符号1322のように、斜め方向にクローン片がずれている不連続部分が存在する場合、クローン解析図1301,1302,1304のようにクローン解析図の形状から親子関係を導出することができない。
図13では、クローン解析図1303,1305,1306が、このようなクローン解析図に該当する。
図13におけるクローン解析図1303,1305,1306のように、クローン解析図の形状から親子関係を導出することができない場合、系統図作成部110は、式(2)で算出される派生率を用いて各々のプログラムコード間のクローンコード片の平均長が一番長いものを構造が近いものと判断し、この派生率を基に親子関係を導出する。
派生率=(T+T+・・・+T)/N・・・(2)
式(2)における、Nはクローンコード片の数であり、Tはn個目のクローンコード片の長さである。
系統図作成部110は、図13のクローン解析図1305(プログラムコードA‐プログラムコードD)、およびクローン解析図1306(プログラムコードB‐プログラムコードD)のそれぞれに対し、式(2)を計算し、クローンコード片の平均長(派生率)を求める。なお、テンプレートAは、すべてのプログラムコードと親子関係をもつものであるため、系統図作成部110は派生率の算出対象からクローン解析図1303を外す。
派生率の算出結果、プログラムコードA−プログラムコードDの派生率>プログラムコードB‐プログラムコードDの派生率であったとすると、系統図作成部110が、プログラムコードDは、プログラムコードBよりプログラムコードAに近い構造を有すると判別する。そして、系統図作成部110は、プログラムコードDの系統図における位置を、プログラムコードAと並列に位置付け、プログラムコードAの親であるテンプレートAの子とする。なお、プログラムコードB−プログラムコードDの派生率>プログラムコードA‐プログラムコードDの派生率であった場合、系統図作成部110は、系統図におけるプログラムコードDの位置をプログラムコードBと並列に位置付け、プログラムコードDをプログラムコードBの親であるプログラムコードAの子とする。
以上、系統図作成部110による親子関係の導出手順を整理すると、
1.系統図作成部110は、クローン解析図において、すべての不連続部分が水平右方向あるいは垂直下方向に対し、一定の方向でずれているものがあるか否かを判定し、あれば、クローン片がずれている方向から親子関係を導出する(図13のクローン解析図1301,1302,1304)。
2.系統図作成部110は、クローン片が一定方向にずれていないクローン解析図(クローン解析図1303,1305,1306)からテンプレート202を有するクローン解析図を派生率の算出対象から除外する(クローン解析図1303)。
3.派生率の算出対象から除外されなかったクローン解析図から派生率を算出し、親子関係を導出する。
なお、系統図作成部110は、ユーザによって登録されたシステムの開発順番を参照し、以前に作成されたプログラムコードが必ず親になるように派生関係を決定してもよい。
このようにして、系統図作成部110は、プログラムコード間の派生関係を求め、系統図を作成し、結果表示部300に作成した系統図を表示する。
(S114:系統図作成処理)
図14は、ステップS114における系統図作成処理を説明するための系統図の例を示す図である。
図13で説明した処理により、系統図作成部110は、テンプレートAの子としてプログラムコードAおよびプログラムコードD、プログラムコードAの子(テンプレートAの孫)としてプログラムコードBという関係を導出し、結果表示部300に系統図1401を表示する。
《具体例》
次に、図15〜図19を参照して、本実施形態に係る系統図の作成手順を具体例を用いて説明する。
本実施形態において、系統図の算出対象となるソースプログラムの使用言語はC言語とした。ここでは、ある1つのテンプレート202に対して、2つの解析対象プログラムコード群α,βから類似したプログラムコードを算出し、系統図を算出するものとする。
まず、ユーザは類似度算出に先立ち、解析対象としてプログラムコード群α、およびプログラムコード群αをベースとして作成されたプログラムコード群βを解析対象プログラムコードとして登録する。
なお、ここで、プログラムコード群201とは、共通のプログラムコードを使用して構成されている別のプログラムコード群201である。例えば、バージョンが異なるプログラムなどがプログラムコード群α、βに該当する。登録されたプログラムコードは、図3のステップS102による字句解析が行われ、さらにステップS104〜S106の処理が行われ、テンプレート202、関数辞書203、メモリアクセス辞書204が作成される。
図15は、テンプレート、関数辞書、メモリアクセス辞書の具体例を示す図である。
図15の例では、テンプレート202の「共通関数(・・・)」には、関数辞書203により「sub_A()、sub_B()」が該当しており、メモリアクセス辞書204により関数memcpyが参照する「pData」はグローバル変数であることがわかる。
このように解析対象プログラムコード群201内で使用されている意味のあるトークンを組み合わせて定義する。ここで、意味のあるトークンと互いにはコピー関係にあるトークンのことである。例えば、図15に示すように、memset関数、if−else文、共通関数、memcpy関数を使用した構造をテンプレート202として定義する。なお、図15のテンプレート202では、「共通関数」と「memcpy」の関数が重要な意味を持つとし、「共通関数」、「memcpy」の重みを「2」とし、その他のトークンの重みを「1」としている。
図16は、テンプレートと、プログラムコードとの具体例を示す図である。
図16におけるテンプレートaは、図16のプログラムコードa1を基に作成されたものである。さらに、プログラムコードcは、プログラムコードa1を基に、修正を加えて作成されたプログラムコードである。
テンプレートaにおいて登録されているトークン数は5つであり、図15の重みに従えば最大スコアは7である。
プログラムコードa1では、テンプレートaで定義されているトークンのすべてがテンプレートaに登録した順に出現している(ドット部分)。そして、「memcpy」の「&pRtn」がグローバル変数であるとするならば、テンプレートaに対するプログラムコードa1の類似度は100%となる。関数内で使用している変数がグローバル変数であるか、ローカル変数であるかなどは、宣言文の形式から判定できる。
また、プログラムコードcでも、テンプレートaに登録したすべてのトークンが出現しているが、「Sub_B」の後に「if」が出現するなど、テンプレートaとは出現の順番が異なるため、プログラムコードcにおける「if−else」文は、テンプレートaのクローンコードと判定せず、「memset」、「Sub_B」、「memcpy」のみがテンプレートaと合致したと判定する(ドット部分)。その結果、テンプレートaに対するプログラムコードcの類似度はおよそ71%となる。
つまり、
プログラムコードa1の類似度=(1+1+2+2+1)/(1+1+2+2+1)×100=100(%)
プログラムコードcの類似度=(1+2+2)/(1+1+2+2+1)×100≒71(%)
である。
以上のように、プログラム解析装置1はプログラムコード群α、βにおける各々のプログラムコードについて類似度を算出する。
図17は、プログラムコード群αを構成する各プログラムコードのテンプレートaに対する類似度結果を示す図である。
ここで、「a1」、「c」、「c1」、「d」、「e」、「e1」、「h」、「j」はそれぞれプログラムコード群αを構成するプログラムコードの名称である。
ここでは、閾値を40%とし、類似度が40%以上であるプログラムコードのみを表示している。
図18および図19は、プログラムコード群α,βの系統図を示す図である。なお、図18および図19において、「a」のみがテンプレート202であり、その他はプログラムコードである。
これらはプログラムコード群αおよびプログラムコード群βに対し、個別に図3に示す処理を行った結果である。
さらに、図19に示すように、系統図作成処理は図18の結果を統合させて結果表示部300に表示させてもよい。
これは、例えばユーザがユーザインタフェース部400を介して、プログラムコード群αをベースにプログラムコード群βが作成された旨の入力などを行うことによって作成されてもよい。
本実施形態は、複数のプログラムコードを有するプログラムシステムであれば、記述されている言語がC言語に限ることなく、他のプログラム言語でも利用することができる。
《まとめ》
本実施形態によれば、形式が異なっていても同じ関数とみなせる関数を登録した関数辞書203や、関数内で使用している変数の種類を登録したメモリアクセス辞書204を用いることによって、形式上は異なっていても実質的に同じトークンであるとしたり、形式上は同一でも、参照している変数が異なれば異なるトークン(関数)であるとしたりすることにより、プログラムコードの単純比較では抽出することのできないトークンの種類を抽出することができ、精度の高いプログラム解析を行うことができる。さらに、トークンの種類を考慮した系統図を作成することにより、精度の高いプログラムコード間の親子関係を導出することができる。
1 プログラム解析装置
100 制御部
101 解析対象プログラムコード群登録部
102 字句解析部
103 テンプレート作成部
104 関数辞書作成部
105 メモリアクセス辞書作成部
106 類似度算出部
107 類似度解析結果作成部
108 分類結果作成部
109 クローン解析部
110 系統図作成部
200 記憶部
201 プログラムコード群
202 テンプレート
203 関数辞書(トークン辞書)
204 メモリアクセス辞書
205 字句解析結果
206 トークン登録判別表
300 結果表示部(表示部)
1101,1201,1301〜1306 クローン解析図
1401 系統図

Claims (9)

  1. プログラムコードおよび前記プログラムコードから任意のトークンを抽出したテンプレートにおいて、元のプログラムコードまたはテンプレートを親、親のプログラムまたはテンプレートに対するトークンの編集を行ったプログラムコードを子とした親子関係を導出および表示するプログラム解析装置によるプログラム解析方法であって、
    前記プログラム解析装置は、
    記述形式が異なるが、同一のトークンとみなせるトークンを登録したトークン辞書と、
    前記トークンで使用されている変数の種類を登録したメモリアクセス辞書と、
    を記憶部に記憶しており、
    前記プログラム解析装置が、
    (a1)解析対象である複数のプログラムコードを、トークンに分解する字句解析を行い、
    (a2)前記テンプレートと、前記字句解析の結果と、前記トークン辞書と、を参照し、記述形式が異なるが前記トークン辞書において同一のトークンとみなせるトークンを同一のトークンとし、
    (a3)前記テンプレートと、前記字句解析の結果と、前記メモリアクセス辞書と、を参照し、形式が同一のトークンであるが、異なる種類の変数を用いているトークンを異なるトークンとして、前記同一のトークンを絞り込み、
    (a4)前記複数のプログラムコードのうち、2つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記2つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をx、前記同一のトークンの出現位置に対応する縦軸の座標をyとし、(x,y)の点にプロットを行ったクローン解析図を作成し、
    (a5)前記クローン解析図を基に、前記テンプレートおよびプログラムコード間の親子関係を導出し、
    (a6)前記(a4)および(a5)の処理を、解析対象となっているテンプレートおよびプログラムコードの各対に対して行い、
    (a7)前記親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させる
    ことを特徴とするプログラム解析方法。
  2. 前記クローン解析図におけるプロットが連続している線をクローン片とし、
    前記プログラム解析装置が、
    すべての前記クローン片が水平右方向または垂直下方向に対し、一定の方向にずれた状態で不連続となっているとき、
    すべての不連続部分が水平右方向にずれている状態のとき、前記クローン解析図の縦軸が示すテンプレートおよびプログラムコードを親とし、前記クローン解析図の横軸が示すプログラムコードを子とし、
    すべての不連続部分が垂直下方向にずれている状態のとき、前記クローン解析図の横軸が示すテンプレートおよびプログラムコードを親とし、前記クローン解析図の縦軸が示すプログラムコードを子とする
    ことを特徴とする請求項1に記載のプログラム解析方法。
  3. 前記クローン解析図におけるプロットが連続している線をクローン片とし、
    前記プログラム解析装置が、
    以下の式(1)に基づく派生率を算出し、
    前記派生率が近い2つのプログラムコードを、前記系統図において並列に位置づけ、
    前記並列に位置づけられているプログラムコードの親を、共通の親とする
    ことを特徴とする請求項1に記載のプログラム解析方法。
    派生率=(T+T+・・・+T)/N・・・(1)
    ただし、Nはクローンコード片の数であり、Tはn個目のクローンコード片の長さである。
  4. 前記プログラム解析装置は、
    複数のプログラムコードで使用されているトークンに重み付けを対応させているテンプレートを、さらに記憶部に記憶しており、
    前記プログラム解析装置が、
    処理の対象となっているプログラムコードにおいて、前記テンプレートに記述されているトークンと一致するトークンの重み付けを加算することによって、類似度を算出する
    ことを特徴とする請求項1に記載のプログラム解析方法。
  5. 前記プログラム解析装置は、
    前記類似度が、所定の値未満であるプログラムコードの組については、前記(a2)〜(a5)の処理対象から除外する
    ことを特徴とする請求項1に記載のプログラム解析方法。
  6. 前記変数の種類は、グローバル変数、ローカル変数および複数のグローバル変数である複数グローバル変数群である
    ことを特徴とする請求項1に記載のプログラム解析方法。
  7. 前記プログラム解析装置は、
    複数のプログラムコードから構成されるプログラムコード群が複数入力され、
    前記入力された複数のプログラムコード群を構成する一部のプログラムコードは、互いに共通であり、
    前記プログラムコード群ごとに前記(a1)〜(a7)の処理を行うことにより、前記プログラムコード群ごとの系統図を複数作成し、
    前記作成された複数の系統図を1つにまとめる
    ことを特徴とする請求項1に記載のプログラム解析方法。
  8. 請求項1から請求項7に記載のプログラム解析方法をコンピュータに実行させることを特徴とするプログラム解析プログラム。
  9. プログラムコードおよび前記プログラムコードから任意のトークンを抽出したテンプレートにおいて、元のプログラムコードまたはテンプレートを親、親のプログラムまたはテンプレートに対するトークンの編集を行ったプログラムコードを子とした親子関係を導出および表示するプログラム解析装置であって、
    情報を処理する制御部と、情報を記憶する記憶部と、を有し、
    前記記憶部には、
    記述形式が異なるが、同一のトークンとみなせるトークンを登録したトークン辞書と、
    前記トークンで使用されている変数の種類を登録したメモリアクセス辞書と、
    が記憶されており、
    前記制御部が、
    (a1)解析対象である複数のプログラムコードを、トークンに分解する字句解析を行い、
    (a2)前記テンプレートと、前記字句解析の結果と、前記トークン辞書と、を参照し、記述形式が異なるが前記トークン辞書において同一のトークンとみなせるトークンを同一のトークンとし、
    (a3)前記テンプレートと、前記字句解析の結果と、前記メモリアクセス辞書と、を参照し、形式が同一のトークンであるが、異なる種類の変数を用いているトークンを異なるトークンとして、前記同一のトークンを絞り込み、
    (a4)前記複数のプログラムコードのうち、2つのプログラムコードについて、一方のプログラムコードのトークンの出現位置を縦軸にとり、他方のプログラムコードのトークンの出現位置を横軸にとり、絞り込んだ同一のトークンが前記2つのプログラムコードに出現するとき、前記同一のトークンの出現位置に対応する横軸の座標をx、前記同一のトークンの出現位置に対応する縦軸の座標をyとし、(x,y)の点にプロットを行ったクローン解析図を作成し、
    (a5)前記クローン解析図を基に、前記テンプレートおよびプログラムコード間の親子関係を導出し、
    (a6)前記(a4)および(a5)の処理を、解析対象となっているテンプレートおよびプログラムコードの各対に対して行い、
    (a7)前記親子関係を導出されたテンプレートおよびプログラムコード間を線で接続した系統図を表示部に表示させる
    ことを特徴とするプログラム解析装置。
JP2009250678A 2009-10-30 2009-10-30 プログラム解析方法、プログラム解析プログラムおよびプログラム解析装置 Active JP5342407B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2009250678A JP5342407B2 (ja) 2009-10-30 2009-10-30 プログラム解析方法、プログラム解析プログラムおよびプログラム解析装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009250678A JP5342407B2 (ja) 2009-10-30 2009-10-30 プログラム解析方法、プログラム解析プログラムおよびプログラム解析装置

Publications (2)

Publication Number Publication Date
JP2011096082A true JP2011096082A (ja) 2011-05-12
JP5342407B2 JP5342407B2 (ja) 2013-11-13

Family

ID=44112903

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009250678A Active JP5342407B2 (ja) 2009-10-30 2009-10-30 プログラム解析方法、プログラム解析プログラムおよびプログラム解析装置

Country Status (1)

Country Link
JP (1) JP5342407B2 (ja)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014170530A (ja) * 2013-02-28 2014-09-18 Tata Consultancy Services Ltd 静的解析中に発生した警告をグループ化するシステムおよび方法
JP2015090596A (ja) * 2013-11-06 2015-05-11 株式会社日立製作所 ソフトウェア開発管理装置およびその方法
JP2016224865A (ja) * 2015-06-03 2016-12-28 株式会社日立製作所 系統樹を構築する装置、方法およびシステム
KR101747767B1 (ko) 2015-10-12 2017-06-14 한양대학교 산학협력단 자바 자동 식별자 리네이밍 기법
WO2020049622A1 (ja) * 2018-09-03 2020-03-12 日本電気株式会社 情報処理装置、分析システム、分析方法及び分析プログラムが格納された非一時的なコンピュータ可読媒体

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003029978A (ja) * 2001-07-13 2003-01-31 Japan Science & Technology Corp 同形パターン検出システム
JP2003216425A (ja) * 2002-01-24 2003-07-31 Japan Science & Technology Corp 類似度計測システム
JP2008046695A (ja) * 2006-08-11 2008-02-28 Kobe Univ 類似度評価プログラム、類似度評価装置及び類似度評価方法
JP2009176064A (ja) * 2008-01-24 2009-08-06 Fuji Electric Holdings Co Ltd ソフトウェアリファクタリング支援装置および方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003029978A (ja) * 2001-07-13 2003-01-31 Japan Science & Technology Corp 同形パターン検出システム
JP2003216425A (ja) * 2002-01-24 2003-07-31 Japan Science & Technology Corp 類似度計測システム
JP2008046695A (ja) * 2006-08-11 2008-02-28 Kobe Univ 類似度評価プログラム、類似度評価装置及び類似度評価方法
JP2009176064A (ja) * 2008-01-24 2009-08-06 Fuji Electric Holdings Co Ltd ソフトウェアリファクタリング支援装置および方法

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
CSNG200400533002; 山本哲男、松下 誠、神谷年洋、井上克郎: 'ソフトウェアシステムの類似度とその計測ツールSMMT' 電子情報通信学会論文誌 Vol.J85-D-I,No.6, 20020601, pp.503〜511, 社団法人電子情報通信学会 *
CSNG200800804011; 神谷年洋: 'コードクローンをテンプレートとして用いて識別子のバリエーションを調べる手法の提案' 電子情報通信学会技術研究報告 Vol.108,No.65, 20080522, pp.59〜64, 社団法人電子情報通信学会 *
JPN6013009493; 山本哲男、松下 誠、神谷年洋、井上克郎: 'ソフトウェアシステムの類似度とその計測ツールSMMT' 電子情報通信学会論文誌 Vol.J85-D-I,No.6, 20020601, pp.503〜511, 社団法人電子情報通信学会 *
JPN6013009494; 神谷年洋: 'コードクローンをテンプレートとして用いて識別子のバリエーションを調べる手法の提案' 電子情報通信学会技術研究報告 Vol.108,No.65, 20080522, pp.59〜64, 社団法人電子情報通信学会 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2014170530A (ja) * 2013-02-28 2014-09-18 Tata Consultancy Services Ltd 静的解析中に発生した警告をグループ化するシステムおよび方法
JP2015090596A (ja) * 2013-11-06 2015-05-11 株式会社日立製作所 ソフトウェア開発管理装置およびその方法
JP2016224865A (ja) * 2015-06-03 2016-12-28 株式会社日立製作所 系統樹を構築する装置、方法およびシステム
KR101747767B1 (ko) 2015-10-12 2017-06-14 한양대학교 산학협력단 자바 자동 식별자 리네이밍 기법
WO2020049622A1 (ja) * 2018-09-03 2020-03-12 日本電気株式会社 情報処理装置、分析システム、分析方法及び分析プログラムが格納された非一時的なコンピュータ可読媒体
JPWO2020049622A1 (ja) * 2018-09-03 2021-08-12 日本電気株式会社 情報処理装置、分析システム、分析方法及び分析プログラム
JP7014301B2 (ja) 2018-09-03 2022-02-01 日本電気株式会社 情報処理装置、分析システム、分析方法及び分析プログラム
US11416246B2 (en) 2018-09-03 2022-08-16 Nec Corporation Information processing apparatus, analysis system, analysis method, and non-transitory computer readable medium storing analysis program

Also Published As

Publication number Publication date
JP5342407B2 (ja) 2013-11-13

Similar Documents

Publication Publication Date Title
JP7398068B2 (ja) ソフトウェアテスト
JP5342407B2 (ja) プログラム解析方法、プログラム解析プログラムおよびプログラム解析装置
US20190317986A1 (en) Annotated text data expanding method, annotated text data expanding computer-readable storage medium, annotated text data expanding device, and text classification model training method
WO2022226716A1 (zh) 基于深度学习的Java程序内部注释的生成方法及系统
US10261884B2 (en) Method for correcting violation of source code and computer readable recording medium having program performing the same
WO2014157056A1 (ja) ソースプログラム解析システム、ソースプログラム解析方法およびプログラムを記録した記録媒体
Kessentini et al. Automated co-evolution of metamodels and transformation rules: A search-based approach
JP2006285707A (ja) 業務仕様作成支援システム及び方法
JP2014232505A (ja) 項目間関連生成支援装置
WO2019092868A1 (ja) 情報処理装置、情報処理方法及びコンピュータ読み取り可能な記録媒体
WO2019092867A1 (ja) 情報処理装置、情報処理方法及びコンピュータ読み取り可能な記録媒体
CN103049504A (zh) 基于源代码查询的半自动插桩方法
CN110413307B (zh) 代码功能的关联方法、装置及电子设备
CN110989991B (zh) 检测应用程序中源代码克隆开源软件的方法及系统
CN107291749B (zh) 一种数据指标关联关系的确定方法及装置
JP2003208307A (ja) ソースプログラム生成システム
CN110928536A (zh) 一种图形化编程作品在线评测装置、系统及方法
CN106844218B (zh) 一种基于演化切片的演化影响集预测方法
JP2016057715A (ja) 図形式プログラム解析装置
NL2025739B1 (en) Artificial intelligence and augmented reality system and method
CN111562943B (zh) 一种基于事件嵌入树及gat网络的代码克隆检测方法和装置
JP2014048856A (ja) ソフトウェア検証用プログラムおよびソフトウェア検証システム
CN106775914A (zh) 一种自动生成键值的代码国际化方法及装置
JP5702265B2 (ja) プログラム自動生成装置およびプログラム自動生成方法
JP5123350B2 (ja) テストケース作成システム、方法およびプログラム

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20111128

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20130123

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130305

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130502

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130521

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130712

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20130809

R150 Certificate of patent or registration of utility model

Ref document number: 5342407

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150