JP2016184323A - 情報処理装置 - Google Patents

情報処理装置 Download PDF

Info

Publication number
JP2016184323A
JP2016184323A JP2015064715A JP2015064715A JP2016184323A JP 2016184323 A JP2016184323 A JP 2016184323A JP 2015064715 A JP2015064715 A JP 2015064715A JP 2015064715 A JP2015064715 A JP 2015064715A JP 2016184323 A JP2016184323 A JP 2016184323A
Authority
JP
Japan
Prior art keywords
code
clone
version
code clone
information processing
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
JP2015064715A
Other languages
English (en)
Other versions
JP6543990B2 (ja
Inventor
雅彦 高木
Masahiko Takagi
雅彦 高木
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 Corp
Original Assignee
NEC Corp
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 Corp filed Critical NEC Corp
Priority to JP2015064715A priority Critical patent/JP6543990B2/ja
Publication of JP2016184323A publication Critical patent/JP2016184323A/ja
Application granted granted Critical
Publication of JP6543990B2 publication Critical patent/JP6543990B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

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

Abstract

【課題】ソフトウェア開発・改修時に既知のバグの修正漏れをなくす情報処理装置を提供する。【解決手段】情報処理装置100は、バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部101と、ソースコードのバージョンの変化に伴うコードクローン毎の抽出数の変化に基づいて、そのコードクローンの信頼性を判定するコードクローン判定部102とを備えた。【選択図】図13

Description

本発明は、情報処理装置にかかり、特に、ソフトウェア開発や改修を支援する情報処理装置に関する。
既存ソフトウェアは、バグ改修や改良、最適化、機能追加、機能変更を行うことで、大規模化・複雑化している。しかし、ソースコードは改修されるが、様々な理由により仕様書が未修正・未整備のままの状態となり、形骸化してしまうことがある。そのため、ソースコードを修正した意図や目的を知るためには、その該当箇所を修正した保守担当者などの有識者に確認する必要がある。
ところが、ソフトウェアの修正等の確認作業は、口頭で行われ、仕様書に反映されないことが多い。このため、保守担当者が変更すると、それまでに培った技術及び知識が引き継ぎされず、また、職場変更や離職などの理由で有識者が現場から離れてしまった場合、後任の保守担当者はソフトウェアの理解(「大局的な流れ」及び「詳細な処理・動作」の理解)を行うことが困難となる。
以上のことから、既存ソフトウェアを改修する場合、その改修による新たなバグの作りこみや類似バグの修正漏れが発生する、という問題が生じる。
ここで、新たなバグの作りこみや類似バグの修正漏れなど、ソフトウェアの保守を困難にしている要因の1つとして、コードクローンが挙げられる。コードクローンとは、ソースコード中のある一部分(コード片)のうち、他のコード片と同一または類似しているものを指す。例えば、コードクローンは、図1に示すように、コピーアンドペースト(C&P)による処理の再利用や定型的な処理など、様々な理由によりソースコード中に作りこまれる。このため、あるコード片にバグが含まれていた場合には、そのコード片のコードクローン全てについて修正の是非を考慮する必要が生じる。なお、本願では、図1に示すように、同じソースコードをコピーアンドペーストした一群のコード片をクローンセットと呼び、そのパターンをクローンパターン、同一のコード片をクローンペア、と呼ぶことを示している。
特開2008−269020号公報 特開2012−220979号公報
一方で、近年では、コードクローン検出方法についての研究が進み、CCFinderを代表とするコードクローン検出ツールが開発されている。これらのツールにより、バグ修正時にコードクローンを検出し、類似コード片の修正を行うことにより、バグ修正漏れのリスクは低減している。しかしながら、バグが混在しているコード片(バグ混在コード片)を修正したにも関わらず、その経緯・情報が後の保守担当者に引き継ぎができていないことにより、次回以降のバグ修正が過去のバグ混在コード片と同じ内容で修正してしまうという問題があった。
また、特許文献1,2では、新たにバグ修正を行う際、既知のバグを作りこまないようにするための仕組みが発案されている。例えば、ソースコードの差分情報あるいはコピーの履歴を保持し、修正コードが「差分と合致、かつ、その差分にバグが潜在している」あるいは「履歴と合致、かつ、その履歴にバグが潜在している」と判断した場合に、ユーザへ通知するような仕組みが発案されている。
しかしながら、上述した技術では、各バージョンのソースコード・ビルド環境は残っているが、各バージョン間の変更の履歴は残っていないことが多い。つまり、過去にバージョン毎の変更履歴を蓄積してこなかった既存のシステムの改修には適用することができない。また、各バージョンからソースコードの差分情報を採取することは可能であるが、ロック処理やファイルI/Oのように、同じ処理内容だが変数名が異なることが多く、差分情報だけではソースコード改修時にこれまでの改修と同内容へ改修し、既知のバグを埋め込んでしまう問題が生じる可能性がある。
例えば、図2では、バージョンごとに担当者が変更され、コピーアンドペーストによってコードが改修されるような例を示している。ここでは、「コードE」が「コードB」のコピーにより作成されたものであるが、後のバージョンで「コードB」にバグが存在することが判明した際に、それぞれ異なる担当者が、「コードB」をコピーすることで「コードB’」さらには「コードB”」に改修したとする。すると、「コードE」にはバグが残ってしまい、また、これを改修する際に既知のバグが改善しない可能性がある、という問題が生じる。
このため、本発明の目的は、上述した課題である、ソフトウェア開発・改修時に既知のバグが改善しない、ということを解決することにある。
本発明の一形態である情報処理装置は、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を備えた、
という構成をとる。
また、本発明の一形態であるプログラムは、
情報処理装置に、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を実現させる、
という構成をとる。
本発明の一形態であるコードクローン判定方法は、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶し、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
という構成をとる。
本発明は、以上のように構成されることにより、ソフトウェア開発・改修時に既知のバグを改善させることができる。
コードクローンを説明するための図である。 コードクローンの問題点を説明するための図である。 コードクローンの一例を示す図である。 本発明の実施形態1における情報処理装置の構成を示すブロック図である。 図4に開示したコードクローン情報管理リポジトリに記憶されているデータの一例を示す図である。 実施形態1における情報処理装置の処理内容を説明するための図である。 実施形態1における情報処理装置の動作を示すフローチャートである。 実施形態1における情報処理装置の動作を示すフローチャートである。 実施形態1における情報処理装置の動作を示すフローチャートである。 実施形態1における情報処理装置の動作を示すフローチャートである。 実施形態1における情報処理装置の処理内容を説明するための図である。 実施形態1における情報処理装置の処理内容を説明するための図である。 本発明の付記1における情報処理装置の構成を示すブロック図である。
<実施形態1>
本発明の第1の実施形態を、図3乃至図12を参照して説明する。図3は、コードクローンを説明するための図である。図4乃至図5は、情報処理装置の構成を説明するための図である。図6乃至図12は、情報処理装置の処理内容や動作を説明するための図である。
[構成]
本発明の情報処理装置は、プログラムのソースコードからコードクローンを検出して、そのコードクローンの信頼性を判定するものである。ここで、まず、コードクローンについて、図3を参照して説明する。
図3に、プログラムのソースコードの一例を示す。ソースコード内(別ソースファイルや別バージョン間も含む)には、コピーアンドペーストなどの再利用などにより、同一又は類似するコード片が存在することとなる。このような同一又は類似のコード片が、予め設定された同一のパターンを有する場合には、これらをコードクローンと判断することとしている。つまり、図3で示すクローンパターンとは、ソースコード内のコード片を、コードクローンであると判断する基準と定義する。例えば、クローンパターンは、トークン単位でのコードクローン検出を行う場合には、予約語や括弧以外のユーザ固有名詞(変数名や関数名)を機能内部で定めたルールに従って変換(正規化)したコード片のことを指す(例を図3に示す)。以降の説明では、変換後のコード片をクローンパターンと呼ぶ。
本発明の情報処理装置は、演算装置や記憶装置を備えた一般的な情報処理装置である。そして、図4に示すように、情報処理装置1は、演算装置がプログラムを実行することで実現された、コードクローンバージョン単位抽出機能11と、コードクローンマッピング機能12と、警告表示機能13と、を備えている。また、情報処理装置1は、記憶装置に形成されたコードクローン情報管理リポジトリ10を備えている。
上記コードクローンバージョン単位抽出機能11(コードクローン抽出管理部)は、各バージョンのソースコードから、同一のコードパターンを有すると判定されるコードクローンを抽出する。例えば、コードクローンバージョン単位抽出機能11は、ソースコードから適当な長さのコード片を抽出し、コードクローンの検出を行う。
このとき、コードクローンバージョン単位抽出機能11は、外部システムであるコードクローン検出機能20(OSS等のコードクローン検出ツール)を利用したり、コードクローンの検出位置(開始/終了位置)を抽出可能な機能、検出したコードクローンのパターンを抽出可能機能、を実装する。また、コードクローンバージョン単位抽出機能11は、外部ツールとして、2ファイル間の差分を抽出するファイル差分検出機能30も利用したり、あるいは、かかる機能を実装する。例えば、ファイル差分検出機能30は、Unixのdiffコマンドと同様、どこにファイル差分が存在するかを検出する。なお、コードクローンバージョン単位抽出機能11は、本実施形態では、トークン単位でコードクローンを検出する機能を利用(あるいは実装)しているものとする。
また、コードクローンバージョン単位抽出機能11は、後述するように、既存のソースコードのコードクローンに関する情報を分析して蓄積する環境構築処理時に限らず、修正あるいは新規開発のソースコードに対する信頼性の判定や通知を行う判定時にも、コードクローンの検出を行う。
そして、コードクローンバージョン単位抽出機能11は、検出したコードクローンの抽出結果を表す情報を、ソースコード後のバージョン毎に、コードクローン情報管理リポジトリ10に記憶して保持する。コードクローン情報管理リポジトリ10は、図5に示すように、「ソースコード情報管理テーブル」、「クローンセットバージョン情報管理テーブル」、「コードクローン情報管理テーブル」を保持している。
「ソースコード情報管理テーブル」は、各バージョンのソースコードが格納されているディレクトリパスを保持する。「クローンセットバージョン情報管理テーブル」は、「クローンID」と「ファイル名」「開始位置」「終了位置」を、ソースコードのバージョンごとに保持する。「開始位置」は、コードクローンであると検出された最初のトークンの行番号、列番号を表している。「終了位置」は、コードクローンであると検出された最後のトークンの行番号、列番号を表している。「コードクローン情報管理テーブル」は、「クローンID」と「クローンパターン」、「トークン数」の情報を保持する。「クローンセットバージョン情報管理テーブル」と「コードクローン情報管理テーブル」が持つ「クローンID」は紐づけられる。「クローンパターン」は、コードクローン検出作業を行った際に、検出したコードクローンのパターンを保持することとなる。「トークン数」は「クローンパターン」のトークン数を表す。
コードクローンマッピング機能12(コードクローン抽出部)は、検出したコードクローンとクローンセットバージョン情報管理テーブル10内で管理しているコードクローンとを比較し、同じコードクローンか否かを判定する機能である。このため、コードクローンマッピング機能12は、ソースコードから検出されたコードクローンがクローンセットバージョン情報管理テーブル10に登録されている場合には、その登録されたコードクローンに対応付けて、バージョン毎に、検出されたコードクローンのファイル名や位置などの情報を追加登録する。また、コードクローンマッピング機能12は、信頼性の判定対象となる修正あるいは新規開発のソースコードからコードクローンを検出した際にも、当該コードクローンがクローンセットバージョン情報管理テーブル10に登録されているか否かの判定を行い、判定結果を警告表示機能に通知する。
警告表示機能13(コードクローン判定部)は、信頼性の判定対象となる修正あるいは新規開発のソースコードから検出されたコードクローンの信頼性を判定して、ユーザに通知を出力する機能である。このとき、警告表示機能13は、ソースコードのバージョンの変化に対して、クローンセットバージョン情報管理テーブル10内における、検出されたコードクローンの抽出数がどのように変化しているか、によって、判定結果やユーザに通知する内容が変わる。例えば、バージョンが上がるにつれてコードクローンのクローンセット数が低下している場合には、信頼性の低いコードであるとして判定してユーザに通知する。一方、バージョンが上がるにつれてコードクローンのクローンセット数が増加したり、一定値であったり、さらには、変化に関係なく所定値以上の数である場合には、信頼性の高いコードであるとして判定してユーザに通知する。
[動作]
次に、上述した情報処理装置1の動作を、図6乃至図12を参照して説明する。このとき、特に、図7乃至図10のフローチャートを参照して、動作を1つずつ順を追って説明する。
まず、既存のソースコードからコードクローンに関する情報を分析して蓄積する環境構築処理時の動作を説明する。はじめに、ユーザは、コードクローン検出を行う既存の各ソースコードが格納されているディレクトリパスを、図5に示すように、コードクローン情報管理リポジトリ10内のソースコード情報管理テーブルに登録する(図7のステップS1)。
続いて、コードクローンバージョン単位抽出機能11は、ソースコード情報管理テーブル内に登録されている各バージョンの中から、コードクローン検出を行っていない一番古いバージョンを選択し、コードクローン検出対象とする(図7のステップS2)。
最も古いバージョンを検出対象とした場合(図7のステップS3でYes)、そのバージョン内での全てのソースコードを対象に、コードクローン検出を行う(図7のステップS4)。そして、検出された全コードクローンについての情報を、ソースコードのバージョン毎に、コードクローン情報管理リポジトリ10に登録する(図7のステップS5)。具体的には、クローンID、コードパターン、トークン数をコードクローン情報管理テーブルに登録し、該当するバージョンの列に、クローンID、ファイル名、開始位置、終了位置を、クローンセットバージョン情報管理テーブルに登録する。
その後、確認していないバージョンのソースコードが存在する場合には(図7のステップS6でYes)、他のバージョンを検出対象とする。
続いて、コードクローンバージョン単位抽出機能11は、最も古いバージョン以外のバージョンが検出対象である場合(図7のステップS3でNo,S6でYes)、未作業の全ファイルを作業対象とする(図8のステップS7)。そして、作業対象となる1ファイルずつ、前バージョンとの差分を求め、コードクローン情報の変化を確認する。具体的には、1ファイルを選択して、ファイル差分検出機能を利用して前バージョンの同名ファイルとの差分情報を取得する(図8のステップS8)。このとき、該当バージョンで新規に作成されたファイル(前バージョンで存在しないファイル)である場合には(図8のステップS9でYes)、ファイル内のソースコード全てを対象にファイル内及び他ファイル間でのコードクローンの検出を行う(図8のステップS10)。
ここで検出されたコードクローン全てについて、コードクローンマッピング機能12は、コードクローン情報管理リポジトリ10に既に登録されているコードクローンかどうかを確認する(図8のステップS11)。既に登録されているコードクローンである場合(図8のステップS12でYes)、当該コードクローンが検出されたファイル名、開始位置、終了位置の情報を、コードクローン情報管理リポジトリ10内のクローンセットバージョン情報管理テーブルに、作業対象として該当するバージョンの列に登録する(図8のステップS13)。未登録である場合(図8のステップS12でNo)、クローンパターン情報も含め、コードクローン情報管理リポジトリ10に登録する(図8のステップS14)。つまり、クローンID、コードパターン、トークン数をコードクローン情報管理テーブルに登録し、該当するバージョンの列に、クローンID、ファイル名、開始位置、終了位置を、クローンセットバージョン情報管理テーブルに登録する。
その後は、確認していないコードクローンや、確認していないファイル、バージョンがなくなるまで、上述した処理が繰り返される(図8のステップS15,S16,図7のステップS6)。
一方、選択したファイルが前バージョンに存在する場合(図8のステップS9でNo)、ファイル差分検出機能で差分情報を取得する(図9のステップS17)。差分がない場合は(図9のステップS18でYes)、そのファイルは処理済みとして次のファイルを選択する。この時、そのファイルが持つコードクローンの情報として、クローンセットバージョン情報管理テーブルに記憶されている前バージョンから情報を抽出し、該当する作業対象バージョンの列に登録する(図9のステップS19)。つまり、作業対象となっているバージョンのファイルには、前バージョンと同一のコードクローンが存在することとして、前バージョンと同一のコードクローンの情報を登録する。
作業対象のファイルにおいて、前バージョンとの差分が存在する場合には(図9のステップS18でNo)、差分箇所の前後のソースコードから(図9のステップS20)、コードクローンを検出する(図9のステップS21)。具体的には、まずは差分が存在する箇所の行番号をキーとして、クローンセットバージョン情報管理テーブルの前バージョンからの差分のトークン数を抽出する。そして、コードクローン検出の閾値数から差分トークン数を減算した数のトークン数分、差分箇所の前後のソースコードを切り取り、この切り取ったソースコードからコードクローン検出を行う。つまり、図6の点線で囲った箇所のように、差分箇所の上下箇所に対して、コードクローンの検出を行う。
続いて、検出されたコードクローンについて、上述同様に、既に登録されているコードクローンであるかを確認する(図9のステップS22)。既に登録されているコードクローンである場合(図9のステップS23でYes)、当該コードクローンが検出されたファイル名、開始位置、終了位置の情報を、コードクローン情報管理リポジトリ10内のクローンセットバージョン情報管理テーブルに、作業対象として該当するバージョンの列に登録する(図9のステップS24)。
なお、前バージョンで差分箇所を含むコードクローンが修正によりコードクローンとして認識されなくなる場合は、作業対象である該当バージョンでは登録しないようにする。差分箇所を含まないコードクローンについては、前バージョンから変更されていないと判断し、前バージョンのコードクローン情報を作業対象バージョンへ登録する。この時、差分箇所の開始位置、終了位置情報にズレが生じるため、差分箇所以降の開始位置、終了位置情報については、差分箇所が追記・削除・修正のいずれであるかを確認する。差分箇所が追加された場合は、その分の行数・列数を開始位置、終了位置に加算し、削除された場合は減算し、修正の場合は加算あるいは減算を行い、コードクローン情報管理テーブルの作業対象バージョンへ登録する。
また、検出されたコードクローンが未登録である場合(図9のステップS23でNo)、上述同様に、クローンパターン情報も含め、コードクローン情報管理リポジトリ10に登録する(図9のステップS25)。
その後は、確認していないコードクローンや、確認していないファイル、バージョンがなくなるまで、上述した処理が繰り返される(図9のステップS26,図8のステップS16,図7のステップS6)。このようにして、既存のソースコードに対するコードクローン情報管理テーブルの環境構築を行う。
次に、修正あるいは新規開発のソースコードに対する信頼性の判定や通知を行うコードクローン判定処理について説明する。
ソースコード修正や新規開発後、まず、上記環境構築処理と同様に、対象となるソースコードについて、前バージョンとの差分箇所を抽出する(図10のステップS31)。差分箇所を抽出後、上記同様、その差分箇所を含む適当な長さのソースコードを対象に、コードクローンを検出する(図10のステップS32)。
そして、コードクローンマッピング機能12は、図11に示すように、検出したコードクローンが、コードクローン情報管理テーブルに既に登録済みであるかどうかを確認する(図10のステップS33)。登録済みである場合には(図10のステップS34でYes)、警告表示機能13は、バージョン遷移に伴うクローンセット数の増減を確認する(図10のステップS35)。このとき、クローンセット数が、最も古いバージョンから修正バージョンに至るまでの間に、一度でも減少している場合は、このコードクローンは「低品質なコードクローンの可能性あり」と認識し、「減らすべきコードクローン」として、ユーザに警告を提示する(図10のステップS36)。つまり、信頼性の低いコードクローンであると判定し、そのような通知を行うよう出力する。このとき、警告表示機能13は、通知と共に、検出されたコードクローンやクローンパターンをユーザに出力してもよい。
以上のように、本発明では、ソースファイルのバージョンごとのコードクローン情報を保持し、コードクローンのクローンセット数が減少していくコードクローンを、危険なコードクローン(削除すべきコードクローン)と見なし、バグ修正時にそのコードクローンが埋め込まれた場合にユーザへ警告を発することができる。これにより、ユーザは修正箇所が「既存バグを含む修正であるかもしれない」と認識することで、知らずに既知のバグを埋め込まないようにすることが可能である。
なお、本発明において、クローンセットとは、コードクローン検出を行った結果、一致あるいは類似したコード片の集合のことを指し、クローンセット数とは、クローンセット内の要素数のことを指す。
ここで、上述した危険な(信頼性の低い)コードクローンについて、さらに説明する。あるバージョンでのコードクローンについて、クローンセット数が前バージョンよりも減少している場合、(1)バグ修正によりクローンセット数が減少する場合、(2)「機能追加・変更を行うためコードクローン箇所を修正」「機能を利用しなくなったため、コードクローン箇所をコメントアウトや削除」など、バグに関係しない修正のためにクローンセット数が減少する場合、の大きく2種類のパターンが存在する。バグ修正時では、コードクローン検出を行い、バグが潜在している箇所は同様に修正を行うことから、クローンセット数が0となる可能性が高い。また、クローンセットのそれぞれのソースコードについて同様の修正を行うため、新しいコードクローンが生成され、修正前のコードクローンに登録されていたコード片の情報が新しいコードクローンに登録される。そのため、あるコードクローンについて、クローンセット数が減少し、減少したクローンセットの類似箇所が別コードクローンのクローンセットに追加された場合(別コードクローンのクローンセットが増加した場合)、減少したコードクローンは品質のリスクがある(危険なコードクローン)ということができる。コードクローン検出ツールが存在しない時代のソース修正時には、クローンセットを全て取り除くことができなかった場合もあり、クローンセット数は減少するが、0にならない場合も存在する。そのため、本発明では、クローンセット数が減少した場合はバグ修正である可能性を考慮し、クローンセット数が減少した場合は危険なコードクローンであると判断する。
つまり、これまでのバージョンについて、クローンセット数が減少していく、あるいは既に一つもクローンセットが存在しないコードクローンのパターンについて、修正箇所が上記コードクローンパターンの実装を行うと判断した場合(危険な修正だと判断した場合)、ユーザに修正を促す警告を出力する。
また、本発明では、上述したように、ユーザに対して、信頼性の低いコードクローンを通知するだけでなく、信頼性の高い、つまり、安全である可能性が高いコードクローンも判定して通知する。つまり、上述したように、修正ソースから検出したコードクローンが既に登録済みである場合に(図10のステップS34でYes)、警告表示機能13は、バージョン遷移に伴うクローンセット数の増減を確認するが(図10のステップS35)、このクローンセット数の変化に応じて信頼性が高いものも判定する。
具体的に、バージョンが新しくなるにつれてクローンセット数が増加傾向にあるコードクローンは、安全である可能性が高い(信頼性が高い)と判定する。また、バージョンが変化してもコードクローンのクローンセット数が変化しないものも信頼性が高いと判定する。さらには、バージョンの変化に関係なく、現時点でコードクローンのクローンセット数が予め設定された閾値よりも多いものは、信頼性が高いと判定する。上述したように判定した理由は、例えば、ソースコード修正を行う際には、信頼性が高いと思われるソースコードをコピー&ペーストし修正することがよくあるためである。
そして、警告表示機能13は、「安全なコードクローンの可能性あり」と認識したコードクローンについて、そのコードクローンの情報やコードパターンと共に、ユーザに通知を提示する(図10のステップS36)。これにより、ユーザは、安心してコードクローンを利用することができる。
なお、上記では、コードクローンとして検出されたコードを対象として信頼性の判定を行っているが、コードクローンとして検出が漏れたコードに対しても、信頼性の判定を行ってもよい。具体的には、まず、コードクローンマッピング機能12が、クローンセットバージョン情報管理テーブルに登録されている各クローン情報について、バージョンの経過に伴いクローンセット数が増加あるいは変化なしのクローンIDを取得する。そのクローンIDをキーとして、コードクローン情報管理テーブルからクローンパターンを取得する。取得したクローンパターンと修正ソースコード内のコード片との類似度を確認し、類似度が高い(事前に閾値を設定しておき、それ以上の値であれば高いとみなす)クローンパターンであるクローンID情報を、警告表示機能13へ出力する(類似の判定については後述)。つまり、この例では、対象となる修正コード内に存在するコードのうち、コードクローン情報管理テーブルに登録されているコードを、コードクローンとして検出する。
警告表示機能13は、入力されたクローンIDをキーとして、クローンセットバージョン情報管理テーブルから該当バージョンのクローンセット情報を採取する。採取したクローンセット情報のファイル名、開始位置、終了位置情報を取得し、類似するコードをユーザに提示することにより、ユーザはそのコードクローンにマッチするようコードを修正することができる。このようにすることで、コードクローンとして認識されないことにより、後にコードクローンを修正する際の修正漏れを防ぐことが可能となる。つまり、クローンセットとすることにより、まとめて修正可能となるため保守性も高まる。
ここで、上述した類似度を計測する方法の一例について、図12を参照して説明する。修正コード片Tのトークン数がクローンパターンのトークン数より少ない場合、適切にコードクローン検出が行えない。そのため、修正コード片T1のトークン数がクローンパターンのトークン数より少ない場合、コードクローン検出範囲の補正を行い、再度コードクローン検出を行う。コードクローン検出を行った結果、クローンパターン側でコードクローンと認識されたコード片の内、先頭のコード片よりも前の部分のトークン数E1(先頭未確認クローンパターントークン数)を算出する。そして、修正ソース側で検出されたコードクローンの先頭より未確認クローンパターントークン数分だけ前のコード片を、検出範囲D2として再設定する。また、検出された最後のクローンペアよりも後ろのコード片についても同様の方法で、最終未確認クローンパターントークン数E2を算出し、修正ソース側でコードクローン検出範囲D2として再設定する。この時、未確認クローンパターントークン数よりも修正ソース側のトークン数が多い場合は再設定を行わない。上記作業を行い、コードクローン検出範囲を再設定後、再度類似度を計測する。
<付記>
上記実施形態の一部又は全部は、以下の付記のようにも記載されうる。以下、本発明における情報処理装置(図13参照)、プログラム、コードクローン判定方法の構成の概略を説明する。但し、本発明は、以下の構成に限定されない。
(付記1)
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部101と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部102と、
を備えた情報処理装置100。
(付記2)
付記1に記載の情報処理装置であって、
前記コードクローン抽出管理部は、対象となるソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
前記コードクローン判定部は、新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
情報処理装置。
(付記3)
付記1又は2に記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が減少している当該コードクローンを、信頼性が低いコードとして判定する、
情報処理装置。
(付記4)
付記1乃至3のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が増加している当該コードクローンを、信頼性が高いコードとして判定する、
情報処理装置。
(付記5)
付記1乃至4のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が変化しない当該コードクローンを、信頼性が高いコードとして判定する、
(付記6)
付記1乃至5のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、前記コードクローンの抽出数が所定値以上である当該コードクローンを、信頼性が高いコードとして判定する、
情報処理装置。
(付記7)
付記1乃至6のいずれかに記載の情報処理装置であって、
前記コードクローン判定部は、前記コードクローンに対する信頼性の判定結果を、当該コードクローンのコードと共に出力する、
情報処理装置。
(付記8)
情報処理装置に、
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
を実現させるためのプログラム。
(付記8.1)
付記8に記載のプログラムであって、
前記コードクローン抽出管理部は、対象となるソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
前記コードクローン判定部は、新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
プログラム。
(付記9)
バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶し、
ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
コードクローン判定方法。
(付記9.1)
付記9に記載のコードクローン判定方法であって、
対象となるソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
コードクローン判定方法。
なお、上述したプログラムは、記憶装置に記憶されていたり、コンピュータが読み取り可能な記録媒体に記録されている。例えば、記録媒体は、フレキシブルディスク、光ディスク、光磁気ディスク、及び、半導体メモリ等の可搬性を有する媒体である。
以上、上記実施形態等を参照して本願発明を説明したが、本願発明は、上述した実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明の範囲内で当業者が理解しうる様々な変更をすることができる。
1 情報処理装置
10 コードクローン情報リポジトリ
11 コードクローンバージョン単位抽出機能
12 コードクローンマッピング機能
13 警告表示機能
100 情報処理装置
101 コードクローン抽出管理部
102 コードクローン判定部

Claims (9)

  1. バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
    ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
    を備えた情報処理装置。
  2. 請求項1に記載の情報処理装置であって、
    前記コードクローン抽出管理部は、対象となるソースコードから、前記記憶装置に記憶されている前記コードクローンと所定基準により同一であると判定される新たなコードクローンを抽出し、
    前記コードクローン判定部は、新たに抽出された前記コードクローンについて、前記記憶装置に記憶されているソースコードのバージョンの変化に伴う抽出数の変化を調べ、当該抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
    情報処理装置。
  3. 請求項1又は2に記載の情報処理装置であって、
    前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が減少している当該コードクローンを、信頼性が低いコードとして判定する、
    情報処理装置。
  4. 請求項1乃至3のいずれかに記載の情報処理装置であって、
    前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が増加している当該コードクローンを、信頼性が高いコードとして判定する、
    情報処理装置。
  5. 請求項1乃至4のいずれかに記載の情報処理装置であって、
    前記コードクローン判定部は、ソースコードのバージョンが新しく変化するに伴い前記コードクローンの抽出数が変化しない当該コードクローンを、信頼性が高いコードとして判定する、
  6. 請求項1乃至5のいずれかに記載の情報処理装置であって、
    前記コードクローン判定部は、前記コードクローンの抽出数が所定値以上である当該コードクローンを、信頼性が高いコードとして判定する、
    情報処理装置。
  7. 請求項1乃至6のいずれかに記載の情報処理装置であって、
    前記コードクローン判定部は、前記コードクローンに対する信頼性の判定結果を、当該コードクローンのコードと共に出力する、
    情報処理装置。
  8. 情報処理装置に、
    バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶するコードクローン抽出管理部と、
    ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定するコードクローン判定部と、
    を実現させるためのプログラム。
  9. バージョン毎のソースコードから、それぞれ所定基準により同一であると判定されるコードであるコードクローンを抽出して、当該コードクローン毎に各バージョンにおける抽出結果を記憶装置に記憶し、
    ソースコードのバージョンの変化に伴う、当該バージョン毎の前記コードクローン毎の抽出数の変化に基づいて、当該コードクローンの信頼性を判定する、
    コードクローン判定方法。
JP2015064715A 2015-03-26 2015-03-26 情報処理装置 Active JP6543990B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2015064715A JP6543990B2 (ja) 2015-03-26 2015-03-26 情報処理装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015064715A JP6543990B2 (ja) 2015-03-26 2015-03-26 情報処理装置

Publications (2)

Publication Number Publication Date
JP2016184323A true JP2016184323A (ja) 2016-10-20
JP6543990B2 JP6543990B2 (ja) 2019-07-17

Family

ID=57242880

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015064715A Active JP6543990B2 (ja) 2015-03-26 2015-03-26 情報処理装置

Country Status (1)

Country Link
JP (1) JP6543990B2 (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2021140433A (ja) * 2020-03-04 2021-09-16 株式会社日立製作所 開発支援方法、開発支援装置及びプログラム
WO2022034919A1 (ja) * 2020-08-13 2022-02-17 株式会社Sider 情報処理装置、情報処理方法、プログラム及び情報処理システム

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011108059A (ja) * 2009-11-19 2011-06-02 Canon Inc 類似ソースコード管理システム及びプログラム並びに記録媒体
JP2014503910A (ja) * 2010-12-20 2014-02-13 マイクロソフト コーポレーション コードクローンの通知およびアーキテクチャの変更の視覚化

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2011108059A (ja) * 2009-11-19 2011-06-02 Canon Inc 類似ソースコード管理システム及びプログラム並びに記録媒体
JP2014503910A (ja) * 2010-12-20 2014-02-13 マイクロソフト コーポレーション コードクローンの通知およびアーキテクチャの変更の視覚化

Non-Patent Citations (6)

* Cited by examiner, † Cited by third party
Title
MIRYUNG KIM, VIBHA SAZAWAL, DAVID NOTKIN AND GAIL C. MURPHY: "An Empirical Study of Code Clone Genealogies", PROCEEDINGS OF THE 10TH EUROPIAN SOFTWARE ENGINEERING CONFERENCE HELD JOINTLY WITH 13TH ACM SIGSOFT, JPN7018003933, 5 September 2005 (2005-09-05), US, pages 187 - 196 *
吉田則裕、崔 恩瀞、肥後芳樹、楠本真二、井上克郎: "産学連携による携帯端末用ソフトウェアに対する品質改善の取り組み", ソフトウェアエンジニアリングシンポジウム2012[ONLINE], JPN6018045246, 21 August 2012 (2012-08-21), JP, pages p.1−6 *
堀田圭佑、肥後芳樹、楠本真二: "オープンソースソフトウェアにおけるコードクローンの消失に関する調査", 電子情報通信学会技術研究報告, vol. Vol.112,No.275, JPN6018045247, 25 October 2012 (2012-10-25), JP, pages p.111−116(SS2012-42) *
藤原雄介、藤原賢二、吉田則裕、飯田 元: "版管理システムを用いた開発プロセスに適したコードクローン修正支援ツールの検討", 情報処理学会研究報告[ONLINE], vol. 2013, no. 30, JPN6018045250, 17 October 2013 (2013-10-17), JP, pages p.1−6 *
西田皓司、伏田享平、川口真司、飯田 元: "コードクローンに対する変更の一貫性と欠陥発生との関連性に関する分析", 電子情報通信学会技術研究報告, vol. Vol.109,No.456, JPN6018045248, 1 March 2010 (2010-03-01), JP, pages p.67−72(SS2009-59) *
門田暁人、佐藤慎一、神谷年洋、松本健一: "コードクローンに基づくレガシーソフトウェアの品質の分析", 情報処理学会論文誌, vol. 第44巻,第8号, JPN6018045254, 15 August 2003 (2003-08-15), JP, pages p.2178−2188 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2021140433A (ja) * 2020-03-04 2021-09-16 株式会社日立製作所 開発支援方法、開発支援装置及びプログラム
JP7296904B2 (ja) 2020-03-04 2023-06-23 株式会社日立製作所 開発支援方法、開発支援装置及びプログラム
WO2022034919A1 (ja) * 2020-08-13 2022-02-17 株式会社Sider 情報処理装置、情報処理方法、プログラム及び情報処理システム

Also Published As

Publication number Publication date
JP6543990B2 (ja) 2019-07-17

Similar Documents

Publication Publication Date Title
US10261884B2 (en) Method for correcting violation of source code and computer readable recording medium having program performing the same
WO2015135286A1 (zh) 提取pe文件特征的方法及装置
KR102160780B1 (ko) 버그 정정 시스템 및 버그 정정 방법
JP5845888B2 (ja) ソフトウェア修正装置、ソフトウェア修正システム、ソフトウェア修正方法、及び、ソフトウェア修正プログラム
US10409572B2 (en) Compiled file normalization
US8468512B2 (en) Abstracting benefit rules from computer code
JP6543990B2 (ja) 情報処理装置
WO2015135291A1 (zh) 病毒检测方法及装置
JP5077455B2 (ja) 脆弱性監査プログラム、脆弱性監査装置、脆弱性監査方法
KR102086749B1 (ko) 텍스트 마이닝을 이용한 안드로이드 실행 파일의 유사도 측정 시스템 및 방법
JP5293521B2 (ja) デザインルールチェック検証装置およびデザインルールチェック検証方法
JP6451417B2 (ja) デバッグ支援装置、デバッグ支援システム、デバッグ支援方法、および、デバッグ支援プログラム
US20220334941A1 (en) Pattern extraction and rule generation apparatus, method, and program
JP6235945B2 (ja) ソースコード生成および提供装置、並びにソースコード生成および提供方法
JP5741265B2 (ja) プログラム改善支援システム
JP2004326337A (ja) コード解析プログラム、コード解析自動化プログラム及び自動コード解析システム
JP2005284785A (ja) プログラム開発装置
KR101523842B1 (ko) 번역 관리 방법 및 시스템
JP5578625B2 (ja) プログラム分析装置、プログラム分析方法、及びプログラム
JP5293563B2 (ja) 言語変換装置、言語変換方法およびプログラム
JP2008020972A (ja) ソフトウエア解析システム
JP6141563B2 (ja) ソフトウェア管理装置およびソフトウェア管理方法
JP6442908B2 (ja) 修正装置、翻訳装置、修正方法、および、コンピュータ・プログラム
JP5273057B2 (ja) モジュール更新検出プログラム、モジュール更新検出方法及びモジュール更新検出装置
JP5949889B2 (ja) ソフトウェア開発支援装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180206

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20181031

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20181120

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20181227

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190603

R150 Certificate of patent or registration of utility model

Ref document number: 6543990

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150