コードの類似性を判断するツールはありますか?[閉まっている]


37

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


5
これはクラス用ですか?
TheLQ

1
@TheLQ-クラスルーム設定の外で、「カットアンドペーストが再利用される場所」を探すために狩りに行った複数のケースを考えることができます。旅団が通過しました。
MIA

Steve SmithのAtomiqを忘れないでください。
ジムG.

コメントや出力メッセージ(エラーなど)は、多くの場合、実際のコードよりも優れたコードをフィンガープリントできます。
ボルクブラット

彼らは常にUniでこれで私たちを脅かしました、そのようなツールが実際に存在していたかどうかを見るのは興味深いでしょう。
ジェイク

回答:


10

私がソフトウェアエンジニアリングを教えていたとき、私はMOSS(Measure of Software Similarity)と呼ばれるスタンフォードの(無料の)サービスを使用しました これにより、学生プロジェクト間の盗用を非常に簡単に検出できました。また、このシステムにより、授業中に使用していた無視できる「既知の良い」コード例を入力することができました。

戻ってきた結果の素晴らしい点(完全に副次的な問題)は、どの学生が一緒に働いたのかを知ることができたことです。悲しい部分は、他のコードと類似していない奇妙な学生を見つけることでした。彼らは通常あまりうまくいきませんでした。


おかげで、私はまさにそれ:)のようなものを探していた
ウルリッヒDangel

8

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


うん

しかし、PMDはJava専用ですよね?
ヤヌシュレナー

5

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

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


4

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

で発見https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff


(私のツールへの賛辞をありがとう)。SmartDifferencerは、特定のファイルペアの違いを検出します。類似性は違いを補完するものであるため、これは一種の正しいアイデアであることに同意しますが、それを提供するにはファイルのペアを識別する必要があり、システムが多数のファイルで構成されている場合は苦痛です。本当に必要なのはその補完です:ファイルのペアを個人的に識別せずに類似性を見つけ、それを行います。このようなツールについては、この同じスレッドでCloneDRの回答を参照してください。はい、関連技術を使用しています。
アイラバクスター

1

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

一方、同様のコードがどこにあるかわからない場合でも、どこかにコードが存在するのではないかと考えているだけなら、何を探していますか?盗作を検出する自動化ツールですか?そのようなものが存在するかどうかはわかりません。


もしそうなら、SCOはIBMに勝ったかもしれません:

1

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


1

本当にやりたいことは、2つのプロジェクト(両方のプロジェクトが大規模なファイルのセットで構成されている可能性があります)全体に複製(コピー)されているコードがあるかどうかを確認することです。これを行うには、クローン検出ツールを実行します。 ウィキペディアにはさまざまなものがリストされています。

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

コピーペースト編集コードのコピーの詳細を表示するには、「パラメーター化された」クローンを検出するクローン検出器が必要です。トークンベースの検出器は、変数名または定数のみを置き換える編集に対してこれを行います。

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

私たちのCloneDRのツールは、A検出器です。

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.