私は差分ツールについて話しているのではありません。プロジェクトに、別のプロジェクトから「リファクタリング」された可能性のあるコードが含まれているかどうかを確認したい。関数名、変数名などが変更される可能性があります。条件が逆になるなど
私は差分ツールについて話しているのではありません。プロジェクトに、別のプロジェクトから「リファクタリング」された可能性のあるコードが含まれているかどうかを確認したい。関数名、変数名などが変更される可能性があります。条件が逆になるなど
回答:
私がソフトウェアエンジニアリングを教えていたとき、私はMOSS(Measure of Software Similarity)と呼ばれるスタンフォードの(無料の)サービスを使用しました。 これにより、学生プロジェクト間の盗用を非常に簡単に検出できました。また、このシステムにより、授業中に使用していた無視できる「既知の良い」コード例を入力することができました。
戻ってきた結果の素晴らしい点(完全に副次的な問題)は、どの学生が一緒に働いたのかを知ることができたことです。悲しい部分は、他のコードと類似していない奇妙な学生を見つけることでした。彼らは通常あまりうまくいきませんでした。
あなたが探しているものに最も近いのは、Clone Detectiveです。これはVisual Studioプラグインです。
Clone Detectiveは、別の場所に複製されたソースコードのC#プロジェクトを分析できるVisual Studio統合です。重複があると、簡単に矛盾が発生する可能性があり、多くの場合、不十分にファクタリングされたコードの指標になります。
2つの抽象構文木(AST)の差を計算したいようですので、Smart Differencerツールに興味があるかもしれません。
で発見https://stackoverflow.com/questions/974855/eclipse-abstract-syntax-tree-diff。
diffツールについて話していない場合でも、少なくともある程度はこれに使用できます。たとえば、コードの2つのセクションが似ているように見える場合は、両方をBeyondCompareに頻繁に貼り付けて、共通の機能をリファクタリングして簡素化するのにどれだけの作業が必要かを確認します。
一方、同様のコードがどこにあるかわからない場合でも、どこかにコードが存在するのではないかと考えているだけなら、何を探していますか?盗作を検出する自動化ツールですか?そのようなものが存在するかどうかはわかりません。
このテーマに関するウィキペディアのこの記事には、類似または重複したコードを見つけるために使用できるいくつかのツールへのリンクも含まれています。このための内部ツールがありますので、この記事で言及されている外部ツールについてはよく知りません。
本当にやりたいことは、2つのプロジェクト(両方のプロジェクトが大規模なファイルのセットで構成されている可能性があります)全体に複製(コピー)されているコードがあるかどうかを確認することです。これを行うには、クローン検出ツールを実行します。 ウィキペディアにはさまざまなものがリストされています。
大量のコピーがあるかどうかを大まかに判断するには、ソース行を一致させるだけでよく、さまざまなソース行クローン検出器があります。PMDもその1つだと思います。これらが実行しないのは、コピーペースト編集されたコードを見つけることです。コピー&ペースト編集されたものの周りにラップされたボイラープレートのコピー&ペースト変更されていないコードを見つけるでしょう。
コピーペースト編集コードのコピーの詳細を表示するには、「パラメーター化された」クローンを検出するクローン検出器が必要です。トークンベースの検出器は、変数名または定数のみを置き換える編集に対してこれを行います。
抽象構文木(AST)ベースの検出器は、式、ステートメント、挿入、削除などの大きなチャンクを含む編集に対してこれを行います。これらの後者は、トークン検出器とは異なり、コンピューターのソースコードの言語構造をガイドとして使用できるため、より良い回答を提供する傾向があります。
私たちのCloneDRのツールは、A検出器です。
実際に「同等の」コード(逆条件)を見つけるツールなどは知りません。研究者はこのようなことを行うクローン検出器を作成しましたが、コンビナトリクスにより実行に非常にコストがかかり、研究プロトタイプのスケーリングが不十分です。
私はCCFinderXが類似性を視覚化する方法が本当に好きなので、あなたもそれをチェックしたいかもしれません。かなりの数の言語をサポートしており、無料でセットアップもかなり簡単です(Python 2.6)。