【論文メモ】A systematic literature review on source code similarity measurement and clone detection: techniques, applications, and challenges

 

原論文

A systematic literature review on source code similarity measurement (arxiv.org)


Abstract

ソースコードの類似性を測定し評価することは、コード推薦、重複コード、盗作、マルウェア、およびスメル(異臭)検出など、幅広いアプリケーションにおける基本的なソフトウェアエンジニアリング活動です。本論文は、既存のアプローチとその特性に光を当てるため、コードの類似性測定と評価技術に関する体系的な文献レビューとメタ分析を提案します。私たちは最初に、4つのデジタルライブラリをクエリして1万以上の記事を見つけ、最終的に136件の主要な研究を抽出しました。研究は、その方法論、プログラミング言語、データセット、ツール、およびアプリケーションに従って分類されました。深い調査の結果、5つのアプリケーションドメインで8つの異なる技術を用いて動作するソフトウェアツールが80あります。ツールの約49%がJavaプログラムで動作し、37%がCおよびC++をサポートしていますが、多くのプログラミング言語はサポートされていません。注目すべき点は、ソースコードの類似性測定と重複コードに関連する12のデータセットが存在し、そのうちの8つのデータセットのみが公開されていることでした。信頼性のあるデータセットの不足、経験的評価、ハイブリッド手法、およびマルチパラダイム言語への焦点が、この分野の主な課題です。コードの類似性測定の新興アプリケーションは、メンテナンスに加えて開発フェーズに集中しています。



Introduction

ソースコードの類似性測定は、ソフトウェアエンジニアリングにおける多くのコード関連タスクを解決するための基本的な活動です。これには、クローンの識別や再利用 [1]–[9]、盗作の検出 [10]–[16]、マルウェアや脆弱性の分析 [17]–[22]、およびコードの推奨 [23]–[26] が含まれます。ほとんどの機械学習ベースのアプローチは、プログラムの品質を測定 [27]–[30]、コードのスメルを検出 [31]–[34]、リファクタリングを提案 [35]、プログラムを修正 [37]、[38]、およびソースコードを要約する [24]、[39] ためにソースコードの類似性指標の一種を使用しています。そのため、ソフトウェアエンジニアリングにおけるコード類似性測定技術、その本質、および応用について包括的な見解を持つことが重要です。


文献において、コードの類似性はコードクローンまたは重複コードとも呼ばれます [1]、[40]–[47]。コードの類似性はコードクローンよりも広い概念ですが、クローンコードはソフトウェアのメンテナンスに影響を与える主要な要因の一つです。ソフトウェアシステムにおけるコードクローンは、しばしばコピペプログラミングの実践から生じます [41]、[48]、[49]。このプロセスは、プログラマーがコードの一部を迅速に再利用し、開発プロセスを加速するのに役立ちますが、大規模なコードクローンの断片を生じる可能性があります。コードクローンを生じさせる他の行動には、言語の制限、コーディングスタイル、同じルールを実行するためのAPI、および異なる開発者によって偶然に同じロジックを実装することがあります [6]、[48]。

ソフトウェア開発ライフサイクルにおけるコードクローンの作成または使用には、困難と利点があります。クローンされたコードの主な課題の1つは、コードの一部で欠陥が検出された場合、すべてのクローンされた部分を特定して欠陥の可能性を確認する必要があることです。RahmanとRoy [50]は、コードクローンがプログラムの安定性を低下させることを示しています。一方で、いくつかの研究では、重複コードのリファクタリングが常に望ましいわけではないと主張しています。たとえば、コードクローンを削除すると、異なるコンポーネント間の依存関係が増加し、1つのコード部分を参照することによって密接に結合される可能性があります。そのため、多くの研究者が、何も行動しなくてもクローンコードを少なくとも特定するべきだと述べています [51]–[55]。残念ながら、コードクローンのインスタンスを検出することは簡単ではありません。しかし、クローンタイプの定義や分類は明確でない場合があり、コードクローンとコードの類似性の境界線が研究で十分に定義されていません。


コードの類似性測定に関する研究は成熟していますが、最新のアプローチを網羅した分野における包括的な調査は見当たりませんでした。本論文では、コードの類似性測定および評価手法に関する体系的な文献レビュー(SLR)とメタ分析を提案し、分野内の技術的側面を分類し、利用可能な課題と機会を明らかにします。この目的のために、最も重要なデジタルライブラリを検索し、初期の10000以上の記事のセットを得ました。関連する除外および含蓄基準、スノーボーリング、および品質評価を適用した後、136の記事がコードの類似性測定分野の主要な研究として選択されました。すべての主要な研究を詳細にレビューし、調査結果を分析・分類し、結果を報告しました。SLRの主な目標と貢献は次のとおりです。


コードの類似性測定とクローン検出のために提案された最新の手法、ソフトウェアツール、およびデータセットを示します。

利用可能なコード類似性測定研究の重要な側面を特定し、分類し、さまざまなアプリケーション領域(クローン検出、マルウェア検出、盗作検出、およびコードの推奨)での利点と欠点を比較します。

現在のコードの類似性測定における既存の課題と機会、および分野で新たに出現する新しいアプリケーションを指定し、議論します。


私たちの研究では、コードの類似性測定に関連するさまざまな手法、ツール、データセット、およびアプリケーションが示されています。最も重要なのは、研究者によって提案された80以上の異なるソフトウェアソースコードの類似性測定およびクローン検出ツールであり、少なくとも8つの異なる手法に基づいています。提案されたほとんどの手法は、コード断片内のトークン間の類似性を測定しますが、より高度な手法では機械学習やハイブリッド手法が新たに登場しています。利用可能な研究の最も重要な課題の1つは、公開されているツールやデータセットの不足、およびJavaアプリケーションでのクローン検出への焦点です。大規模なコードベースの急速な成長に伴い、ソースコードの類似性測定およびクローン検出アルゴリズムの効率性、精度、および拡張性が重要な要因となっています。

論文の残りの部分は以下のように構成されています。まず、セクション2では、コードの類似性測定およびコードクローンの文献で使用される主要な用語と概念を簡単に説明し、さまざまな種類のコードクローンについてレビューします。その後、セクション3では、体系的な文献レビューのための研究方法論と基本プロトコルを概説します。セクション4では、主要な研究の高レベルの分類を説明し、この体系的なレビューの結果を報告します。セクション5では、分野の課題と機会について議論します。私たちのSLRの妥当性に対する脅威は、セクション6で議論されます。最後に、セクション7でSLRをまとめ、将来の展望を示します。



Background

ソースコードの類似性は、テキスト、構文、および意味に関連して、コードスニペット間の類似度を測定するために使用される概念です。一般的に、コードの類似性のための明確な定義はありませんが、通常、任意の2つのコードスニペット 𝑐1、𝑐2 の類似性スコアは、実数 𝑠 で測定され、スコアが高いほど 𝑐1 と 𝑐2 が類似しています。山本ら [56] は、ソフトウェアシステムの類似性を、具体的な類似性メトリックを考慮して、与えられた2つのシステム内の類似要素の割合と全要素対の合計数の比率として定義しています。秦琴と春海 [57] は、プログラムソースコードの類似性はソフトウェアシステムと同様であり、山本の定義はプログラムソースコードの類似性測定の基礎として使用できると述べています。


コードの類似性を測定するタスクと類似またはクローンコードを特定するタスクを区別することは重要です。前者は一般的な概念であり、後者はコードの類似性測定のアプリケーションの1つとして分類されます。たとえば、類似性測定の結果をフィルタリングするために閾値を使用して、最も類似したインスタンスをクローンインスタンスとして報告できます。この調査では、コードの類似性測定が、ソフトウェアエンジニアリングのさまざまな問題に対処するための基盤を提供し、幅広いアプリケーションを示していることが議論されます。ただし、コードクローン検出は、この分野の多くの論文やツールの主要なアプリケーションであり、その先進的な検出方法は他のコード類似性測定アプリケーションの進化を促進しています。したがって、コードクローンの定義とタイプに焦点を当てます。コードクローンの定義について、研究者は多くの定義を提案しています。広く受け入れられている定義の1つとして、Baxterら [1] は、次のようにクローンコードを定義しています:


定義1(クローンコード):2つのコードスニペット 𝑐1、𝑐2 がある定義に従って類似している場合、それらはクローンです。


定義1のコードスニペットのペアは、異なるプログラミング抽象化レベルで、プログラム内のステートメント、ブロック、メソッド、クラス、パッケージ、またはコンポーネントになります。さらに、コードの類似性測定は、意図されたアプリケーションに応じて1つ以上のプロジェクトの範囲内で実行できます。異なるプロジェクトのエンティティが調査され、類似性が測定される場合、いわゆるクロスプロジェクトの類似性測定技術が定義されて使用されます。実際には、コードの類似性測定の結果は、与えられたコードスニペットの類似性と同じエンティティレベルのすべてのコードスニペットのランク付けされた類似性を含むベクトルで報告される場合があります。


定義1により、類似性測定の定義に応じて、さまざまなクローンタイプが形成されます。実際、クローン検出タスクにはコードの類似性測定の一般的な定義と比較して、類似性タイプと閾値の2つの追加の側面が考慮される必要があります。類似性の閾値は、クローンインスタンスの近さを示すために使用されます。この閾値の最大類似性値は、インスタンスの正確な一致を示します。


したがって、すべての類似性測定アプローチや類似性メジャーがクローン検出タスクに適しているわけではありません。本論文では、コードの類似性測定の一般的な問題に焦点を当てます。ただし、提案された技術は、ほとんどの場合、クローンの種類などのクローン検出の概念に基づいてのみ比較されます。


コードクローンは1つのプログラミング言語または複数の言語間で検出できます。後者のタイプのクローン検出は、クロス言語クローン検出(CLCD)とも呼ばれます。クロス言語クローンは、コードベースが移植用に異なる環境で使用するために準備されている場合に発生します。たとえば、ゲームのメインコードベースは実際には同じであり、異なるオペレーティングシステム用にゲームを構築する際には各オペレーティングシステムごとにわずかな違いがあります。



Related research

私たちの知る限りでは、ソースコードの類似性測定技術およびそのアプリケーション、ツール、データセットの一般的および特定の側面に関する体系的な文献レビューは行われていません。ただし、いくつかの研究では、クローン検出アプローチ [48]、[67]–[71]やそれらの特定のアプリケーション [72]についてレビューされています。たとえば、Novakら [72]は、ソースコードの盗作検出をレビューしています。私たちの調査は、特定のアプリケーションを強調せずに、最近提案されたアプローチとコード類似性測定の新興アプリケーションを補完するものです。私たちのSLRの目標は、さまざまなソフトウェアエンジニアリング活動の自動化の基礎としてのコード類似性測定を示すことです。


RoyとCordy [48]は、ソフトウェアクローン検出研究に関する初の包括的な技術レポートを公開しました。著者は、クローン文献で頻繁に使用される用語を説明し、一般的に使用されるクローンタイプにマッピングしました。彼らはまた、クローンの分類法、検出方法、および実験評価に関する57のオープンな質問や問題のリストを提案しました。クローン検出方法とツールの間で基本的な比較が行われ、これはソフトウェア開発者にとって貴重な情報を提供しています。ただし、彼らは関連するすべての作品を見つけてカバーするための体系的な検索を行っておらず、彼らのレポートはほぼ10年前に公開されました。


Rattanら [67]は、ソフトウェアクローンの検出と管理に関する体系的なレビューを行いました。彼らは、11の主要なジャーナルと37の会議から213の記事をレビューした結果を報告しています。彼らの調査では、クローン定義、クローンタイプ、クローン作成の理由、クローン検出方法、およびクローン検出ツールなど、ほぼすべてのソフトウェアクローンのトピックがカバーされています。彼らはまた、クローンが「有用」なのか「有害」なのかという基本的な問いに答えようとしました。彼らのレビューは異なる矛盾した答えで終わり、クローンインスタンスを単に削除するのは適切なアプローチではないと結論付けました。代わりに、開発者はさまざまな状況で適切な戦略を取り扱うためのツールを必要としています。著者らは一般的なコード類似性測定をレビューしていませんでした。


MinとPing [68]およびAinら [69]によって最近、ソフトウェアのクローン検出に関する類似の調査が行われました。これらの研究では、コードクローン検出に使用されるアプローチ、ツール、オープンソースの被験システムがカバーされており、研究者が自身のニーズに応じて適切なアプローチやツールを選択するのに役立ちます。ただし、コード類似性測定の一般的な問題とその幅広いアプリケーションについては、体系的にカバーされていません。


コード類似性の他の応用に関しては、Novakら [72]によって盗作検出技術とツールがレビューされています。彼らは、大学教授が学生から提出されたソースコードの盗作を検出するのを支援するために、この分野の体系的なレビューを行いました。彼らの研究では、盗作の定義、盗作検出ツール、比較メトリクス、難読化方法、比較に使用されるデータセット、およびアルゴリズムの種類について議論しています。著者らは、学術界でのソースコードの盗作検出ツールと、盗作を犯した学生が通常使用する盗作難読化方法に焦点を当てました。彼らは、学術界およびその外で「ソースコードの盗作」の多くの定義が存在するが、文献に明確な合意された定義が存在しないと結論付けました。さらに、定量的な分析に使用できるデータセットとメトリクスがほとんどないと指摘しています。他のコード類似性測定関連のアプリケーションについても同様の状況が観察されています。

一部の研究では、ソースコードの類似性測定およびクローン検出の一部の手法を実証的に評価し比較しています [43]、[62]、[73]、[74]。ただし、そのような比較の結果はデータセットによって非常にバイアスがかかります。BurdとBailey [73]は、中規模のJavaプログラム上で5つのコードクローン検出ツールのパフォーマンスを評価しました。彼らは、クローン検出のための単一かつ明確な優勝手法は存在しないと結論付けました。ただし、報告された結果は単一のプログラム内のクローンに基づいています。


Bellonら [62]は、8つの大規模なCおよびJavaプログラムを含むベンチマークを使用して、6つのクローン検出器の精度、再現性、および実行時間を評価しました。選択されたツールは、テキスト情報、レキシカルおよび構文情報、ソフトウェアメトリクス、およびプログラム依存グラフを扱う異なるコード類似性測定アプローチに基づいています。著者らは、8つのソフトウェアシステム内のコードクローンに言及し、ツールを提案されたデータセットと比較しました。彼らは、テキストベースおよびトークンベースのツールが、ツリーベースおよびグラフベースのツールと比較して再現性が高いが精度が低いこと、また、ツリーベースの技術の実行時間が他のテキストベースおよびトークンベースの技術よりも長いことを結論付けました。この論文では、クローン検出の結果を判断するために1人の人間の専門家のみを使用し、報告された結果の信頼性に関する脅威があります。

Biegelら [74]は、4つのJavaプロジェクトでテキストベース、トークンベース、およびツリーベースのソースコード類似性測定アプローチの再現率と計算時間を実証的に比較しました。彼らは、コード内のリファクタリングフラグメントを検出するためにツールを使用しました。著者らは、異なるツールの結果には大きな重複があることを発見しました。しかし、トークンベースのクローン検出ツールであるCCFinder[2]は、他の2つの類似性測定アプローチよりもはるかに遅いことがわかりました。彼らの実証的研究のデータセットとレプリケーションパッケージは公開されていません。


最近の実証的研究では、Ragkhitwetsagulら [43]が30のコード類似性検出技術とツールを評価しました。著者らは、ソースコードが広範な変更を受ける場合、一般的なテキストベースの類似性測定ツールは専門のコード類似性測定ツールと同様のパフォーマンスを提供することを発見しました。ただし、特定のソースコード類似性測定手法とツールは、一般的なテキストベースの類似性測定手法よりも優れたパフォーマンスを発揮できます。JPlag盗作検出ツール [10]は、ローカルコード変更を検出する際の最良のパフォーマンスを示し、CCFXは広範に変更されたコードで最高のパフォーマンスを達成します。ツールの最適なパラメータ(クローンコードを検出するために使用されるしきい値など)は、特定のデータセットに偏っています。


Chenら [70]は、2006年から2020年までの異なるコード重複アプローチを批評的にレビューしました。著者らは、有効な大規模サンプルを持つ検証用の有効なテストデータセットが存在しないことを結論付けました。さらに、著者らは、ほとんどの手法が非常に複雑で、単一のプログラミング言語をサポートし、意味的なクローン(タイプIVクローン)を検出できないことを報告しました。ただし、彼らは当社の論文で議論されている広範なコード類似性測定アプリケーションの範囲を調査していません。本SLRでは、ソースコードの類似性測定に関連するすべてのアプリケーションを徹底的にレビューしました。また、研究者や実務家が取り組んでいる最新のアプローチを包括するように、既存のコード類似性測定アルゴリズムとアプリケーションの分類を拡大しました。具体的には、学習ベース、テストベース、画像ベース、およびハイブリッドアルゴリズムを以前に識別されたソースコード類似性測定手法に追加して、議論しました。また、コード類似性測定の新興アプリケーション(コード推薦および障害予測を含む)をいくつか特定しました。



Research Methodology

本文献レビューは、KitchenhamとChartersによって確立されたガイドラインに従います[75]。これにより、ソフトウェアエンジニアリングにおけるシステマティック・リテラチュア・レビューが計画、実施、報告の3つの段階に分解されます。さらに、我々は、実証的ソフトウェアエンジニアリング、コードスメル、ソフトウェアリファクタリング、ソフトウェア盗用に関連する最新の高品質のシステマティック・リテラチュア・レビューからインスピレーションを得ました[14]、[76]–[78]。図2は、研究方法論の全体的なプロセスを示しており、トピックと研究の問題の定義、検索文字列の作成、および記事の選択が含まれています。括弧内の数字は、各ステップで取得された記事の数です。当社の研究方法論は、SLR中に回答されるべき研究問題を記述することから始めます。


Research questions

ソースコードの類似性の測定と評価は、広範なアプリケーションを持つ多次元の問題です。以下の研究質問は、導入で議論された目的を見つけるために当社のレビューを実施するために設計されました:


• RQ1:既存のソースコードの類似性測定の手法とテクニックは何であり、それぞれの利点と欠点は何か?

• RQ2:ソフトウェアエンジニアリングの活動およびタスクでのソースコードの類似性測定の応用は何か?

• RQ3:既存のソースコードの類似性測定ツールは何であり、各ツールがサポートするプログラミング言語は何か?

• RQ4:ソースコードの類似性測定ツールの構築と評価に使用されたソフトウェアプロジェクトとデータセットは何か?

• RQ5:既存のソースコードの類似性測定手法のパフォーマンスはどうか?

• RQ6:ソースコードの類似性測定における既存の課題と機会は何か?



Classifying and comparing code similarity studies

主要な研究の分析から、ソースコードの類似性測定に関する研究はいくつかの共通の側面を示しています。これらの側面を適切に分類することは、異なるソースコードの類似性測定アプローチを標準的なスキームで比較し、研究上のギャップを明らかにするために多くの利点を提供します。私たちは、各研究について、手法、ツール、サポートされているプログラミング言語、データセット、およびアプリケーションドメインの5つの直交する次元を指定しました。図5は、提案された分類と各カテゴリ内の既存のサブカテゴリを示しています。私たちは、この分類に基づいて私たちの調査を組織しました。提案された分類は、現在および将来のソースコードの類似性測定に関する研究を体系的に比較するための標準的な方法と見なすことができます。残念ながら、すべての研究が図5に示されている5つの提案されたカテゴリの情報と議論を提供しているわけではありません。セクション4の残りの部分では、これらの5つの次元のそれぞれについて詳細にレビューし、ソースコードの類似性測定の研究の現在の状態を発見します。


手法に関して、既存の研究は静的または動的プログラム解析に基づいています。静的解析に基づく手法[10]、[40]、[61]、[81]–[83]では、プログラムの実行を使用せずに類似性を測定します。アルゴリズム、データ駆動型、またはハイブリッドアプローチを使用して類似のソースコードを見つけます。一部の研究[84]、[85]では、テストスイートまたはワーキングロードでプログラムを実行し、プログラムの機能出力などのランタイム情報を取得し、取得した情報を比較することで類似したコードフラグメントを見つけます。セクション4.4では、既存の手法について詳細に議論します。


ツールに関して、提案された研究はツールによってサポートされている場合とそうでない場合があります。一部の研究は、自分たちのツールを公表しています[10]、[81]、一方で、他の研究はそうではありません。また、非学術的なソースコードの類似性測定ツールもありますが、これらは主要な研究で議論されていません[86]–[89]。既存のツールとアプローチは、1つまたは複数のプログラミング言語でソースコードの類似性を検出する場合があります。また、言語に依存しないツールもあります[90]。セクション4.5では、既存のソースコードの類似性測定ツールとサポートされている言語について説明します。


主要な研究のレビューによると、ソースコードの類似性測定手法を作成および検証するために使用されるデータセットには3種類あります:人間のオラクルを使用したデータセット[62]、[91]、機械のオラクルを使用したデータセット[92]、[93]、およびハイブリッドデータセット[43]。最初のカテゴリのデータセットは、その場の専門家によって手動でラベル付けされるか、プログラミングコンテストプラットフォーム(Google CodeJam[94]およびCodeforces[95]など)で特定の問題への解決策に基づいています。自動生成されたデータセットは、異なる既存のツール間での多数決[62]、変異演算子[93]、プログラム変換ルール[96]、またはコードベースのバージョン履歴を使用して、人間の介入なしで類似および非類似なコードフラグメントのラベルを作成します。最後に、これらのアプローチの組み合わせを使用して、大規模かつ品質の高いデータセットを作成できます。既存のソースコードの類似性ベンチマークとデータセットの詳細については、セクション4.6で議論されています。


ソースコードの類似性測定の応用に関して、ソースコードクローンと再利用の検出の直接的な応用と、いくつかの間接的な応用が観察されました。これらは、さらに、プラガリズム検出、マルウェアおよび脆弱性検出、コード予測、およびコード推奨に分類されます。大多数の主要な研究がクローンインスタンスを見つけることに焦点を当てていますが、私たちの調査では、ソースコードの類似性測定がソフトウェアエンジニアリング活動の多くのコード関連タスクに対処できることが示されています。セクション4.3では、私たちがレビューした研究でカバーされているソースコードの類似性測定のさまざまな応用について説明します。



Code similarity measurement applications

私たちのシステマティック・リテラチュアレビュー(SLR)によれば、コードクローンと盗作検出に加えて、マルウェア検出、欠陥予測、およびコード推奨の3つの他のコード類似性測定アプリケーションがあります。実際、後者の3つのアプリケーションは、コード類似性測定の観点からはほとんど議論されていませんでした。図6は、主要研究におけるトップ5のコード類似性測定アプリケーションの頻度を示しています。図6の円グラフによれば、コードクローン検出がコード類似性測定研究の中で最も頻繁なアプリケーションです。それが84%以上の主要研究で議論されています。実際、ほとんどの研究は、特定のアプリケーションに直接言及するのではなく、コードクローンの一般的なドメイン内でコード類似性を調査しています。コードクローンは、本番コードとテストコードの両方で検出されます。


コード盗作検出は、プログラムソースコードの不正な再利用を特定することを目的とする、二番目に頻度の高いコード類似性測定アプリケーションの1つです。マルウェア検出では、コード類似性測定の第3の頻度の高いアプリケーションによれば、プログラムソースコードが検索され、悪意のあるソースコードスイートのクローンインスタンスが見つけられます。これらのインスタンスにはおそらく悪意のある動作が含まれています。同様に、既知の欠陥を持つソースコードスイートのクローンインスタンスは、欠陥を持つ可能性のあるプログラムとして特定されます。最後に、コード推奨は、コード類似性の基礎となる既存のコードに開発中のコードが類似している場合に、バグ修正パッチ、エンティティ名、リファクタリング、およびコード生成などのコード変更と改善を推奨する最近のアプリケーションの1つです。例えば、プログラマーにメソッドやクラス名を提案するためのいくつかのアプローチが、ソースコード品質要因を向上させるために提案されています。



Code similarity measurement techniques

多くの方法や技術が類似性を特定するために文献で提案されていますが、商業化されたものはほとんどありません。実際、ほとんどのアプローチは、ソフトウェアメンテナンスを目的として学術研究で開発されています。私たちは、主要研究で使用されているコード類似性を測定するための9つの技術を特定しました。図5は、ソースコードの類似性測定技術の構造化されたレベルを示しています。以前の調査では、最大で6つのカテゴリーまでしか考慮されていませんでしたが、私たちのシステマティック・リテラチュアレビューでは、学習ベース、画像ベース、およびテストベースのメソッドを含む、ソースコード類似性測定の3つの新しいカテゴリーが特定されました。


図7は、主要研究での異なるコード類似性測定技術の頻度を示しています。ハイブリッドメソッド、つまり2つ以上の基本メソッドを組み合わせた方法が、コード類似性測定に最も使用される技術であることが観察されます。図によれば、約28%の研究がソースコード類似性を測定するためにハイブリッドメソッドを提案しています。学習ベースとトークンベースの方法が2位と3位にあります。グラフベース、ツリーベース、およびテキストベースの技術がそれぞれ4位、5位、および6位に位置しています。最後に、メトリックベース、テストベース、および画像ベースの方法が最も詳細に検討されていない方法です。各技術に基づいて提案された最も重要な主要研究について、このセクションの残りの部分でそのメカニズムと詳細を提供します。



Text-based techniques:

👍特徴

・コード類似性測定において、最も単純で初期の手法。

・ソースコードを文字列のシーケンスと見なす。

・2つのコードスニペットを一緒に比較して、文字列の最長共通シーケンスを見つける。その一致する部分をクローンインスタンスとする。

・通常、前処理を行わずに生のコード上で行われるが、一部のアプリケーションでは、シーケンスの一致前に空白やコメントが削除される場合がある。


👍長所

・効率的であり、修正なしでどのプログラミング言語にも適用できる

👎短所

・重い前処理が必要になる。
・クローンタイプのⅠ、Ⅱまでしか対応できない。


📚関連研究

📗A language independent approach for detecting duplicated code
[90], 1999
メモ:コード類似性測定の最も単純で初期の手法。ソースコードをテキストドキュメントとして扱う。
コードの重複(Code duplication)を検出するための技術は存在するが、主にパーサーに依存しており、異なる言語や方言に対して脆弱である。本論文では、パーシングを必要とせず、言語に依存しないビジュアルアプローチを適用することで、この課題を回避できることを示す。また、4つの異なる実装言語を対象とし、ソースコードのサイズが256Kから13Mbに及ぶさまざまなケーススタディで提案手法を検証。


📗Efficient plagiarism detection for large code repositories
[11], 2007
メモ:ソースコード内の文字列のシーケンス間の類似性を計算するために、局所アラインメント手法[107]、近似文字列マッチングアルゴリズムを使用したテキストベースのアプローチを提案。より良い効率を実現するために、評価されたコーパス内の各トークンは一度だけ保存およびインデックス化される。この論文では、フィルタリングとソースコード断片のインデックス化によって高いスケーラビリティと効率が実現されたため、その手法の有効性がJPlag[P6]ツールと比較可能であることを示した。ただし、類似インスタンスを選択するための局所アラインメントアルゴリズムの適切な閾値を決定することは難しい。


📗NICAD: accurate detection of near-miss intentional clones using flexible pretty-printing and code normalization
[81], 2008
メモ:NICADは、ノイズを除去し、フォーマットを標準化し、プログラムステートメントを部分に分割するためにテキスト正規化を使用する、よく知られている最も使用されているテキストベースのクローン検出ツール。


📗Detection and analysis of near-miss software clones
[191], 2009
メモ:NICADは、ノイズを除去し、フォーマットを標準化し、プログラムステートメントを部分に分割するためにテキスト正規化を使用する、よく知られている最も使用されているテキストベースのクローン検出ツール。


📗An approach to source-code plagiarism detection and investigation using latent semantic analysis
[13], 2012

メモ:PlaGateというツールを支援するテキストベースの手法を提案しました。彼らは、潜在的なマトリックスにソースコードファイルを変換し、その後、コーパス内の各ファイルの間のコサイン類似度を計算するために潜在的意味解析(LSA)技術を使用しました。PlaGateは、言語に依存しないソースコード盗作検出ツールです。ただし、各コーパスに対してLSAマトリックスの適切な次元を選択することは難しいです。


📗Gapped code clone detection with lightweight source code analysis
Gapped Code Clone Detection with Lightweight Source Code Analysis (researchgate.net)
[198], 2013
メモ:


📗gCad: A near-miss clone genealogy extractor to support clone evolution analysis
メモ:NICADに基づく近接クローン系譜抽出器であり、プログラムの複数のバージョンでクローンを検出。それは𝑛バージョンのプログラムを受け入れ、連続するバージョン間でクローンクラスをマッピングし、各クローンクラスが観察期間全体でどのように変化するかを抽出する。


📗An execution-semantic and content-and-context-based code-clone detection and analysis
[206], 2015
メモ:レキシカルアナライザーがテキストのシーケンスを作成し、その後、Aprioriアルゴリズム[108]を使用して共通のサブツリーを見つけるより高度な方法を提案しました。彼らの手法は、シーケンスマッチングによってタイプIおよびIIのクローンを検出し、ASTマッチングによってタイプIIIのクローンを検出します。この方法の利点は、プログラム全体のASTを作成する必要がないことです。ただし、タイプIVのクローンを検出することはできません。


📗Detecting Android malware using clone detection
[17], 2015
メモ:Androidシステム用のマルウェアアプリケーションを特定するためにテキストベースの方法を使用しました。ソースコードは小さなコードスニペットに分割され、これらのスニペットと既存のマルウェアとの類似性が、マルウェアを検出するためにNiCadツール[109]を使用して計算されました。この方法のスコアは95%以上であり(リコールが91%、精度が99%)、他のテキストベースの方法と比較して比較的高いです。


📗Using compilation/decompilation to enhance clone detection
[214], 2017
メモ:コンパイルおよびデコンパイルを前処理ステップとして使用して、コード断片の構文変更を正規化し、NICADの精度を向上させた。


📕Design and development of software tool for code clone search, detection, and analysis
[226], 2019
メモ:コード内の余分な情報(空白など)を削除するための前処理モジュールを使用するテキストベースの方法を提案しました。彼らの手法で使用される他のモジュールには、キーワード、データ型、変数、および関数検出器が含まれ、コードの特定の部分を識別します。最後に、類似性を特定する類似性チェッカーモジュールが使用されます。この記事は、異なるレベルのアプリケーションコードの類似性に関する一般情報を提供することを目的としています。その利点は、ソフトウェアを評価し、クローンコードについての一般的な詳細を提供できることです。



Token-based techniques:

👍特徴

・トークンベースの手法では、プログラムのソースコードがトークンのシーケンスに変換される。通常、レキシカルパーサーがトークンを生成するために使用される。

・トークンベースの手法は、テキストベースの手法よりも、識別子のレキシカル要素の変更などのコード変更に対してより堅牢である。


👍長所

・効率的であり、ソフトウェア開発プロセス中に頻繁に使用されることがある。
・タイプI、タイプIIのコードクローンを特定する際に優れたパフォーマンスを示す。
・さらに、多数の編集を含むタイプIIIのクローンを検出する際にも優れたパフォーマンスを示す。


👎短所

・トークンの認識と置換操作により処理時間が増加する。

たとえば、ASTVisitorツールがあります。次に、トークンが索引付けされます。トークンシーケンス間の類似性インデックスは、クローンが存在することを示します。


トークンベースの手法では、プログラムのソースコードがトークンのシーケンスに変換され、それからこれらのシーケンスが共通の部分シーケンスを見つけるために比較されます[P7]、[P98]。トークンベースの手法は、テキストベースの手法よりも、識別子のレキシカル要素の変更などのコード変更に対してより堅牢です[P15]、[P18]、[P26]。また、ソフトウェア開発プロセス中に頻繁に使用されるほど効率的です[P53]。ただし、トークンの認識と置換操作により処理時間が増加します。トークンベースの手法は、タイプIおよびタイプIIのコードクローンを特定する際に優れたパフォーマンスを示しています[P13]、[P87]、[P89]、[P92]、[P95]、[69]、および多数の編集を含むタイプIIIのクローンを検出する際にも[P68]、[P75]、[P79]。


📗CP-Miner: finding copy-paste and related bugs in large-scale software code
[187], 2006
[Cited by 862 (when 2024/2)]
メモ:プログラムのソースコードがトークンのシーケンスに変換され、それからこれらのシーケンスが共通の部分シーケンスを見つけるために比較されます


📗LVMapper: a large-variance clone detector using sequencing alignment approach
[233], 2020
[Cited by 32 (when 2024/2)]
メモ:プログラムのソースコードがトークンのシーケンスに変換され、それからこれらのシーケンスが共通の部分シーケンスを見つけるために比較されます


📗Automatic source code plagiarism detection
[98], 2009
[Cited by 78 (when 2024/2)]
メモ:


📗CloneDetective - a workbench for clone detection research
[158], 2009
[Cited by 174 (when 2024/2)]
メモ:


📗A source code similarity system for plagiarism detection
[12], 2013
[Cited by 127 (when 2024/2)]
メモ:


📗SourcererCC and SourcererCC-I: Tools to detect clones in batch mode and during software development
[154], 2016
[Cited by 38 (when 2024/2)]
メモ:


📕Empirical evaluation of clone detection using syntax suffix trees
[158], 2009
[Cited by 115 (when 2024/2)]
メモ:


📗SCDetector: software functional clone detection based on semantic tokens analysis
[156], 2020
[Cited by 50 (when 2024/2)]
メモ:


📕CPPCD: a token-based approach to detecting potential clones
[155], 2020
[Cited by 10 (when 2024/2)]
メモ:


📗A systematic review on code clone detection
[69], 2019
[Cited by 128 (when 2024/2)]
メモ:


📗CCAligner: a token based large-gap clone detector
[157], 2018
[Cited by 142 (when 2024/2)]
メモ:


📗A large-gap clone detection approach using sequence alignment via dynamic parameter optimization
[112], 2019
[Cited by 14 (when 2024/2)]
メモ:


📗An efficient new multi-language clone detection approach from large source code
[194], 2012
[Cited by 12 (when 2024/2)]
メモ:Rehmanら[P25]は、トークンベースの手法を用いてクローンコードを見つけるためのツール、LSC Minerを開発しました。LSC Minerは、C、C++、VB6、VB.NET、およびJavaなど、複数の言語に対するクローン検出をサポートしています。


📗Interface driven code clone detection
[6], 2017
[Cited by 12 (when 2024/2)]
メモ:Misuら[6]は、類似したインターフェースを持つ2つの関数はクローンの可能性があると述べています。彼らの手法では、まずプログラム内の各メソッドに対して対応するインターフェースが作成されます。その後、メソッドのペアごとにトークンのシーケンスのジャッカード類似度[110]が計算されます。シーケンスには、関数の引数と識別子のトークンストリームが含まれます。類似度が70%を超える関数は、クローンのインスタンスとしてグループ化されます。この閾値は実験的に決定されました。彼らは、この手法をJavaプログラム向けに開発しました。AnkaliとParthiban[P113]は、Java、C、およびC++でクロス言語のコードクローンを検索するためにLevenshtein距離を使用しました。クローンタイプの分類は著者によって手動で行われます。


📗DéjàVu: a map of code duplicates on GitHub
[212], 2017
[Cited by 204 (when 2024/2)]
メモ:Lopesら[P61]は、C++、Javascript、Java、およびPythonプログラムでトークンベースの手法を使用してGitHubリポジトリ内のクローンコードを検出しました。この目的のために、彼らはSourcererCCツール[P47]を使用してプロジェクトおよびファイルレベルでソースコードをチェックしました。彼らは、GitHubリポジトリ内でJavaの約14%、C++の約25%、Pythonの約18%、JavaScriptの約48%のコードにクローンインスタンスがあると結論付けました。


📗Finding plagiarisms among a set of programs with JPlag
[10], 2002
[Cited by 813 (when 2024/2)]
メモ:JPlag[P6]は、プログラムを文字列のシーケンスとしてトークン化し、最大の連続部分文字列を見つけるGreedy String Tiling[111]アルゴリズムを使用します。これにより、与えられたプログラムセットの中で類似したプログラムのペアを見つけるウェブサービスが提供されます。


📗Efficient plagiarism detection for large code repositories
[11], 2007
[Cited by 171 (when 2024/2)]
メモ:JPlag[P10]は主にソースコードの盗作を検出するために使用されます。


📗A large-gap clone detection approach using sequence alignment via dynamic parameter optimization
[112], 2019
[Cited by 14 (when 2024/2)]
メモ:トークンベースのクローン検出の効率を向上させるためにSmith-Waterman配列アラインメントアルゴリズムを使用しました。


📗CPDP: a robust technique for plagiarism detection in source code
[99], 2013
[Cited by 24 (when 2024/2)]
メモ:CPDPは、ソースコードの盗作検出のための類似したトークンベースのツール。ソースコードの盗作検出システムは、元のソースコードに構造的な変更(制御構造の変更など)が適用されると混乱する可能性があります[P32]。


📗A source code similarity system for plagiarism detection
[12], 2013
[Cited by 127 (when 2024/2)]
メモ:DuricとGaševic[P26]は、一部の構造的な変更の影響を回避するための専門的な前処理を備えた強化されたトークンベースの盗作検出ツール、SCSDSを提案しました。たとえば、Java数値型のすべての識別子(int、long、float、double型など)は、「<NUMERIC_TYPE>」トークンに置換されます。さらに、すべてのセミコロントークンが削除されます。SCSDSは、有名なJPlagツール[10]と比較して、より良いF1スコアを達成します。ただし、比較は学生のプログラミング課題の小さなデータセットで行われたため、アプローチの一般化に脅威がかかります。


📗Plagiarism detection in students’ programming assignments based on semantics: multimedia e-learning based smart assessment methodology
[15], 2018
[Cited by 58 (when 2024/2)]
メモ:Ullahら[P75]は、学生のプログラミング課題の盗作を検出するためにトークンベースのクローン検出を使用しました。彼らの手法では、まず潜在的な意味解析(LSA)[113]を使用して頻繁に繰り返されるプログラムトークンの行列を作成します。この方法は、ソースコードを自然言語に変換するのに役立ちます。プログラミング課題間の類似性は、LSA[113]によって計算されます。LSAアルゴリズムは、トークンから意味を抽出してC++およびJavaの学生のプログラミング課題間の盗作を検出します。著者は、提案された方法の最大のリコールが80%であると報告しています。


📗CP-Miner: finding copy-paste and related bugs in large-scale software code
[187], 2006
[Cited by 862 (when 2024/2)]
メモ:CP-Miner[P7]は、大規模なソフトウェアコード内のコピーペーストとそれに関連するバグを見つけます。CP-Miner[P7]は、大規模なソフトウェアスイート内のコピー&ペーストされたコードと効率的にコピー&ペーストされたコードの両方を検出します。まず、プログラムをトークン化し、次にコード断片間の頻繁な部分シーケンスを見つけるサブシーケンスマイニングアルゴリズムであるCloSpan[114]を適用します。最も頻繁な部分シーケンスは、元のプログラムの完全なコピー&ペーストされたセグメントです。CP-Minerツールの実験では、コピー&ペーストされたコードの約1/3が1〜2ステートメントの修正を含んでいることがわかりました。CP-Minerは言語に依存しないツールです。ただし、その時間複雑性は𝑂(𝑛2)であり、ここで𝑛は頻繁なシーケンスの最大長です。


📕Comparison of token-based code clone method with pattern mining technique and traditional string matching algorithms in- terms of software reuse
[49], 2019
[Cited by 3 (when 2024/2)]
メモ:テキストベースまたはトークンベースの手法でタイプIVのコードクローンを検出することは難しいため、プログラムのテキストがしばしば異なる場合があります。Rajakumariら[P89]は、JavaプログラムのタイプIVクローンの検出について、次の5つの手順で取り組みました:入力の選択、モジュールの分離、クローンの抽出、クローンの分類、および結果の報告。


📗Siamese: scalable and incremental code clone search via multiple code representations
[152], 2019
[Cited by 66 (when 2024/2)]
メモ:Ragkhitwetsagulら[P87]は、トークンのシーケンスをベクトルに変換するためによく知られたTF-IDF技術を使用しました。まず、インデックス付けフェーズが実行され、トークンのベクトル表現が作成され、各ベクトルにスコアが割り当てられます。次に、検出フェーズが類似するインスタンスを選択し、クローンとして報告します。彼らの提案されたツール、Siameseは、JavaプログラムのタイプI、II、およびIIIのクローンを最大リコール99%で検出できます。この手法の別の利点は、クローンインスタンスを検出する際の比較的高い時間パフォーマンスです。ただし、SiameseはタイプIVクローンを検出できません。


📕FastDCF: a partial index based distributed and scalable near-miss code clone detection approach for very large code repositories
[254], 2022
[Cited by 2 (when 2024/2)]
メモ:FastDCF[P128]は、HDFS[115]およびMapReduce[116]を使用して、関数およびファイルの粒度で大規模なコードベースにスケーリングアップされたクローン処理を行う別のトークンベースのクローン検出ツールです。Siameseと同様に、FastDCFはタイプIVクローンを検出できません。



Tree-based techniques:

👍特徴

・ソースコードは、木ベースの方法では、プログラミング言語のパーサーを使用して構文解析ツリーまたは抽象構文木(AST)に変換されます

・大規模なコードベースの構文解析ツリーやASTの作成には時間がかかり、各プログラミング言語に特有のパーサーが必要です

・コードクローン検出のアプリケーションでは、木ベースの方法はタイプI、II、IIIのコードクローンを正確に認識できます。


ソースコードは、木ベースの方法では、プログラミング言語のパーサーを使用して構文解析ツリーまたは抽象構文木(AST)に変換されます[P8]、[P16]、[P78]、[P121]。類似したコードを検索するには、構文解析ツリーまたはAST内で類似の部分木を見つけます[P24]。この方法は、ブロッキングや括弧の異なるコードの変更にも強力です。ただし、大規模なコードベースの構文解析ツリーやASTの作成には時間がかかり、各プログラミング言語に特有のパーサーが必要です[P93]。また、部分木の一致は計算コストが高いです[P93]。コードクローン検出のアプリケーションでは、木ベースの方法はタイプI、II、IIIのコードクローンを正確に認識できます。また、マルウェア検出[P74]や欠陥予測[P115]など、コード類似性測定の他のアプリケーション領域にも適用されています。


📗DECKARD: scalable and accurate tree-based detection of code clones
[82], 2007
メモ:DECKARD[P9]は、コード類似性を測定するために木編集距離メトリックを使用する木ベースのコードクローン検出です。2つの木𝑇1と𝑇2の編集距離を𝛿(𝑇1、𝑇2)で示し、これは𝑇1を𝑇2に変換するために必要な編集操作の最小シーケンスです。DECKARD[P9]のパフォーマンスは、類似性を決定するために使用される閾値に大きく依存しています。


📗Cross-project code clones in GitHub
[228], 2019
メモ:Gharehyazieら[P91]は、DECKARDに基づくCLONE-HUNTRESSツールを開発し、GitHubプロジェクト全体でクローンインスタンスを識別して追跡します。ただし、彼らのツールはタイプIVのクローンをキャプチャできません。


📕Discovering vulnerable functions: a code similarity based approach
Discovering Vulnerable Functions: A Code Similarity Based Approach | SpringerLink
[210], 2016
メモ:Chandranら[P57]は、コードのセキュリティ関連のプロパティを考慮して関数の抽象構文木(AST)を拡張し、脆弱性とバグのあるクローンインスタンスを見つけます。


📕Semantic code clone detection using parse trees and grammar recovery
[195], 2013
メモ:Tekchandaniら[P27]は、タイプIVのクローンを検出するための木ベースのアプローチを提案しました。まず、ソースコードのASTが作成され、次にASTの葉のシーケンスが比較され、クローンペアが特定されます。彼らのアプローチは、ソースコードのサンプルから文法を抽出し、複数のプログラミング言語をサポートするASTを構築しようとします。したがって、この方法は、プログラミング言語の文法が利用できない場合に適しています。ただし、ソースコードのサンプルから文法を抽出することでクローン検出時間が増加し、その精度が文法抽出プロセスのエラーによって低下します。


📗Clone detection via structural abstraction
[192], 2009
メモ:Asta[P19]は、ASTノードを限られた長さの連続パターンに変換し、可能なクローンを検出するためにパターンを比較する類似のアプローチを使用します。


📗TECCD: a tree embedding approach for code clone detection
TECCD: A Tree Embedding Approach for Code Clone Detection (nsf.gov)
[221], 2019
メモ:Gaoら[P78]は、プログラムAST上でword2vecアルゴリズム[117]を使用して、木ベースの類似性測定の時間を短縮するツールTECCDを提案しました。ANTLRパーサージェネレーター[118]は、ソースコードのASTを作成するために使用され、ASTノードを含む行列がword2vecモデルに供給され、各ASTのベクトル表現が生成されます。対応するASTベクトルのペア間のユークリッド距離が類似性の尺度として計算されます。学習されたモデルは新しいソースコードをベクトルに変換するために使用され、木ベースの方法の効率が向上します。TECCDは、精度88%、リコール87%でタイプI、II、IIIのコードクローンを検出できます。TECCDはタイプIVのクローンを検出できません。


📗Detecting similar java classes using tree algorithms
[188], 2006
メモ:Sagerら[P8]は、ASTを使用してJavaコード内の類似したクラスを特定しようとしました。彼らの方法では、EclipseのJDT APIを使用して、各クラスのASTを取得します。その後、ASTはFAXIM(FAMOOS情報交換モデル)と呼ばれる中間モデルに変換されます。これは、オブジェクト指向のソースコードを表示するための独立したプログラミング言語モデルです[P8]。2つのクラス間の類似性は、最大共通部分木同型性の下方向および上方向の最大共通部分木同型性、および木編集距離を含む比較アルゴリズムを使用して比較されます。類似性はFAXIMツリー間で測定されます。議論された方法は、2つのソフトウェアプロジェクトで平均リコール74.5%で類似したクラスを特定します。


📗📕



Graph-based techniques

グラフベースの方法では、通常、プログラム依存グラフ(PDG)[119]をコードスニペットに作成し、これらのグラフを比較して類似性を認識します[P21]。 PDGには、プログラム文間のデータおよび制御依存関係が含まれており、構文だけでなくプログラムの意味論も伝えます。 PDGのノードはプログラム文であり、エッジはデータまたは制御依存関係です。 PDGベースの方法の適切な実装により、すべてのタイプのクローンを識別できます[P34]、[P119]。ただし、PDGの比較は、NP完全な問題であるグラフ同型性によって行われることが多いです[P23]、[P31]。したがって、いくつかのアプローチでは、クローン検出に使用するためにPDGをより単純なツリー表現に変換します[P64]。

KomondoorとHorwitz[P4]は、プログラム内の連続テキストとして発生しないクローンを見つけるためのグラフベースのクローン検出アプローチを提案しました。彼らのアルゴリズムは、バックワードスライシング技術を使用して、PDG内の一致ノードのペアごとに2つの同型部分グラフを見つけます。一致ノードは、変数名と値を考慮せずに合成的に類似しているPDG内のノードです。スライスベースのアプローチは一般的に同型部分グラフを見つけるより効率的ですが、大規模なPDGを持つプログラムでは時間がかかります。

Krinke[P3]は、最大類似部分グラフを計算することで類似したコードを識別するためのグラフベースのアプローチを提案しました。このアプローチは、意味的に類似したコードを検出できます。ただし、著者によれば、提案されたアルゴリズムの時間複雑度は𝑂(|𝑉|2)であり、ここで𝑉はPDG頂点の数です。そのため、大規模なPDGを持つコード断片では、アルゴリズムは効率的ではありません。Gabelら[P12]は、PDGサブグラフを関連する構造化構文にマッピングすることによって、グラフ類似性測定問題をより単純なツリー類似性測定問題に簡略化しました。ツリー類似性測定を使用することで、サブグラフの比較プロセスが効率化されます。

Wangら[P58]は、C#プログラム向けのPDGに基づいたクローン検出ツールであるCCSharpを提案しました。CCSharpは、ソースコードを小さなスニペットに分割し、各コードスニペットのPDGを構築してPDG作成時間を短縮します。次に、これらのグラフを比較してクローンインスタンスを検出し、グループ化します。CCSharpの利点は、比較的高い精度(99.3%)とリコール(89.8%)ですべてのクローンタイプを検出することです。Tajimaら[P71]は、プログラムのメソッドからインターフェース情報とPDGを抽出して、同じプロジェクト内での類似性検出に使用しました。

大規模なプログラムのPDGを構築することは時間がかかり、エラーの原因になります。Avetisyanら[P41]は、PDGに基づくプログラムの意味解析を使用したLLVMベースのコードクローン検出フレームワークを提案しました。彼らの提案されたクローン検出アプローチは、複数段階のプロセスです。まず、生成されたPDGがメモリにロードされます。第二に、異なる手法でPDGをサブグラフに分割します。第三段階は、線形複雑度で検出される十分に大きな同型部分グラフを持たないことを証明しようとする高速チェックアルゴリズムの適用です。第四ステージは、プログラムスライシングに基づく最大同型部分グラフの検出です。第五ステップは、対応する同型部分グラフのソースコードが散在しすぎていないことを確認するフィルタリングです。最終的に、検出されたクローンの対応するソースコードが印刷されます。著者は、アプローチの効率と拡張性に焦点を当て、タイプI、II、IIIのコードクローンを特定しました。ただし、彼らのアプローチはクローンタイプIVを検出することができず、LLVMエコシステムに制限されています[120]。一部のアプローチでは、類似したソースコードを検出するために遺伝的アルゴリズムなどの進化的アルゴリズムが使用されていますが、これらのアプローチは、近似グラフマッチングでクローンされたコードを見つけることができる可能性があります[P51]。



Metric-based techniques

メトリックベースの方法では、まず、ソースコードを異なるコードメトリックのベクトルとして表現し、ベクトル空間モデル理論を使用して類似性を測定します[121]。その後、ベクトルの類似性を使用して、与えられた各ソースコードの類似性を測定します。ベクトルの類似性は、プログラミング言語の定義されたメトリックの量と品質に大きく依存します。大規模なプログラムのためのソースコードメトリックの計算には、適切な効率が得られるように、合理的な時間がかかります[P1]、[P114]。表2には、コード類似性測定とクローン検出に使用される一般的なソースコードメトリックが示されています。研究者が使用するソースコードメトリックのセットが限られていることが観察されています。


Sudhamaniら[P56]は、Javaプログラム向けのメトリックベースのクローン検出アプローチを提案しました。彼らの方法では、プログラム内の制御文に対するControl Feature Metric Tables (CFMT)のセットが抽出されます。これには、算術演算の数、論理演算の数、条件演算の数、識別子、および制御コードの行数が含まれます。抽出されたメトリックのベクトルはコードスニペットを表し、ユークリッド距離が各コードスニペットのペア間の類似性を測定するために使用されます。著者らは、彼らのアプローチがすべてのタイプのコードクローンを検出できると主張していますが、この方法の正確な評価は報告されていません。


Nafiら[P100]は、クロス言語クローン(CLC)を検出するために9つのコードメトリックを使用しました。 ANTLRツール[118]を使用してソースコードメトリックを抽出し、コサイン類似度距離が類似性の尺度として計算されました。 CLCの典型的な例は、開発者が異なるプラットフォームで単一のゲームを利用可能にしようとするモバイル電話ゲームの開発です。たとえば、人気のあるモバイル電話ゲームであるTemple Runは、Windows、iOS、およびAndroidの3つのモバイル電話プラットフォームで利用できます。目標は、C#、Java、およびPythonプログラミング言語間の異なるクローンを特定することです。この方法はまずソフトウェアメトリックを取得し、次に各コードをメトリックと比較します。この方法のF1スコアは、異なる言語で65%から71%の間で報告されています。


Sudhamaniら[P86]は、セマンティッククローンを識別するためのメトリックベースの方法を提供しています。彼らは、制御文の種類と順序、入れ子になった制御文、演算子の種類と数、および変数の数などのメトリックを使用しました。この方法は、次の5つのステップで構成されています:1. 前処理、2. 特徴量の計算、3. 不類似度行列の計算、4. 類似性値の計算、5. クラスタリングを通じた類似プログラムの検出。メトリックは比較のために制御文機能テーブル(CSFT)行列に配置されます。異なる行列間の不類似性は、都市ブロック距離に基づいて計算され、最後に類似していないコードは削除されます。この方法のF1は、異なるJavaプロジェクトで実施された調査に応じて異なりますが、平均すると90%から95%の間になります。


Parsaら[P133]は、メソッド名推奨タスクのための類似したJavaメソッドを見つけるためのメトリックベースのアプローチを提案しました。ソースコードメトリックに基づく軽量プログラム表現が、Code2Vec [P85]やCode2Seq [24]などの複雑な深層学習ベースのモデルよりも、コード関連のタスク、特にメソッド名の提案において、より高い精度を達成することを示しました。ただし、彼らのアプローチでは意味的に類似したコードフラグメントを検出することはできません。



Learning-based techniques

近年、機械学習が広く普及していることを考慮し、学習ベースの方法を独立したカテゴリとして議論することを選択しました[122]。このセクションで要約された機械学習方法は、コード類似性の測定およびクローン検出のタスクで有望な結果を示しています[P17]、[P42]、[P49]、[P59]、[P84]、[P101]、[P102]、[P103]、[P108]、[P109]、[P118]、[P120]、[P132]。複雑なパターンを学習して認識する能力により、学習アルゴリズムはこれらのタスクに適しています。ただし、学習ベースの方法は、正しく機能するためには大規模かつクリーンなコードクローンデータセットが必要であり、すべての言語で利用可能ではありません。ほとんどのアプローチでは、機械学習のために必要なデータを準備するために既存のコードクローン検出ツールを使用しますが、これはツールが常にエラーを起こすため信頼性が低いです。


学習ベースのアプローチは、既知の類似および非類似のコードのデータセットを学習して、類似したコードフラグメントを分類またはクラスタリングすることを目指しています[P42]、[P59]、[P84]、[P102]、[P105]、[P107]。Cesareら[P37]は、パッケージレベルでクローンを識別するために従来の分類モデルを使用しました。著者らはランダムフォレストを最良の学習モデルと報告しました。Joshiら[P46]は、関数レベルでI型およびII型のクローンを識別するためにDBSCANクラスタリングアルゴリズム[123]を使用しました。Keivanlooら[P42]は、k-meansクラスタリングアルゴリズムを使用して、非類似性のしきい値を問わずIII型の真のクローンと偽のクローンを特定しました。著者らは、クラスタリングアルゴリズムの𝑘パラメータの異なる値に対するクラスタリング品質を評価するために、フリードマン法を使用しました。彼らのアプローチは、IV型のクローンを検出することはできません。


Mostaeenら[P67]は、12のソフトウェアJavaプロジェクトでクローンインスタンスを識別するために5つのクローン検出ツールを使用しました。その後、専門家の開発者が検出されたインスタンスを評価して偽陽性とラベル付けされたクローンの距離を認識しました。機械学習モデルがクローンと非クローンのサンプルを分類するために適用されました。これらのデータは、人工ニューラルネットワーク(ANN)に入力され、クローンを分類するように学習します。この方法はI型、II型、およびIII型のクローンを識別でき、異なるJavaプロジェクトでのこの方法の精度は89.5%から100%の間です。再現率は67.6%から96.7%の間です。Liら[P59]は、クローンと非クローンのインスタンスを分類するために類似ネットワーク(SNN)[124]を使用しました。PatelとRoopak[P129]は、III型およびIV型のコードクローンを検出するためにシャムニューラルネットワーク(SNN)[124]を使用しました。ただし、彼らの評価では、非シャムニューラルアーキテクチャの方が高い精度を示しています。TPCaps [P132]は、プログラム依存グラフ(PDG)から抽出された特徴に基づいてクローンペアを識別するためにカプセルネットワークモデル[125]を使用します。


📗Oreo: detection of clones in the twilight zone
[40, P72], 2018
[Cited by 179 (when 2024/2)]
メモ:Sainiら[P72]は、メソッドレベルでクローンを検出するための学習ベースの方法を提案しました。最初に、プログラムのメソッドはトークンの数に基づいてカテゴリ化されます。各メソッドのために一連のメトリックが抽出され、各メソッドに関連付けられたメトリックのベクトルに基づいて類似するクローンが識別されます。各メソッドのメトリックがまったく等しい場合、それらをクローンと認識します。しかし、メトリックの値が等しくない場合、クローンペアは、クローンを認識するためにトレーニングデータを使用してすでに訓練されたシャムディープニューラルネットワーク(SDNN)[124]に入力され、この入力がクローンであるかどうかを判断します。この方法の平均再現率は69.78%で、精度は89.5%です。


📕Predicting buggy code clones through machine learning
[250, P124], 2022
[Cited by 2 (when 2024/2)]
メモ:Islamら[P124]は、不具合のあるコードクローンを予測するための学習ベースの方法を提案しました。コードクローンの進化的特徴のうち6つ、変更回数、変更の最終コミット、クローンのタイプ、カップリング、ソースシステムの数千のリビジョンから遺伝子の系統および変更パターンを検出して抽出されたSPCP(類似性を保持する変更パターン)、およびこれらの特徴を使用してサポートベクターマシンをトレーニングして不具合のあるコードクローンを予測しました。彼らの方法は、異なるJavaおよびCプロジェクトでの不具合のあるコードクローンを全体的に76%の精度、71%の再現率、および73%のF1で予測できます。


📗Code2vec: learning distributed representations of code
[23, P85], 2019
[Cited by 1267 (when 2024/2)]
メモ:Code2vec[P85]とCode2Seq[24]は、プログラム内のすべてのメソッドを固定長のベクトルに変換するためのコード埋め込みアプローチを使用しました。次に、大規模なプログラムのメソッドコーパスでベクトル類似性を計算することにより、類似なメソッド本体が見つかります。Code2Vec[P85]とCode2Seq[24]は、メソッドのASTの間の異なるパスを入力として使用し、ディープニューラルネットワークでメソッド埋め込みを学習します。両方のアプローチは、高い計算コストと、複雑なASTを持つメソッドの名前提案での比較的弱いパフォーマンスに悩まされています。


📕Method name recommendation based on source code metrics
[26, P133], 2023
[Cited by 6 (when 2024/2)]
メモ:学習ベースのアプローチによって主に考慮されているコード類似性測定の新興アプリケーションは、開発者に彼らのニーズに応じてコードスニペットを提案するコード推薦です[P85]、[P133]。例えば、モデルはベンチマークの類似エンティティに基づいて、新しいソフトウェアエンティティ(例:新しいメソッド)の名前をコードに提案します。


📗Deep learning similarities from different representations of source code
[216, P65], 2018
[Cited by 184 (when 2024/2)]
メモ:Tufanoら[P65]は、学習モデルの特徴空間を向上させるために、識別子、AST、バイトコード、およびCFGの4つのコード表現を作成しました。著者らは、組み合わせモデルでバイトコードとCFGを使用することで、コードクローン検出の精度が向上すると結論付けました。


📗SEED: Semantic graph based deep detection for type-4 clone
[163, P130], 2022
[Cited by 3 (when 2024/2)]
メモ:SEED[P130]は、APIコールとオペレータトークンに焦点を当てながら、中間表現に基づいて意味グラフを形成するためにデータフローと制御フローを組み合わせます。グラフマッチネットワーク(GMN)[128]は、意味グラフから特徴ベクトルを抽出するために使用されます。SEEDで使用するために、コードフラグメントはコンパイル可能である必要があります。


📗Graphcodebert: pre-training code representations with data flow
[129], 2020
[Cited by 636 (when 2024/2)]
メモ:Guoら[129]は、コードの固有の構造を考慮して、ソースコード、特にASTのような構文構造を取る代わりに、変数間の「値の来源」の関係をエンコードするコードの意味構造であるデータフローを使用した事前学習モデルを提案しました。彼らのモデルはBERTモデル[130]で使用されているトランスフォーマーに基づいています。Java、Python、PHP、Go、Ruby、JavaScriptを含む6つのプログラミング言語から約230万の関数をトレーニングに使用しました。彼らのアプローチは、コードクローンの識別で94.8%の精度と95.2%の再現率を達成し、コード関連のタスクに対する良好なパフォーマンスを示しています。


📗C4: contrastive cross-language code clone detection
[244, P116], 2022
[Cited by 15 (when 2024/2)]
メモ:Taoら[P116]は、CodeBERTモデルを活用してクロス言語コードクローンを検出しました。


📗Using a nearest-neighbour, BERT-Based approach for scalable clone detection
[248, P122], 2022
[Cited by 3 (when 2024/2)]
メモ:Chochlovら[P122]は、CodeBERTディープニューラルネットワークを使用して、III型およびIV型のクローンを検出するために各コードフラグメントを固定長の特徴ベクトルに埋め込みました。その後、効率的な近似k-nearest neighbor(k-NN)アルゴリズムを適用して、各コードフラグメントの埋め込み間の𝑂(𝑛2)の比較を回避しました。彼らの結果は、SourcererCC[P47]、[P53]およびCCFinder[P5]と比較して、実行時間が短縮されました。ただし、彼らのアプローチは、グラフィカルプロセッサユニット(GPU)を搭載したシステムが必要です。


📗DOBF: a deobfuscation pre-training objective for programming languages
[Cited by 49 (when 2024/2)]
メモ:BERTやその派生物が、ソースコードなどの他のモダリティに適用されたときに最適な事前学習を提供するかどうかは不明です。Roziereら[131]は、プログラミング言語の構造的側面を活用した事前学習ネットワークを使用し、多数の下流タスクで既存のアプローチよりも優れたパフォーマンスを示しました。無監督コード翻訳で最大13%、自然言語コード検索で最大24%の相対改善を提供します。ただし、このような事前学習モデルは通常、非常に複雑であり、内部の意思決定プロセスを解釈することが難しいです。プログラミングスタイルを変更し、コードの多くの部分の名前を変更することで、そのようなモデルの結果を破壊するために敵対的に使用することができます。


📗An effective semantic code clone detection framework using pairwise feature fusion
[241, P112], 2021
[Cited by 8 (when 2024/2)]
メモ:Sheneamerら[P112]は、効果的な特徴生成が機械学習コードクローン検出において分類器のタイプよりも重要であると結論付けました。

コードのクローン検出は効果的なソフトウェアメンテナンスのために重要です。クローンが意味的に類似している(Type-IV)場合、つまり構造的に似ていない場合、このタスクはより難しいです。ほとんどの既存の手法は、AST(抽象構文木)またはPDG(プログラム依存グラフ)のいずれかの間でシーケンス類似性と/またはグラフ同型性を使用して、Type-I、II、IIIクローンを検出します。しかし、それらは主に意味的またはType-IVクローンを検出することに失敗します。本研究では、4種類のクローンを自動検出するための機械学習を使用した新しい検出フレームワークを提案します。2つのコードブロックから抽出された特徴は、参照ブロックに関連するクローンの可能性のある検出のために組み合わせられます。2つの特徴ベクトルを3つの異なる代替手法を使用して融合した後、両方のコードブロックのASTとPDGの特徴を使用してラベル付きトレーニングサンプルを準備します。提案されたスキームの予測性能を評価するために、Deep Convolutional Neural Networkを含む6つの最新の分類モデルを使用します。フレームワークの効果を評価するために、7つのデータセットを使用し、その性能を5つの最新のクローン検出器と比較します。また、コードクローン検出の大量のアルゴリズムを比較します。多数の機械学習技術(ANNおよび非ANN)の性能を比較し、ASTとPDGの特徴を融合することが、深層学習およびブーステッドツリーアルゴリズムを使用して競争力のある結果を与えることを確立します。XGBoostのようなブーステッドツリーアルゴリズムは、クローン検出においてかなり競争力があります。実験結果は、当該アプローチが予測精度の点で既存のクローン検出方法を上回ることを示しています。




Image-based methods

画像ベースのコード類似性測定方法は、コードフラグメントを画像に変換し、その後画像処理技術を使用してコードフラグメント間の類似性を見つけます[132]。視覚的クローン検出に触発され、WangとLiu[P77]は、クローン検出のための画像ベースの方法を提案しました。この方法では、事前処理されたソースコードが画像に変換され、画像間のジャカード類似性が計算され、類似したソースコードを見つけます。ソースコードの事前処理手順には、主にコメントと空白の削除、およびコード内のキーワード、データ型、識別子、およびリテラルのハイライトが含まれます。このアプローチは、主にコードスニペットの外観に依存しているため、タイプIVのクローンや意味的に類似したコードを検出することはできません。



Test-based methods

大部分のコード類似性測定アプローチで使用される静的ソースコード解析は、意味的に等価なメソッドやタイプIVのクローンを特定するには適していません。テストベースの方法では、プログラムをサンプル入力またはテストスイートで実行し、そのランタイムデータを収集します。これらのデータは、意味的に等価なコードを検出するために使用できます。Liら[P66]は、タイプIVのコードクローンを特定するためのテストベースのクローン検出アプローチを提案しました。EvoSuiteテストデータ生成ツール[133]を使用して、各メソッドのペアごとにテストスイートが自動生成されます。2つのメソッドが生成されたテストケースの各々で同じ出力を生成する場合、それらは意味的に等価なメソッドと見なされます。著者らはJava開発キット(JDK)内のタイプIVのクローンメソッドを特定できました。ただし、異なるメソッドのためにテストケースを生成して実行することは、計算コストが高いです。また、テストベースの方法では、メソッドの本体内の等価なフラグメントを特定することはできません。Suら[P50]も同様の方法を提案しています。彼らは既存のワークロードを使用してプログラムを実行し、それらの入力と出力に基づいてプログラム間の機能的な類似性を測定しました。
LeoneとTakada[P123]は、Javaのオブジェクトに関連する制約を克服するためのタイプIVクローンまたは意味的クローン検出のためのテストベースのアプローチを提案しました。著者らは、Javaプログラム内のすべての必要なクラスの正しいインスタンス化を自動的に行うためにEvoSuite[133]を使用しました。各メソッドのテストコードの出力は、DeepHash関数を使用して、各インスタンス変数の値を考慮して数値化されます。彼らのアプローチは、比較する返り値を持つメソッドのみを扱います。また、EvoSuiteを使用したテストデータの生成は、時間とリソースを消費するプロセスです。



Hybrid methods

ハイブリッド手法は、個々の手法の課題に対処するために2つ以上の基本的な手法を組み合わせます。表3には、私たちの主要な研究によって提案された異なる手法の組み合わせとその適用領域が示されています。テキストベースの手法とトークンベースの手法が、主にグラフベースの手法や木ベースの手法と組み合わされていることが観察されます。前者の手法は効率的ですが効果が低く、一方、後者の手法は効果的ですが効率が低いです。そのため、これらの組み合わせは、コード類似性の測定に効率と効果を提供します。



トークンベース+テキストベースの手法

タイプI、II、IIIのクローンを見つける際の効率を保持しながら高い頑健性を実現するために組み合わされることもあります[P20]、[P29]、[P55]。


📗Enhancing source-based clone detection using intermediate representation
[193, P20], 2010
[Cited by 71 (when 2024/2)]
メモ:Selimら[P20]は、ソースコードと中間コード処理を組み合わせてタイプIIIクローンを検出するハイブリッドクローン検出技術を提案しました。彼らのアプローチは、タイプIIIクローンを検出するために、テキストベースとトークンベースのクローン検出器を補完します。中間表現での操作の数が減少すると、クローンコードセグメントの不一致が減少し、複雑な変化を持つクローンインスタンスを特定することができます。


📕A hybrid-token and textual based approach to find similar code segments


📗Similarity management of 'cloned and owned' variants
[208, P55], 2016
[Cited by 17 (when 2024/2)]
メモ:


トークンベースと木ベースの手法


📗Viewing functions as token sequences to highlight similarities in source code
[151, P36], 2013
[Cited by 11 (when 2024/2)]
メモ:ChilowiczらによってメソッドレベルでのタイプI、II、IIIのクローンを検出するために組み合わされました[P36]。クローンインスタンスは、最初にトークンのシーケンスに基づいて選択されます。次に、類似したメソッドのための呼び出しグラフが計算され、最初のステップで指定された誤検出インスタンスをフィルタリングするために比較されます。


📕Precise code clone detection with architecture of abstract syntax trees


📗LICCA: A tool for cross-language clone detection
[219, P76], 2018
[Cited by 48 (when 2024/2)]
メモ:トークンベースと木ベースの手法の組み合わせは、Vislavskiらによって提案されました[P76]。Java、C、JavaScript、Modula-2、Schemeなどの5つの異なるプログラミング言語でクロス言語クローンを検出するために使用されます。コード断片のペアから抽出された2つのトークンのシーケンスは、最長共通シーケンスアルゴリズムの変種を使用して一緒に比較されます。ただし、ASTから抽出されたシーケンスが長すぎる場合、比較が非効率になる可能性があります。


📕CCStokener: fast yet accurate code clone detection with semantic token
[260, P136], 2023
[Cited by 3 (when 2024/2)]
メモ:Wangら[P136]は、タイプやコンテキストなどの必要な情報を抽出するためにASTを使用しました。著者らは、AST内の𝑛個の変数に基づいて各トークンをモデル化するためにn-gramを適用しました。提案された手法のF1スコアは90%と報告されています。ただし、大規模なコードベースのASTとn-gramを構築するのは時間とリソースがかかります。

メトリックベース+グラフベースの手法

Wangら[P40]によって提案されました。候補クローンは、メトリックベースの方法によって選択され、その後、クローンインスタンスのPDGを比較することによって結果がフィルタリングされます。メトリックベースとグラフベースは、Roopamら[P5]によって全プログラムのPDGを作成する高いコストを削減するために一緒に使用されました。Kodhaiら[P39]は、メソッドレベルでクローンインスタンスを検出するためにメトリックベースとテキストベースの手法を組み合わせました。候補クローンはメトリックベースによって検出され、その後、結果はテキストベースの手法によってフィルタリングされ、偽陽性サンプルが減少します。Higoら[P38]は、メソッドレベルでのクローンインスタンスを検出し、2つのトークンのシーケンス間のJaccard類似度を測定することによって行いました。選択されたクローンの名前は、その後、最終的なサンプルを特定するために比較されました。Tekchandaniら[P54]は、セマンティッククローンまたはクローンのタイプIVを見つけるための到達定義とライブネス分析に基づいたアルゴリズムを提案しました。彼らのアプローチは、IoT領域で開発されたプログラムを対象としています。彼らはまず、トークンベースの手法を使用して候補クローンを選択し、次に選択された候補のCFGを比較してクローンインスタンスの最終グループを特定しました。彼らは、各コードスニペットのペアにおける無関係なステートメントを見つけるために、データと制御フロー解析の両方を活用しました。著者らは、クローンペアの数がデッドステートメントの数が増加するにつれて増加すると結論付けています。ただし、提案された手法は、精度と再現率の尺度に関して経験的に評価されていません。


トークンベース+グラフベースの手法

Yangら[P90]によって、トークンベースとグラフベースの手法が組み合わされました。ただし、彼らはグラフの比較にASTを使用しました。Dongら[P104]は、学生の宿題の盗作を検出するためにハイブリッド手法を使用しました。彼らのアプローチでは、与えられたコードを異なるコードスタイルを含むデータベースと比較して、まずコードのスタイルを認識します。同じスタイルのソースコードのASTが作成され、最終的なクローンインスタンスが決定されます。Thallerら[P127]は、トークンベースとテストベースを使用して意味的なクローンを特定しました。入出力パラメータのタイプは、トークン化されたコード断片を使用して静的解析フェーズで比較されます。その後、実行可能フラグメント(例:関数)の入力と出力値が比較され、プログラムの各ペア間の類似性が決定されます。彼らの提案されたツール、SCD-PSMは、テキストの類似性が異なる問題セットを表すため、コードクローンのタイプ2および3を検出することができません。木ベースとグラフベースは、Fangら[P99]によって組み合わされ、特に機能的なコードクローンを検出するために必要な構文と意味の特徴を抽出します。


木ベース+学習ベースの手法

近接ミスや意味的クローンを適切に検出するために主に組み合わされています[P80]、[P81]、[P82]、[P83]、[P97]、[P125]、[P126]、[P134]、[135]。


📗Fast code clone detection based on weighted recursive autoencoders
[222, P80], 2019
[Cited by 38 (when 2024/2)]
メモ:Zengら[P80]は、深層オートエンコーダーモデルを使用してASTからの特徴抽出を自動化しました。


📕Cross-language clone detection by learning over abstract syntax trees
[149, P81], 2019
[Cited by 58 (when 2024/2)]
メモ:


📗A novel neural source code representation based on abstract syntax tree
[223, P82], 2019
[Cited by 618 (when 2024/2)]
メモ:ソースコード表現のための新しい抽象構文木(AST)ベースのニューラルネットワーク(ASTNN)を提案。


📗Learning-based recursive aggregation of abstract syntax trees for code clone detection
[7, P83], 2019
[Cited by 6 (when 2024/2)]
メモ:


📗Twin-Finder: integrated reasoning engine for pointer-related code clone detection
[232, P97], 2020
[Cited by 8 (when 2024/2)]
メモ:


📗TreeCen: Building tree graph for scalable semantic code clone detection
メモ:Huら[P125]は、スケーラビリティを満たしながら意味的なクローンを検出するためにTreeCenを提案しました。最初に、与えられたメソッドからASTが抽出され、ノードタイプに応じて単純なグラフ表現であるツリーグラフに変換されます。その後、各ツリーグラフから6種類の中心性尺度が抽出され、機械学習モデルの特徴ベクトルが形成されます。2つのベクトルを連結して得られるコードペアの特徴ベクトルは、それがクローンであるか非クローンペアであるかに応じてラベル付けされます。TreeCen[P125]はメソッドレベルでのみ機能します。


📗Detecting semantic code clones by building AST-Based Markov chains model
メモ:[P125]と類似の手法がWuら[P126]によって提案されており、ソースコードASTがツリーグラフの代わりにマルコフ連鎖に変換されています。


📕Efficient transformer with code token learner for code clone detection


📗Towards a big data curated benchmark of inter-project code clones
[135], 2014
[Cited by 322 (when 2024/2)]
メモ:


📗xxx
[xx, Pxx], 20xx
[Cited by xx (when 2024/2)]
メモ:


最近では、多くの研究者が学習ベース、木ベース、グラフベースの手法を組み合わせ、クローン検出のための機械学習モデルの特徴空間を改善しています[P48]、[P80]、[P81]、[P82]、[P94]、[P97]、[P106]、[P107]、[P109]、[P134]。


📕Semantic clone detection using machine learning
メモ:SheneamerとKalita[P48]は、ASTとPDGから手動で特徴を抽出し、タイプ4のコードクローンを検出する分類器をトレーニングしました。


📕From local to global semantic clone detection
[230, P94], 2020
[Cited by 16 (when 2024/2)]
メモ:



一部のハイブリッドベースのクローン検出手法は、上記の手法を単純に組み合わせるだけではありません。これらは主にプログラミング言語コンパイラによって提供される低レベルのコード表現に依存しています[P20]、[P28]、[P96]、[P117]。


📕An efficient code clone detection model on Java byte code using hybrid approach
[196, P28], 2013
[Cited by 11 (when 2024/2)]
メモ:Rahejaら[P28]は、トークンベースのクローン検出の性能を向上させるために、バイトコード表現からメトリックスを計算しました。これらのアプローチは、ソースベースの方法と比較してクローン検出の再現性を高めますが、プログラムソースコードを中間コードにコンパイルおよび逆コンパイルする必要があります。


📕Stubber: Compiling source code into bytecode without dependencies for Java code clone Detection
[240, P111], 2021
[Cited by 7 (when 2024/2)]
メモ:Schäferら[P111]は、Javaソースコードをバイトコードに変換し、欠落している依存関係を含むコード断片を効果的にコンパイルするスタブツールを提供しました。彼らのツールは、BigCloneBench [135]で利用可能なメソッドなど、データセット内に存在しない依存関係を持つコード断片のコンパイルを可能にします。彼らは、彼らのツールがBigCloneBench内のすべてのJavaファイルの95%をコンパイル可能にすると報告しています。これにより、タイプI、II、およびIIIのコードクローンを見つけることが容易になりました。



Code similarity measurement tools and languages

SLR(Systematic Literature Review)では、80の学術ソフトウェアツールが提案されました。具体的には、136の主要な研究のうち、80の研究が、彼らの提案手法をサポートするツールを示しています。しかし、これらのツールがすべて公に利用可能ではないことに注意が必要です。表4には、ツール名とそのダウンロードリンク、メソッド、サポートされる言語、開発言語が示されています。文献においてダウンロードリンクとサポートされる言語が言及されていないツールは、表4に報告されていません。主要な研究で提案された80のツールの完全なリストは、オンラインのExcel付録 [80]で利用可能です。ツール名が示されている80の記事のうち、公にツールを公開しているのは33件(約41%)のみであり、この分野におけるツールサポートと信頼性のある出版物の不足を示しています。残りの47の学術ツールへのリンクは見つかりませんでした。

研究論文で議論されていないコード類似性測定およびクローン検出ツールが存在することに留意すべきですが、これらを研究者や実務者に完全な参照のために表4にリストアップしました。CPDツールは、C、C ++、C#、Go、Groovy、Java、JavaScript、Matlabなどの20を超えるプログラミング言語で重複するコードを検出するPMDソースコードアナライザー [86] のサブモジュールです。Simian [89] は、Java、C#、C、C ++、COBOL、Ruby、JSP、ASP、HTML、XML、Visual Basic、Groovyソースコード、およびプレーンテキストファイルで重複を特定します。iClones [87] は、トークンベースの技術を使用して、プログラムの履歴からクローン進化データを抽出します。iClonesは、Ehsanら[P135]によって、パブリックのGitHubリポジトリでプログラムの履歴からクローンインスタンスを抽出するために使用されました。著者は、機械学習を使用して、取得したクローンをその欠陥に基づいてランク付けし、メンテナンス活動を向上させました。MOSS [136] とAutoMOSS [88] は、盗作検出に特化したテキストベースのソースコード類似性測定です。

図8に示すように、ほとんどの利用可能なツールは、バックエンドでハイブリッド、学習ベース、木ベース、またはトークンベースの方法を使用しています。これは、これらの方法が高効率であり、ほとんどのプログラミング言語と互換性があるためです。一方で、テストベースのアプローチは1つしかなく、この方向の研究の難しさと革新性を示しています。図9は、利用可能なソースコード類似性測定とクローン検出ツールがサポートするプログラミング言語の頻度を示しています。1つのツールのみでサポートされている言語は、円グラフの右側に別個に示されます。サポートされているプログラミング言語の約7%が1つのツールによってサポートされています。上位5つの頻繁にサポートされている言語は、Java、C、C ++、C#、およびPythonです。利用可能なツールの約44%がJavaで記述されたソースコードをサポートし、33%がCまたはC ++のコードをサポートしていますが、PHP、Swift、Scalaなどの他の人気のあるプログラミング言語にはサポートツールがありません。したがって、マルチパラダイムおよびマルチ言語のコード類似性測定およびクローン検出ツールの開発の大きな機会があります。



Code similarity benchmark and datasets

データセットは、コード類似性測定ツールの構築と検証において重要な役割を果たします。主要な研究の調査によれば、ソースコードの類似性とクローン検出研究に関連する12のデータセットがあります。表5には、利用可能なコード類似性データセットといくつかの追加情報のダウンロードリンク、サポートされる言語、サイズ、および主な参考文献がリストされています。136のうち68(50%)の研究がこれらのデータセットを使用しています。残りの50%の主要な研究は、主に限られたオープンソースプロジェクトを使用しており、提案手法のほぼ半数に対して信頼性のある評価が欠けていることを示しています。私たちの調査によれば、これらの記事で70以上の異なるオープンソースプロジェクトが使用されています。ほとんどの研究では、GitHubプロジェクトを使用していますが、詳細がないため、異なるアプローチを公平に比較するのが難しいです。図10は、主要な研究で報告された情報に基づいて作成されたプロジェクトを使用してコード類似性測定ツールを作成および評価するために使用されたプロジェクトのワードクラウドプロットを示しています。主要な研究では、Apache Ant、ANTLR、JDK、およびPostgreSQLプロジェクトを主に使用して、自分たちのアプローチを構築および検証しています。

Bellonら[62]は、8つのソフトウェアスイート(4つのCプログラムと4つのJavaプログラム)でタイプI、II、およびIIIのクローンコードのリファレンスコーパスを作成しました。Bellonのベンチマークは、ファイル名、開始行番号、および終了行番号でコードクローンの位置情報を表しています。ベンチマークデータセットには、ギャップのある行の位置データは含まれていません。したがって、一部のタイプIIIのクローンを正しく評価することはできません[137]。Murakamiら[137]は、Bellonのデータセットにギャップのある行の位置情報を追加しました。ただし、このデータセットへのパブリックリンクは廃止されていることが観察されました。Charpentierら[138]の実験によると、参照クローンのかなりの割合が議論の余地があると示されており、これがBellonのベンチマークを使用して得られた結果にノイズをもたらす可能性があります。

BigCloneBench(BCB)[92]、[135]、[139]は、IJaDatasetソースリポジトリ内の既知のクローンのクローン検出ベンチマークです。ベンチマークの現在のバージョンであるIJaDataset(修正済み)およびクローン検出再現率を測定するツールは、GitHubリポジトリで公開されています(表5参照)。BCBデータセットのソースコードファイルは、さまざまなJavaオープンソースプロジェクトからクロールされています。私たちの知る限り、BCBはクローン検出およびコード類似性測定のための最大のデータセットです。それは、25000のシステムからのプロジェクトを含み、6000000の真のクローンペアと260000の偽のクローンペアがドメインの専門家によって注釈付けされています。KrinkeとRagkhitwetsagul[140]は、BCB [92]、[135]、[139]の構築方法を批判し、機械学習技術と特にともにコード類似性測定の学習において問題があると述べています。例えば、BCBには異なる機能に対する真のがラベル付けされていないクローンペアが含まれています。さらに、BCBデータセットは不均衡で偏っています。著者はBCBの既存の欠点を修正する解決策を提案していません。

CDLHの作業[141]は、クローンペアに真偽のタグがないコード断片を破棄したBCBのフィルターされたバージョンを提供しています。そのようなフィルタリングの結果、CDLHデータセットには9134個のコード断片が含まれています。しかし、著者はフィルタリングされたデータセットを公に公開していません。Schäferら[142]は、学習ベースのクローン検出タスクでのグラウンドトゥルース品質の役割を調査しました。著者は、CDLHデータセット[141]は学習ベースのクローン検出ツールを評価するのに適していないと結論付けました。BCBとCDLHの両方のデータセットには2つの主要な問題があります:(1)トレーニング、検証、および評価セットが厳密に分離されていないこと。 (2)ネガティブサンプルに対するグラウンドトゥルースがないこと、つまり、コードクローンでないものが何であるかが分かりません。

Luら[143]は、最近、コード理解と生成のための機械学習ベンチマークデータセットであるCodeXGlueを紹介しました。CodeXGlueには、14の異なるデータセットを持つ10のタスクのコレクションが含まれており、そのうち2つのデータセットはコードクローン検出タスクに属しています。CodeXGlueは、CDLHデータセットの9126サンプルとOJClone/POJデータセットのすべてのサンプルを使用しています[144]。

OJClone/POJ(POJ-104)データセット[144]には、104のプログラミング問題と、それぞれの問題に対する500人の学生が提出したC/C++のソースコードが含まれています。教育用のプログラミングオープンジャッジ(POJ)システムは、特定の問題に対して提出されたソースコードの有効性をテスト入力でコードを実行することで自動的に検査します。同じプログラミング問題を解決する異なるソースコードは、クローンインスタンスと見なされます。CF-500 [145]には、Cで書かれた23,000以上のコードスニペットが含まれており、Codeforces [95]というオープンジャッジングプラットフォームからの500の問題がカバーされています。各2つのコードスニペットでコードペアを構築できます。したがって、データセット内のコードペアの数は、すべての可能な組み合わせを使用すると10,000,000を超える場合があります。Code4Bench [91]は、Codeforcesプログラミングコンペティションプラットフォーム [95]に提出されたソースコードをベースに作成された類似のデータセットです。Code4Benchは、主に欠陥予測タスクに使用されています。Floresら[146]が提案したSOCOデータセットは、C/C++およびJavaプログラミング言語で再利用されたソースコードを検出することに焦点を当てています。このデータセットには、427のクローンコードのペアと66628の非クローンコードのペアが含まれています。

コード類似性データセットのサイズと多様性を増やすために、ZhaoとHuang[147]は、Google CodeJamコンペティション[94]の12の競技問題から1669のプロジェクトのセットを収集しました。このデータセットの各問題に提出されたコードスニペットには類似した機能があり、Googleがそれらを検証しています。したがって、これらは機能類似性(クローンのタイプIV)を検出するツールを構築および評価するために使用することができます。AtCoder [148]などの他のオンラインプログラミングコンペティションプラットフォームのデータはPerezとChiba [149]によって使用されています。ただし、最も頻繁に使用されるプラットフォームは、Google CodeJamコンペティション[94]とCodeforces [95]です。

GPLAGデータセットは、PDGベースの方法による盗用検出を評価するためにLiuら[16]によって作成されました。著者は、オープンソースのLinuxプログラム「join」から5つの手順を選択し、一連の盗用演算子[16]を適用してプログラムの変更バージョンを生成しました。このデータセットは公開されていませんが、著者によって提供された完全な説明に基づいて再構築することができます。マルウェアデータセット[20]は、マルウェア検出タスクを評価するために提案されました。オリジナルの悪意のあるコード、マルウェアの変種、およびVisual Basic言語で書かれた無害なコードが含まれています。GPLAGとマルウェアは、学習ベースのアプローチでは使用できない小規模なデータセットです。全体として、コード類似性測定の多くのアプリケーションに関するデータセット(コード推奨、コード予測、マルウェア、および脆弱性検出など)は限られていることが観察されています。



Comparison of code similarity measurement techniques

このセクションでは、異なるアプリケーション領域におけるコード類似性の既存の技術と応用を、それらが異なる評価項目においてどのようにパフォーマンスするかを比較します。コード類似性測定技術は、効果、効率、および拡張性の3つの要素を通じて評価されます。効果は一般的に、精度、再現率、F1、および正解率のメトリクスで測定され、アプローチがさまざまなデータサンプルでどのように優れたパフォーマンスを発揮するかを決定します。一方、効率は提案された手法の速度と計算コストに関連しており、拡張性は大規模なコードベースでのアルゴリズムの実行に影響する要因に関心があります。
残念ながら、すべての主要な研究が議論された評価メトリックの結果を報告しているわけではないため、コード類似性評価の領域ではさらなる経験的研究が必要です。主要な研究で使用されるさまざまなベンチマーク、データセット、およびアプリケーションのため、既存の手法を正確かつ公正に定量的に分析することは困難です。したがって、主要な研究で報告された結果を、各評価メトリックに対して定性的な用語(高い、適度、低い)を使用して比較しました。表6は、議論された方法の定性的比較結果を要約しています。各技術のサポートされるクローンタイプ、効果、効率、および拡張性を記載しました。また、各アプローチの主要な利点と欠点もリストアップしました。2つ以上の基本的なアプローチを組み合わせるハイブリッドアプローチ、または1つの研究で提案されたハイブリッドアプローチについては、制限された数の論文が存在するため、評価結果が十分ではないため、表6には記載されていません。
同様のシステムで報告されたF1値を平均化して、手法の全体的な効果を決定しました。表6の3列目の「高」用語は、平均効果が0.85よりも大きいことを示し、「適度」用語は、平均効果が0.70から0.85の間で使用され、効果が0.70未満の場合は「低」となります。
効率と拡張性は、主要な研究で議論された提案されたアルゴリズムの実行時間、必要なリソース、および複雑さに基づいて評価されました。
コード類似性測定技術のいずれも、効果的で効率的かつ拡張性のあるメカニズムですべてのタイプのクローンを検出できるわけではありません。異なるタイプのクローン検出は、アプリケーション領域に応じて必要とされる場合があります。表6に示されているように、提案されたすべての手法、ハイブリッドを含む、実際には特定の利点と欠点を持っています。たとえば、メトリクスベースの方法は、比較的高い再現率と拡張性を持っていますが、メトリクス値やベクトル類似性に適用される閾値に対して高度に敏感です。また、この方法で動作する公開されているツールは見つかりませんでした。IDCCD [6]、Siamese [152]、SourcererCC [153]、SourcererCC-I [154]、CPPCD [155]、SCDetector [156] CCFinderX [2]、CCAligner [157]、およびiClones [87]を含むトークンベースのコード類似性測定ツールは、クローンのタイプI、II、およびIIIに適しています。他の方法と比較して、比較的高い効果、効率、および拡張性を示します。ただし、タイプIVのクローンの精度が良くありません。
クローン検出ツールのグラフベースのコード類似性測定ツール、CloneDetective [158]、CBCD [103]、CodeBlast [159]、SPAPE [160]、CCSharp [83]、CCGraph [161]、およびGroupdroid [18]、HOLMES [162]、およびSEED [163]は、タイプIVのクローンでうまく機能します。ただし、効率的ではなく、拡張性がありません。また、グラフベースのツールは、通常、悪意のあるコードに適用されるコード混淆などのテクニックに対して脆弱です。Clone Miner [165]、CCLearner [166]、CrolSim [60]、DeepClone [167]、およびCCEyes [168]などの学習ベースのツールは、正確でスケーラブルですが、各アプリケーション領域ごとに巨大でクリーンなデータセットが必要です。最近の学習ベースのツール、Code2Vec [23]、Code2Seq [24]などは、コード推奨タスクに適しています。ただし、それらはメソッドレベルの類似性測定でのみ動作します。これらをさまざまなアプリケーションや抽象化レベルで動作させることができます。比較から、最適なアプローチは、ユーザーの選択、アプリケーション領域、計算リソース、および非機能要件に応じて選択する必要があります。


Challenges and Opportunities

過去20年間でコード類似性測定およびクローン検出手法には多くの進展がありましたが、この領域にはいくつかの課題と多くの研究機会があります。このシステマティックな文献レビューで、これまでに主要な研究で取り上げられていない6つの重要な課題を見つけ、優先順位付けしました。

Challenge1: 一つの顕著な課題は、異なる次元(サイズ、エンティティタイプ、深刻度レベル、クローンタイプ、およびプログラミング言語)に関する新しいコード類似性測定ツールを構築および評価するための信頼性のあるデータセットの不足です。サイズは、異なるプログラミング言語の異なるエンティティタイプのデータセットにおけるラベル付きインスタンスの数に関連しています。エンティティタイプは、抽象化レベルの細かさを指し、ステートメント、コードブロック、メソッド、クラス、およびパッケージなどの類似性測定に使用できるレベルを含みます。具体的には、ステートメントおよびコードブロックの類似性は、コード類似性測定を自動的な障害ローカリゼーション、障害予測、およびプログラム修復などの新しい領域に適用できるようにします。各エンティティタイプの最適な類似性測定技術はおそらく異なり、将来の研究で検討されるべきです。深刻度レベルは、2つ以上の類似および非類似コードの値を測定することを目指します。この文脈でのファジィ化の使用は、コードの負債の推定などの一部の問題において、より良い意思決定を支援します。すべてのクローンコードのタイプを考慮したデータセットが、現在のデータセットよりも優れた選択肢となります。最後に、複数のプログラミング言語を含むデータセットは、提案されたアプローチの一般化を評価し、言語間のクロス言語クローン類似性測定を行うのに役立ちます。データセットの役割が検証目的に限定されないことに注意する価値があります。データセットは、特に学習ベースのツールの作成において、新しいコード類似性測定ツールの重要な成果物です。
大規模で信頼性のあるコード類似性データセットを作成する自動化および半自動化された方法を提案することは、この分野で報告された結果の一般化にかなりの価値をもたらします。たとえば、RoyらとCordy [93]は、Javaに関する4種類のクローンに関連する14種類の変異演算子を使用して、大量の既知のクローンを合成する自動化された方法を提案しました。しかし、このような機械生成されたクローンは、開発者によって作成されたクローンとは類似していない場合があります。Pycloneは、同様にPythonのためのタイプI、II、およびIIIのコードクローンを生成します。Yuら [96]は、既存の実データを含むデータセットのデータサンプルを増やすためのプログラム変換に基づくより高度なフレームワークを提案しました。彼らは、データ拡張フレームワークがコード類似性測定タスクの性能を向上させると結論付けました。クローンコードのより自然なインスタンスを特定し、ラベル付けするための有望な手法の一つは、GitHubなどの大規模なコードホスティングプロバイダーを検索して、さまざまなリポジトリのコメントや問題の内容に基づいて類似のコードフラグメントを見つけ、その結果を手動で検証することです。

Challenge2: 一部のコード類似性測定手法、特にメトリックベースの手法、学習ベースの手法、およびテストベースの手法は、研究者と実践者から真剣な関心を集める必要があります。これらは、既存の技術と適切に組み合わされた場合、有望です。以前の研究のメトリックベースの手法では、最大21のメトリックとHalsteadのメトリックが使用されていました。ただし、ソフトウェアエンジニアリング文献に報告されている異なるプログラミングパラダイムのソースコードメトリックの数は、9つのメトリックよりもはるかに多いです。例えば、オブジェクト指向パラダイムには、合計190の異なるメトリックが報告されています。メトリックベースのアプローチは、ソースコードを固定長のベクトルとして表現し、学習ベースの手法で必要とされる入力を形成するために使用できます。ソースコードメトリックの数を増やし、自動特徴選択技術を適用することで、学習ベースの手法の特徴空間が向上し、より正確なコード類似性測定モデルが得られます。Zakeri-NasrabadiとParsa [27]–[29]による最近の研究では、新しいソースコードメトリックを使用して特徴空間を豊かにする可能性が示されています。新しく導入されたメトリックは、コード類似性の他の応用であるテスト効果の予測を行う機械学習モデルの性能を向上させます。より良いソースコード表現は、より良い類似性測定結果をもたらします。ソースコードメトリックは、言語の独立性、解釈可能性、および効率性といった利点を提供します。これらの利点は、ソースコードから自動的に特徴を抽出する深層学習アプローチでは観察されません。

Challenge3:提案されたコード類似性ツールの適用に影響を与える重要な要因は、その効率性、より具体的には、コード類似性を測定するのに必要な時間です。残念ながら、異なるアプリケーション領域でのコード類似性測定ツールの効率についての定量的な分析は報告されていません。グラフベースやツリーベースなどのいくつかのアプローチの低い効率性は、大規模なコードベースでの使用を妨げる可能性があります。既存のコード類似性測定ツールのスケーラビリティと効率のシステマティックな経験的評価が必要です。これらの側面を最大化するための最適なハイブリッド方法を見つけるためです。メトリックベースや学習ベースなどのアプローチの一部は、必要に応じて並列化およびスケーリングすることができます。ただし、これにはより多くの計算コストがかかるため、すべての状況で受け入れられるわけではありません。コード類似性測定ツールをクラウドインフラ上にホスティングすることで、リソースの割り当てとスケーラビリティが容易になります。ツールにキャッシュメカニズムを組み込むことも、必要ない計算を繰り返すことを避けるのに役立ちます。最後に、転移学習などの技術を使用して、類似した言語のトレーニング済みモデルから新しいプログラミング言語用のコード類似性測定モデルを効率的に作成することができます。

Challenge 4: ほとんどの主要な研究はコード類似性を測定するためにハイブリッドな手法を使用していますが、一般に利用可能なツールのほとんどはトークンベースの方法で動作しています。実際、テキストベースやトークンベースの手法よりも複雑な手順を使用するソフトウェアツールの数は限られています。研究者は、信頼性の高い再利用可能なツールを構築するために、グラフの比較、機械学習、静的解析、およびメトリクスの計算などの基本的なタスクに既存のライブラリをほとんど使用していませんでした。さらに、これらのツールはほとんど統合されておらず、IDE(統合開発環境)との統合もほとんど行われていないため、ソフトウェアエンジニアが使用することが難しいです。将来のツールは、適切なAPIとドキュメントを備えたIDEのプラグインとして準備することを推奨します。コード類似性ツールのコア機能に依存するアプリケーションは、これらのAPIとプラグイン内にカテゴリー分けされ、開発者の使用を容易にします。

Challenge 5: 提案されたほとんどの方法は、オブジェクト指向プログラム、主にJavaで書かれたものについて、クローンインスタンスの検出とコード類似性の測定に焦点を当てています。しかし、PythonやJavaScriptなどのマルチパラダイム言語の人気の増加に伴い、これらのパラダイムをサポートするアプローチが必要です。たとえば、メトリクスベースの方法は、すべてのプログラミングパラダイムで利用可能なソースコードのメトリクスのみを使用する場合があります。研究者は、JavaやC/C++以外のプログラミング言語に対するツールサポートされたアプローチの開発に焦点を当てることが推奨されます。主な課題は、おそらく利用可能なコード類似性データセットが存在しない新しい言語で既存の方法を動作させることです。先に述べたように、既存のモデルを数個のデータサンプルのみを使用して新しいドメインで動作させるために微調整する転移学習を適用することが1つの解決策です。もう1つの可能な解決策は、言語構造に依存しないソースコードメトリクスに基づいてモデルを作成することです。

Challenge 6: 最後に観察された課題は、ソフトウェア開発ライフサイクル(SDLC)の開発フェーズでコード類似性の技術とツールを活用していないことです。現在のクローン検出ツールは、ソフトウェアの保守フェーズで使用するように設計されています。つまり、それらはレガシープログラムで動作し、新しいプログラムの開発では機能しません。ソフトウェア開発中にコード類似性をリアルタイムで測定して通知することで、プログラマーはコードの繰り返しを避け、利用可能なソフトウェアコンポーネントを再利用できます。本論文で議論されているように、コード類似性測定の適用範囲はクローン検出に限定されません。本論文で言及されている他のアプリケーション、主にコード推奨、ソフトウェア開発の俊敏性の向上も、その一例です。

私たちは、コード類似性測定がソフトウェアエンジニアリングにおけるすべてのデータ中心のソリューションの基本的な構成要素として使用できると考えています。コード類似性の一般理論により、多くの煩雑なプログラミングタスク、自動コード推奨、欠陥予測、スメル検出、脆弱性発見、リファクタリング推奨、品質測定など、を自動化することが可能となります。各ドメインで独立して自動化されたアプローチが開発されましたが、これらのアプリケーションのほとんどとコード類似性測定との関係は十分に研究されていません。先述のアプリケーションの共通点をコード類似性測定に関連付けて調査することで、複数のタスクを効率的に実行できる汎用ツールの開発が促進されます。
自動コード推奨、例えばソフトウェアエンティティの命名とコード要約、は問題のあるソフトウェアエンジニアリングタスクと認識されています。コード類似性測定は、検出されたクローンの名前をプログラマーに推奨するために最適に利用できます。Alonらは、既存のクローンや類似メソッドに基づいてプログラムのプロパティ(名前や式の型など)を予測するハイブリッドな木ベースおよび学習ベースのコード類似性測定手法を最近提案しました。課題は、クリーンで適切な名前を持つクローンインスタンスを見つけることです。開発中のプログラムの適切なエンティティ名は、他のプログラミング言語の類似コードで見つかる場合があります。このような場合、クロス言語クローン検出アプローチが有用です。
コード類似性測定とクローン検出は、コードスメルをリファクタリングの機会として識別するためにも使用できます。Anicheらの最近の研究は、機械学習技術を使用してコード類似性に基づいてリファクタリングを推奨しました。統合開発環境(IDE)は、既存のクローン、リファクタリング、欠陥、剽窃、および他のソフトウェア品質属性に関するオンラインの提案を行うためにさまざまなコード類似性測定を装備することが期待されます。ソフトウェア2.0では、プログラミングには学習モデルが使用され、すべてのコードの構文と機能が非常に類似していると想定されます。違いを生み出すのは入力と出力データです。したがって、ソフトウェア2.0で書かれたプログラムに適応するためには、コード類似性の概念の新しい定義が必要です。さらに、強力なコード推奨ツールを設計・開発することで、スーパーな俊敏で自動化されたソフトウェア開発手法を実現できます。



Conclusion

この体系的文献研究は、主要な電子図書館で自動検索を実行し、関連するコード類似性測定とクローン検出の研究を選択します。初期の10000以上の記事から合計136の研究が選択され、それぞれの研究について、このトピックの異なる側面に関する5つの研究質問に答えるために詳細にレビューされます。この論文では、主要研究を次の5つの次元で分析します:手法、アプリケーション、データセット、ツール、およびサポートされるプログラミング言語。私たちの調査は、コード類似性測定の主要研究を分類することを目指しています。コード類似性測定に関する提案された分類に関する研究質問に対する簡潔な回答と、このレビューでの議論に基づく関連する結果は次の通りです:


RQ1の結果:当社のSLRによれば、ソースコードの類似性測定に使用される基本的な手法の少なくとも8つの異なる手法が存在します。学習ベースの手法とテストベースの手法は、最近のソースコードの類似性測定とクローン検出のコンテキストで適用されており、以前の調査ではカバーされていませんでした。SLRによれば、ほとんどの研究(27%以上)が、コードスニペットのテキストと構造の内容を比較してコードの類似性を測定するハイブリッド手法を採用しています。ただし、41%の記事のみが提案されたアプローチを公開されたソフトウェアツールでサポートしています。


RQ2の結果:当社の調査結果によれば、コードの類似性測定に関する研究は主にクローンおよび再利用の検出に焦点を当てています。しかし、私たちはソースコードの剽窃検出、マルウェア検出と脆弱性、コード予測、およびコード推奨という他の4つのアプリケーションドメインを発見しました。コードの類似性測定は、コードスメル検出、リファクタリングの提案、および不具合予測など、ソフトウェアエンジニアリングにおける労力を自動化できます。


RQ3の結果:主要研究からは、ソースコードの類似性とクローンを測定するための80のソフトウェアツールが抽出されましたが、そのうち33のツール(すなわち、41%)が公開されています。利用可能なツール全体では、18種類の異なるプログラミング言語についてコードの類似性測定とクローンの検出がサポートされています。これらのツールのうち、77%以上がJava、C、およびC++言語で書かれたプログラムをサポートしており、他のプログラミング言語やパラダイムに対するコード類似性測定ツールの不足が示されています。


RQ4の結果:主要研究の少なくとも50%が、主にGitHub上のJavaプロジェクトなどの限られたオープンソースプロジェクトを使用しています。コードクローンの検出とソースコードの類似性測定のために明示的に設計された12の異なるデータセットの使用が観察されました。136の主要研究のうち、わずか68件がこれらのデータセットを使用しており、報告されたデータセットがすべて公開されているわけではありません。産業や実際のソフトウェアシステムを含む公開、大規模、および品質の高いソースコードの類似性とクローンのデータセットの不足が観察されました。


RQ5の結果:コード類似性測定研究のパフォーマンスは、効果、効率、および拡張性の異なるメトリクスによって評価されます。既存の手法の効果に関して、当社のメタ分析では、適合率、再現率、F1スコア、および精度の平均がそれぞれ約86.3%、88.4%、86.5%、および82.5%であることが示されています。ただし、これらの結果は既存のツールを評価するために使用される異なるデータセットに基づいており、中程度の信頼性しかありません。コード類似性に基づく新しいアプリケーションのパフォーマンスは、古いアプリケーションよりも低いです。すべてのアプリケーションドメインでのコード類似性測定と標準データセットのさらなる実証評価が必要です。


RQ6の結果:当社のSLRは、ソースコードの類似性とクローン検出に関する研究の将来の方向性として考慮されるいくつかの潜在的な解決策を持つ、分野における6つの注目すべき課題を特定し、リスト化しています。包括的で大規模で信頼性の高いデータセットの不足、メトリクスベースおよび学習ベースの手法への注意の不足、人気のあるプログラミング言語と新しいプログラミングパラダイムの限定的なサポート、異なるアプローチの効率性と拡張性の経験的分析の不足、およびコード類似性測定に基づく新興アプリケーションを考慮した場合、分野における最も重要な課題と機会です。


コメント

このブログの人気の投稿

【論文メモ】<2022>コードクローン検索手法の調査

【論文】A Survey on Causal Inference<2021>