web-dev-qa-db-ja.com

コードの類似性を判断するツールはありますか?

私は差分ツールについて話しているのではありません。別のプロジェクトから「リファクタリング」された可能性のあるコードがプロジェクトに含まれているかどうかを本当に見たいと思っています。関数名、変数名などは変更される可能性があります。条件文が逆転するなどの可能性があります。

37
siljoy

ソフトウェアエンジニアリングを教えていたとき、 Stanfordで(無料の)サービスを使用しましたMOSS(ソフトウェアの類似性の測定))。 これにより、学生のプロジェクト間の盗用を非常に簡単に検出でき、システムでは、授業中に使用した「既知の善良な」コード例を入力して無視することもできました。

返された結果のすばらしい点(完全に副次的な問題)は、どの生徒が一緒に働いているかを私たちが知ることができることでした。コードを露骨にコピーしなくても、コードが類似しているほど十分に問題について話し合いました。悲しい部分は、他のコードとの類似性がない奇妙な学生を見つけることでした。彼らは通常、それほどうまくいきませんでした。

10
Peter K.

PMDツール を使用して、探しているものを見つけることができる場合があります。これは、コードベース内のカットアンドペーストを検出するためのものですが、Originプロジェクトの疑いのあるソースを含めると、コードがどこからコピーされたかを確認するのに役立ちます。

8
busyspin

あなたが探しているものに私が知っている最も近いものは Clone Detective。 これはVisual Studioプラグインです。

Clone Detectiveは、他の場所で複製されているソースコードのC#プロジェクトを分析できるVisual Studio統合です。重複があると、簡単に矛盾が発生する可能性があり、多くの場合、因数分解が不十分なコードの指標になります。

5
epotter

2つの抽象構文ツリー(AST)の違いを計算したいように思えるので、 Smart Differencerツール に興味があるかもしれません。

https://stackoverflow.com/questions/974855/Eclipse-abstract-syntax-tree-diff にあります。

4
Matthew Rodatus

たとえdiffツールについて話していなくても、少なくともある程度はこれに使用できます。たとえば、似ているコードのセクションが2つある場合、両方をBeyondCompareに頻繁に貼り付けて、共通の機能をリファクタリングすることでコードを簡略化するのにどれだけの作業が必要かを確認します。

一方、同様のコードがどこにあるかわからないが、どこかに存在するものがあるのか​​と疑問に思っている場合は、何を探していますか?盗作を検出する自動化されたツール?そのようなものが存在するかどうかはわかりません。

1
Mason Wheeler

この件に関する wikipediaの記事 には、類似または重複したコードを見つけるために使用できるいくつかのツールへのリンクも含まれています。このための内部ツールがあるので、記事に記載されている外部ツールについてはよく知りません。

1
Alan

CCFinderX が類似性を視覚化する方法が本当に好きなので、あなたもそれをチェックしたいと思うかもしれません。かなりの数の言語をサポートしており、無料でセットアップがかなり簡単です(Python 2.6)。

1
MaR

あなたが本当にやりたいことは、2つのプロジェクト(どちらのプロジェクトも大きなファイルのセットで構成される可能性があります)全体にクローン(コピー)されたコードがあるかどうかを確認することです。これを行うには、クローン検出ツールを実行します。 Wikipedia はそれらのさまざまなリストです。

コピーが多いかどうかを大まかに決定するには、ソース行を一致させるだけでよく、さまざまな正確なソース行クローン検出器がそこにあります。 PMDもその1つだと思います。これらがしないことは、コピー・ペースト編集されたコードを見つけることです。彼らはおそらく、コピーペースト編集されたものの周りにラップされたボイラープレート・コピーペースト未変更コードを見つけるでしょう。

Copy-past-editコードのコピーの詳細を確認する場合は、「パラメーター化された」クローンを見つけるクローン検出器が必要です。トークンベースの検出器は、変数名または定数のみを置き換える編集に対してこれを行います。

抽象構文木(AST)ベースの検出器は、式、ステートメント、挿入、削除などの大きなチャンクを含む編集に対してこれを行います。トークン検出器とは異なり、コンピューターのソースコードの言語構造をガイドとして使用できるため、後者の方がより良い答えを返す傾向があります。

私たちの CloneDR ツールはそのような検出器です。

実際に「同等の」コード(逆条件文)を見つけるツールなどは知りません。研究者はこのようなことを行うクローン検出器を構築しましたが、組み合わせによりこれを実行すると非常にコストがかかり、研究プロトタイプのスケーリングが不十分になります。

1
Ira Baxter