社団法人 電子情報通信学会
THE INSTITUTE OF ELECTRONICS,INFORMATION AND COMMUNICATION ENGINEERS

信学技報
TECHNICAL REPORT OF IEICE.

高い拡張性を備えた
SaaS 型コードクローン分析システムの提案
松島 一樹†

井上 克郎†† 大阪大学大学院情報科学研究科 〒560—0871 大阪府吹田市山田丘 1—5
E-mail: †{k-matusm,inoue}@ist.osaka-u.ac.jp
あらまし

効率的なコードクローンの分析の支援を目的としたツールに関する研究が数多く行われている．しかし，既存のツールは特定のコードクローン検出ツールにのみ対応していたり， 外部サービスとの連携が困難であったりするなど，いくつかの問題を抱えている．これらの問題を解決するため，本研究では SaaS 型コードクローン分析システムを提案する．これはユーザに WEB クライアントを提供し，サーバ上でコードクローンの検出を行うものである．
バックエンドには既存の検出ツールを使用するが，検出ツール側にシステムとデータの伝達を行う数個の処理を実装するだけで任意のツールを追加することができる．また，コードクローン分析や検出結果に関する REST API を公開しており，外部サービスと容易に連携可能である．OSS に対し提案システムを用いてコードクローンを検出・分析し，提案システムがより正確な分析を可能にすることを確認した．
キーワード コードクローン，SaaS, ソフトウェア保守

A Proposal for a SaaS-based Code Clone Analysis Environment
with an Extensible Architecture
Kazuki MATSUSHIMA† and Katsuro INOUE†† Graduate School of Information Science and Technology, Osaka University 1–5, Yamadaoka, Suita,
Osaka, 560–0871, Japan
E-mail: †{k-matusm,inoue}@ist.osaka-u.ac.jp
Abstract Many studies on tools for eﬃcient code clone analysis have been conducted in the past. However, thesetools have some issues such that they support only a few kinds of code clone detectors or they are less compatible
with external services. To address them, we propose a SaaS-based code clone analysis environment in this paper.
This oﬀers a WEB client and detects code clones in a project on the server side. Existing code clone detectors areused as the back-end of this system and any code clone detectors can be used if just a few functions for communicating to the system are implemented. Furthermore, it also exposes REST APIs for code clone analysis and detection
results so that external services can cooperate with it easily. By identifying and analyzing code clones of an OSS
using our proposed system, we conﬁrmed that it enables more accurate code clone analysis.
Key words Code Clone, SaaS, Software Maintenance1. ま え が き

工程における大きな問題の一つとして指摘されている [1] [2]．
そこで，効率的なコードクローンの分析の支援を目的としたソースコード中に存在する，全く同一もしくは互いに類似しツールが数多く提案されている．その例として Gemini [9] やたコード片のことをコードクローンと呼ぶ．コードクローンは，

VisCad [12] が挙げられるが，いずれもスタンドアローンのア

主に既存のソースコードのコピー・アンド・ペーストによる再プリケーションであり，利用するためにはローカル環境へのイ利用やコード生成ツールによる自動生成によって発生する [8]．

ンストールが必要，特定の検出ツールにのみ対応，外部サービ

既存研究において，コードクローンはバグの発生や伝播と関連スとの連携が困難といった問題がある．

していることが明らかになっており，ソフトウェア開発の保守

Bandi らによって提案された Clone Swarm [6] はクラウド—1—

型コードクローン分析ツールであり，ローカル環境へのインストールが不要で，REST API が公開されているため外部サービスとの連携が容易といった特徴を持つ．一方で，コードクロー

表 1: 代表的な HTTP メソッドとその機能
HTTP メソッド 機能
GET

リソースの取得

ンの検出には NiCad [11] のみが使用可能であり，その他の検POSTリソースの新規作成出ツールには対応していない．

PATCH

リソースの部分更新

DELETEリソースの削除

そこで本研究では，多様なコードクローン検出ツールに対応可能な SaaS 型コードクローン分析システムを提案する．
既存の分析ツールでは特定の検出ツールに依存してユーザイ開発者がコードクローンの管理や修正を行うことで，これらンターフェイスが実装されていたが，提案システムでは外部かコードクローンによる影響を抑制しソフトウェアの保守性を維ら与えられた検出パラメータ定義から検出パラメータを設定す持することができる．そのため，開発者がコードクローンに関るフォームを動的に生成する．

する情報を認識することは重要である．

また，提案システムでは既存の複数のコードクローン検出

2. 2 Software as a Service (SaaS)

ツールをバックエンドとして使用するが，検出ツールの起動方

Software as a Service (以下，SaaS) とは，クラウド上にホ法および出力結果のフォーマットについて共通の仕様を定めた．

ストされ，インターネットを経由して利用可能なソフトウェア

これらの仕様を満たした検出ツールはシステムに一切変更を加およびその形態を意味し，近年のインターネットの拡大とインえることなくバックエンドに新たに追加することができる．

フラの整備に伴って急速に普及している [3]．

更に，提案システムではコードクローン分析や検出結果に関従来，ソフトウェアを利用するためには，ローカル環境へイする REST API を公開する．REST API は HTTP を利用しンストールし，セットアップを行う必要があった．一方，SaaSたステートレスな WEB API の設計原則であり，多くの WEBはインストール作業が不要であり，ブラウザからサービスサイサービスで活用されている一般的なものである．

トへアクセスするだけで利用可能であるため，従来のソフト提案システムは sel.ist.osaka-u.ac.jp/webapps/ccx/ で公開している．

ウェアと比較して利便性において優れている．

2. 3 REST API

以降，2. では，本研究の背景としてコードクローン，SaaS，Fielding は論文 [4] において，HTTP を用いた API の 設計

REST API，そして関連研究について述べる．3. では提案シス

原則として REST (REpresentational State Transfer) 原則をテムとその詳細について述べる．4. では提案システムの適用事提案した．REST 原則では，クライアント - サーバ型アーキテ例について述べる．最後に 5. では本研究のまとめについて述

クチャであること，ステートレスであること，リソースが URIべる．にマッピングされていることなどが定められており，これらを2. 背景満たした API を REST API と呼ぶ．

REST API では HTTP メソッドに基づいてリソースに対す
2. 1 コードクローンる操作を行う．表 1 に代表的な HTTP メソッドを示す．

コードクローンとは，ソースコード中に存在する「全く同一」

例えば，ユーザ一覧を表すリソース /users に対して GET メもしくは「互いに類似した」コード片を指す．コードクローン

ソッドでリクエストを送信すると，ユーザ一覧が返却される．

は，主に既存のソースコードのコピー・アンド・ペーストによっ同様に，POST メソッドでリクエストを送信すると，新規ユーて発生する．一般的に互いにコードクローンとなる 2 つのコーザが作成される．POST メソッドでは，リソースの作成に必要ド片の組をクローンペアと呼び，コードクローンの同値類をクな情報をリクエストに含めることが一般的である．

ローンセットと呼ぶ．
コードクローンは，既存研究においてソフトウェア保守を困REST API は Twitter や YouTube，Amazon をはじめとする多くの WEB サービスで利用されている．

難にする要因の一つとして指摘されている．Barbour らは，複2. 4 関 連 研 究

数のコードクローン検出ツールを使用して，システムの開発履コードクローンを管理・修正することは，ソフトウェアの保歴におけるコードクローン変化のパターンを分析した [1]．そし守性を維持するために重要である．しかし，全てのコードクて，他の変化パターンと比較して，クローンペアでなくなったローンを手作業で検出することは非現実的であるため，効率的コード片同士が一方のコード片に変更が加えられたことで再びなコードクローンの検出・分析を目的としたツールに関する研クローンペアとなるパターンと，両方のコード片に変更が加え究が数多く行われている．

られていたクローンペアがさらなる変更によりクローンペアでコ ー ド ク ロ ー ン の 検 出 に 関 し て CCFinder [5]，Sourcer-はなくなるパターンが，バグが混入する可能性が高いことを明erCC [10]，NiCad [11] などのツールが提案されている．これら

らかにした．のツールはコマンドラインで動作するが，検出結果をファイルまた，Mondal らは，7 個のプロジェクトを対象にコードクローンの変更履歴を調査し，過去にバグ修正が行われたコードクローンのうち 18.42% がバグ伝播に関与していることを明ら名や行番号などの組み合わせとして出力するため，検出結果を直感的に理解することは困難である．
そこで，これらのツールの検出結果を可視化して，効率的かにした [2]．

—2—

リポジトリのインポート・同期

ソースコードの参照

Git リポジトリ

ファイルシステム

履歴の取得

検出

ユーザリクエスト

検出結果の保存履歴 DB

検出WEB クライアント

検出終了の通知
実行結果の提示

コアサーバ

検出パラメータの送信

API サーバ

ユーザリクエスト

管理サーバ

検出リクエスト DB

検出リクエストの追加

検出リクエストの取得

外部サービス

検出パラメータ
定義ファイル

コードクローン
検出サーバ群

図 1: 提案システムのアーキテクチャなコードクローンの分析を支援するツールが提案されている．

必要な処理をコアサーバに依頼する．

植田らは CCFinder の出力結果を散布図やメトリクスグラフ

コアサーバは，API サーバからのリクエストに応じて，プとして可視化するツール Gemini を提案している [9]．また，ロジェクトの管理や検出結果の解析などを行う．また，外部のAsaduzzaman らは NiCad の出力結果を散布図やラジアルマッ

Git リポジトリからソースコードを取得し，ファイルシステムプ，ツリーマップとして可視化するツール VisCad を提案してに保存する機能を持つ．コードクローン検出を実行するリクエ

いる [12]．

ストに対しては，パラメータ定義ファイルからパラメータ定義

これらの分析ツールを利用するためには，ツール自体に加え，を読み取り，パラメータ値のバリデーションを行い，正当なリ検出ツールをローカル環境にインストールし，セットアップをクエストであれば，検出リクエストを検出リクエスト DB に追行う必要がある．また，Gemini は CCFinder に，VisCad は加する．

NiCad にのみ対応しており，その他の検出ツールの結果を分析することは困難である．

管理サーバはコードクローン検出に関する処理を管理するサーバである．検出リクエスト DB からリクエストを取得し，Bandi らはクラウド型コードクローン分析ツール Clone

負荷状況を考慮しつつ，コードクローン検出サーバにコードク

Swarm を提案した [6]．Clone Swarm は WEB クライアント

ローン検出の実行を指示する．また，検出完了の通知を受信すから操作することができ，サーバ上でコードクローン検出を行ると検出履歴 DB に検出結果を保存する．

う．そのため，ローカル環境にツールをインストールする必要

コードクローン検出サーバは，管理サーバからコードクローがなく既存のツールと比較して容易に利用することが可能であン検出パラメータを受信すると，内部で検出ツールを起動してる．しかし，Clone Swarm は NiCad にのみ対応しており，そコードクローンの検出を行うサーバである．コードクローン検の他のコードクローン検出ツールを使用することはできない．

出が完了すると，検出結果を管理サーバに送信する．管理サー3. 提案システム
本研究では，SaaS 型コードクローン分析システムを提案する．以降，提案システムのアーキテクチャおよび各機能の詳細について述べる．

バ - コードクローン検出サーバ間のデータ伝達には共通の仕様が定められており，この仕様を満たす任意のコードクローン検出サーバをシステムのバックエンドに追加することが可能である．

WEB クライアントは，ブラウザから操作可能な提案システ

3. 1 アーキテクチャ

ムのフロントエンドである．プロジェクトのインポートやコー

図 1 に提案システムのアーキテクチャを示す．提案システム

ドクローン検出の実行など，提案システムが提供する様々な機は数種類のサーバ，データベースおよび WEB クライアントか能を利用可能である．また，コアサーバの読み取ったパラメーら構成される．

タ定義から動的に検出パラメータを設定するフォームを生成す

API サーバは WEB クライアントや外部サービスと直接通る機能を持つ．

信を行うサーバであり，ユーザ認証機能を兼ね備える．また，

3. 2 WEB クライアント

WEB クライアントや外部サーバからのリクエストを解析し，提案システムはブラウザからのアクセスに対し WEB クライ—3—

(a) プロジェクトのインポート画面(b) 検出パラメータ設定画面

図 2: WEB クライアントの画面例

アントを提供する．WEB クライアントの実際の画面例を図 2

nicad:
name: NiCadparameters:- key: directorylabel: Target Directory
type: directory
revisionKey: revision- key: revisionlabel: Target Revisiontype: revision- key: granularity
label: Granularity
type: selectrule:default: functions
values: [Functions, Blocks]- key: languagelabel: Language
type: selectrule:default: C
values: [C,Java,C#,Python,PHP,Ruby,WSDL,ATL]- key: thresholdlabel: Threshold
type: float
rule:default: 0.3
min: 0max: 1- key: minsize
label: Minimum size
type: int
rule:に示す．
図 2a では外部の Git リポジトリをインポートする．ユーザがフォームに値を入力するとバリデーションが行われ，入力が正しい Git リポジトリ URL であれば IMPORT ボタンが有効化される．正しい Git リポジトリ URL でなければ，フォームにエラーメッセージが表示され，正しい URL の入力を促す．
図 2b ではインポートしたリポジトリに対し，検出パラメータを設定し，コードクローン検出を実行することができる．

Detector セクションから使用する検出ツールとそのバージョンを，Parameters セクションで検出パラメータを設定する．
ユーザが選択する検出ツールに応じて Parameters セクションに表示されるフォームは変化する．
従来のツールでは，このような検出パラメータ設定フォーム

図 3: NiCad の検出パラメータ定義の例のユーザインターフェイス はプログラムにハードコーディングされていたため，新たな検出ツールに対応させるためには

表 2: 検出パラメータ定義のフィールドソースコードの修正が必要であった．提案システムでは，コアサーバに与えられた検出パラメータ定義をもとに動的に検出パラメータ設定フォームを生成する．

フィールド名

属性

機能

key

必須

検出パラメータのフィールド名

label

任意

WEB クライアントで表示されるパラメータ名

3. 2. 1 検出パラメータ定義ファイル

required

任意

検出パラメータが必須であるかどうか

検出パラメータ定義ファイルは YAML 形式のテキストファtype

必須

検出パラメータの種類

イルであり，検出ツールごとにパラメータ定義を記述する．図rule

必須

検出パラメータの制約

2b の検出パラメータ設定フォームを生成する検出パラメータ
定義の一部を図 3 に示す．nicad は検出ツールの ID，name はWEB クライアントに表示される検出ツールの名前である．また，parameters には検出パラメータ定義を配列で記述する．検出パラメータ定義に記述するフィールドを表 2 に示す．検出パ
ラメータ定義の type には directory, revision, input, int, ﬂoat,select，switch の 7 種類が存在する．
WEB クライアントでは，検出パラメータ定義ファイルに記述された内容から検出パラメータ設定フォームを動的に生成し，各パラメータの値が rule に記述された制約を満たしているかリアルタイムでバリデーションを行う．制約を満たしていなければ，対応するエラーメッセージをフォームに表示する．

3. 2. 2 検出結果の分析
WEB クライアントでは，ユーザが選択した 2 つの検出履歴から検出結果を比較することができる．検出結果の比較には論文 [7] で提案された手法を用いる．

—4—図 4: 表示される散布図の例

図 6: 比較結果の散布図

ジェクトと呼ぶ．インポートに成功するとプロジェクト名やインポート日時を JSON 形式で返却する．失敗した場合，エラー情報を JSON 形式で返却する．

POST /projects/{name}/history{name} で指定されたプロジェクトに対してコードクローン検出を行う．リクエストには検出に使用する検出ツールや検出パラメータが含まれる．与えられた検出パラメータに間違いがな
く，リクエストが検出リクエスト DB に追加されると，リクエストに対応する検出履歴 ID を JSON 形式で返却する．失敗した場合，エラー情報を JSON 形式で返却する．
図 5: コードクローンのソースコード表示画面の一部

GET /projects/{name}/history/{id}/artifacts/clones.json{name} で指定されたプロジェクトの，{id} と等しい ID を持
つ検出履歴の検出結果を JSON 形式で返却する．

図 4 は WEB クライアントに出力される散布図の例である．
散布図には左上を原点として，縦横両軸に同じ順番でファイル

4. 適 用 事 例が並べられている．他の検出結果に含まれていないコードク

本章では，提案システムを用いたコードクローン分析の事例

ローンが多いほど，対応する点が赤色に近い色で表示される．

について述べる．この事例では，異なる検出ツールを用いて逆に，他の検出結果に含まれているコードクローンが多いほど，コードクローンを検出し，検出結果を比較することで多角的にその点は黄色に近い色で表示される．完全に他の検出結果と一コードクローンを分析する．そして，一方では検出できなかっ致する場合のみ，その点は緑色で表示される．

た集約可能なコードクローンを発見することを目的とする．

また，図 5 のように，散布図の各点に対応するコードクロー

まず，提案システムに Joda-Time（注 1） の Git リポジトリをインをソースコードレベルで確認することもできる．この画面でンポートし，NiCad と CCVolti [13] を使用してコードクローン

は， 2 つの検出結果の両方に含まれているコードクローンは黄検出を行った．NiCad は Linux 上で，CCVolti は Windows 上

緑色で，片方の検出結果にのみ含まれているコードクローンはで動作するコードクローン検出ツールである．これらのツール

どちらに含まれているかによってオレンジ色もしくは紫色でそを同一マシンで動作させるためには，仮想マシンや Cygwin（注 2）

れぞれハイライトされる．などのインストールが必要であるが，提案システムではブラウ

3. 3 REST API

ザからアクセスするだけで利用することができる．

提案システムは外部サービスからアクセス可能な REST API

次に，提案システムを用いて CCVolti と NiCad の検出結を提供している．REST API は多くの WEB サービスで利用果を比較した．図 6 に WEB クライアントに表示された比較されている一般的な HTTP ベースの API である．提案シス

結果の散布図を示す．緑色の点は NiCad で検出されたコードテムが提供する REST API のうちいくつかを以下に示す．

クローンが全て CCVolti でも検出されていることを意味する．

POST /projects

また，赤色やオレンジ色の点は NiCad でのみ検出されたコー

外部の Git リポジトリをファイルシステムにインポートする．

ドクローンが存在していることを意味する．NiCad でのみ検出

リクエストには対象となる Git リポジトリの URL が含まれる．インポートしたリポジトリに対する一連の検出作業をプロ（注 1）：https://github.com/JodaOrg/joda-time.git（注 2）：https://www.cygwin.com/—5—EthiopicChronology.java
public static EthiopicChronology getInstance(DateTimeZone zone, int minDaysInFirstWeek) {if (zone == null) {zone = DateTimeZone.getDefault();}

if (zone == DateTimeZone.UTC) {// First create without a lower limit.
chrono = new EthiopicChronology(null, null, minDaysInFirstWeek);// Impose lower limit and make another EthiopicChronology.
DateTime lowerLimit = new DateTime(1, 1, 1, 0, 0, 0, 0, chrono);chrono = new EthiopicChronology(LimitChronology.getInstance(chrono, lowerLimit, null),null, minDaysInFirstWeek);} else {chrono = getInstance(DateTimeZone.UTC, minDaysInFirstWeek);
chrono = new EthiopicChronology(ZonedChronology.getInstance(chrono, zone), null, minDaysInFirstWeek);}
chronos[minDaysInFirstWeek - 1] = chrono;}}}
return chrono;}

た．提案システムでは，多様なコードクローン検出ツールに対応するため，コードクローン検出サーバとシステム間でデータ伝達方式の共通仕様を定め，検出パラメータの定義を外部から与える．これにより，システムに手を加えることなく新たな検出ツールをバックエンドに追加し，動的に検出パラメータ設定フォームを生成することが可能となった．
また，適用事例から，提案システムを用いることにより異なる検出ツールの検出結果の比較を容易に行えることを示した．
今後の課題として，提案システムに散布図やツリーマップなどのコードクローン可視化手法を取り入れ，既存の分析ツールと比較した使いやすさや有用性について評価を行うことが挙げ

CopticChronology.java
public static CopticChronology getInstance(DateTimeZone zone, int minDaysInFirstWeek) {if (zone == null) {zone = DateTimeZone.getDefault();}

if (zone == DateTimeZone.UTC) {// First create without a lower limit.
chrono = new CopticChronology(null, null, minDaysInFirstWeek);// Impose lower limit and make another CopticChronology.
DateTime lowerLimit = new DateTime(1, 1, 1, 0, 0, 0, 0, chrono);chrono = new CopticChronology(LimitChronology.getInstance(chrono, lowerLimit, null),null, minDaysInFirstWeek);} else {chrono = getInstance(DateTimeZone.UTC, minDaysInFirstWeek);
chrono = new CopticChronology(ZonedChronology.getInstance(chrono, zone), null, minDaysInFirstWeek);}
chronos[minDaysInFirstWeek - 1] = chrono;}}}return chrono;}

図 7: NiCad でのみ検出されたクローンペアされたコードクローンの 1 つを図 7 に示す．
この 2 つのコードクローンは図 7 中下線部の違いを除いて一致している．CCVolti は TF-IDF を用いてコードブロックをベクトル化し，そのベクトルのコサイン類似度からコードクローンを判定する．この適用事例ではこのコサイン類似度の閾値として 0.9 を用いたが，図 7 のコード片はコサイン類似度が閾値を下回ったため CCVolti では検出されなかったと考えられる．CopticChronology クラスと EthiopicChronology ク
ラスのコンストラクタの動作は，共に親クラスである Basic-FixedMonthChronology クラスのコンストラクタを呼び出すのみである．そのためこのコードクローンを解消するためには

BasicFixedMonthChronology クラスに getInstance メソッドを集約すれば良い．実際に手作業でこのコードクローンを集約したところ約 40 行のコードを削減することができた．また，集約後のソースコードは Joda-Time リポジトリに用意してあるテストを全て通過した．
このように，異なる検出ツールから得られた検出結果を比較することで，より正確なコードクローン分析が可能となる．従来，動作環境の違いや煩雑なセットアッププロセスなどから同一マシン上で複数の検出ツールを利用することは手間のかかる作業であった．提案システムではブラウザからアクセスするだけで複数の検出ツールを利用することができ，より正確なコードクローン分析を支援する．

5. ま と められる．
提案システムは sel.ist.osaka-u.ac.jp/webapps/ccx/ で公開されており，GitHub や GitLab などでホスティングされた Git リポジトリに対してコードクローンの検出を行うことができる．
謝辞

本研究は JSPS 科研費 18H04094 の助成を受けた．
文

献[1] L. Barbour, F. Khomh, and Y. Zou, "An empirical studyof faults in late propagation clone genealogies," Journal ofSoftware: Evolution and Process, Vol. 25, pp. 1139–1165,2013.
[2] M. Mondal, B. Roy, C. K. Roy, and K. Schneider, "An Empirical Study on Bug Propagation through Code Cloning,"
Journal of Systems and Software, Vol. 158, 2019.
[3] V. Cho and A. Chan, "An integrative framework of comparing SaaS adoption for core and non-core business operations:
An empirical study on Hong Kong industries," Information
Systems Frontiers, Vol. 17, pp. 629–644, 2015.
[4] R. T. Fielding, "Architectural styles and the design ofnetwork-based software architectures," University of California, Irvine, 2000.
[5] T. Kamiya, S. Kusumoto, and K. Inoue, "CCFinder: amultilinguistic token-based code clone detection system forlarge scale source code," IEEE Transactions on Software
Engineering, Vol. 28, pp. 654–670, 2002.
[6] V. Bandi, C. K. Roy, and C. Gutwin, "Clone Swarm: A
Cloud Based Code-Clone Analysis Tool," in Proc. IWSC
2020, pp. 52–56, 2020.
[7] K. Matsushima and K. Inoue, "Comparison and Visualization of Code Clone Detection Results," in Proc. IWSC 2020,pp. 45–51 , 2020.
[8] E. Juergens, F. Deissenboeck, B. Hummel, and S. Wagner,"Do code clones matter?," in Proc. ICSE 2009, pp. 485–495,2009.
[9] Y. Ueda, Y. Higo, T. Kamiya, S. Kusumoto, and K. Inoue,"Gemini: Code clone analysis tool," in Proc. ISESE 2002,
pp. 31–32, 2002.
[10] H. Sajnani, V. Saini, J. Svajlenko, C. K. Roy, and C. V.
Lopes, "SourcererCC: scaling code clone detection to bigcode,", in Proc. ICSE 2016, pp. 1157–1168, 2016.
[11] J. R. Cordy and C. K. Roy, "The nicad clone detector," inProc. ICPC 2011, pp. 219–220, 2011.
[12] M. Asaduzzaman, C. K. Roy, and K. Schneider, "VisCad:ﬂexible code clone analysis support for NiCad," in Proc.
IWSC 2011, pp. 77–78. 2011.
[13] 横井 一輝, 崔 恩瀞, 吉田 則裕, 井上 克郎, "情報検索技術に基づく細粒度ブロッククローン検出," コンピュータソフトウェア,Vol.35, No.4, pp.16–36, 2018.

本研究では，SaaS 型コードクローン分析システムを提案し—6—