85

かなり大きなコード ベース (C++ の 400K LOC) があり、コードの重複が問題になっています。重複したコード ブロックを効果的に検出できるツールはありますか?

理想的には、これは開発者が時々実行して問題の場所を確認するのではなく、開発中に使用できるものです。また、そのようなツールを CruiseControl と統合して、チェックインごとにレポートを提供できるとよいでしょう。

少し前にDuplocを見たことがありますが、グラフはきれいでしたが、それを使用するには smalltalk 環境が必要で、自動的に実行するのはかなり困難でした。

無料のツールもいいですが、商用の優れたツールがあれば興味があります。

4

13 に答える 13

39

Simianは、C++ プロジェクトの重複コードを検出します。

更新: Java、C#、C、COBOL、Ruby、JSP、ASP、HTML、XML、Visual Basic、Groovy ソース コード、さらにはプレーン テキスト ファイルでも動作します

于 2008-10-10T14:40:56.007 に答える
21

PMD の Copy-and-Paste-Detectorを使用し、次のラッパー スクリプトを使用してCruiseControl に統合しました (クラスパスに pmd jar があることを確認してください)。

チェックは毎晩実行されます。出力を現在の変更セットからのファイルのみをリストするように制限したい場合は、カスタム プログラミングが必要になる場合があります (アイデア: すべてをチェックし、変更されたファイルの 1 つが含まれる重複のみをリストします。変更によって使用される可能性があるため、すべてのファイルをチェックする必要があります。変更されていないファイルからの一部のコード)。XML出力を使用して結果を解析することで実行できるはずです。完了したら、そのスクリプトを投稿することを忘れないでください;)

まず、「テキスト」出力は問題ありませんが、ユーザー フレンドリーな方法で結果を表示する必要があるため、Perl スクリプトを使用して CPD の「xml」出力から HTML ファイルを生成します。これらは、クルーズのレポート jsp が存在する tomcat にポストすることでアクセスできます。開発者はそこからそれらを表示し、汚いハッキングの結果を見ることができます:)

150 KLoc コードで 2 秒未満で非常に高速に実行されます (空の行とコメントはその数にカウントされません)。

duplicatecheck.xml :

<project name="duplicatecheck" default="cpd">

<property name="files.dir" value="dir containing your sources"/>
<property name="output.dir" value="dir containing results for publishing"/>

<target name="cpd">
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask"/>
    <cpd minimumTokenCount="100" 
         language="cpp" 
         outputFile="${output.dir}/duplicates.txt"
         ignoreLiterals="false"
         ignoreIdentifiers="false"
         format="text">
        <fileset dir="${files.dir}/">
            <include name="**/*.h"/>
            <include name="**/*.cpp"/>
                <!-- exclude third-party stuff -->
            <exclude name="boost/"/>
            <exclude name="cppunit/"/>
        </fileset>
    </cpd>
</target>

于 2008-11-24T17:12:54.837 に答える
7

duploは、Duploc で使用されるアルゴリズムの C 実装のようです。コンパイルとインストールは簡単で、オプションは限られていますが、多かれ少なかれすぐに使用できるようです。

于 2008-12-17T04:54:12.637 に答える
6

これらの Debian パッケージは、次の行に沿って何かを行うようです:

PS [ほぼ] 重複を見つけることに関連するすべてのツールには、 debtagsタグが必要です。(しかし、それは何と呼ばれるでしょうか?)

于 2012-03-13T22:04:33.160 に答える
5

PMD プロジェクトを見てください。

私はそれを使用したことはありませんが、常に使用したいと思っていました。

于 2008-10-10T14:43:34.957 に答える
3

毎晩、ソース コード ベースでクローン検出プログラムを実行できます。

多くのクローン検出機能は、ソース行を比較することで機能し、正確な重複コードのみを見つけることができます。

上記の CCFinder は、言語トークンを比較することで機能するため、空白の変更には影響されません。トークンが 1 つしか変更されていない場合 (たとえば、クローン内の変数 X が Y に変更されている場合)、元のコードのバリアントであるクローンを検出できます。

理想的にはあなたが望むのは上記ですが、変数を式で置き換えたり、ステートメントをブロックで置き換えたりするなど、比較的恣意的なバリエーションが許可されているクローンを見つける機能が必要です。

当社の CloneDR クローン検出器は、Java、C#、C++、COBOL、VB.net、VB6、Fortran、およびその他のさまざまな言語に対してこれを行います。これは、 http ://www.semdesigns.com/Products/Clone/index.html で見ることができます 。

CloneDR エンジンは、複数の言語を処理できるだけでなく、ASCII、ISO-8859-1、UTF8、UTF16、EBCDIC、多数の Microsoft エンコーディング、および (日本語) Shift- JIS。

このサイトには、C++ 用のものを含む、いくつかのクローン検出実行のサンプル レポートがあります。

2014 年 2 月編集: すべての C++14 を処理するようになりました。

于 2009-06-28T19:27:51.353 に答える
2

CCFinderXは、複数のプログラミング言語 (Java、C、C++、COBOL、VB、C#) をサポートする無料の (社内使用向け) クローン コード検出器です。

于 2008-10-11T04:55:41.257 に答える
2

ConQATは、C++ コード分析をサポートする優れたツールです。空白を無視して重複を見つけることができます。非常に便利な GUI とコンソール インターフェイスを備えています。柔軟性があるため、セットアップは簡単ではありません。このブログ投稿は、c++ プロジェクトのセットアップに非常に役立ちます。

于 2013-08-03T14:48:37.667 に答える
2

コードの重複を検出するには、 SourceMeterツールを使用できます。これはコマンド ライン ツール (コンパイラに非常に似ています) であるため、前述のCruiseControlJenkinsなどの継続的統合ツールに簡単に統合できます。

于 2015-07-31T16:12:31.923 に答える
2

Same ( http://sourceforge.net/projects/same/ ) は非常に単純ですが、トークンの代わりにテキスト行で機能します。ファインダー。

于 2009-08-25T16:10:39.957 に答える
1

「同一の」コードスニペットを見つけるのは比較的簡単です。すでにこれを行っている既存のツールがあります(他の回答を参照)。

良いこともあれば、そうでないこともあります。あまりにも細かい「レベル」で実行すると、開発時間が遅くなる可能性があります。つまり、非常に多くのコードをリファクタリングしようとすると、目標が失われます(そして、おそらくマイルストーンとスケジュールが破綻します)。

より難しいのは、同じことを行うが、適切なドキュメントなしで異なる(しかし類似した)入力および/またはアルゴリズムを使用する複数の関数/メソッドを見つけることです。

同じことを行うために2つまたは異なる方法が必要で、プログラマーが1つのインスタンスを修正しようとしたが、他のインスタンスを修正するのを忘れた(またはそれらが存在することを知らない)場合、ソフトウェアのリスクが高まります。

于 2008-11-24T17:25:06.700 に答える
1

Java、C#、C++、C、Objective-C、JavaScript をサポートするSimianもあります。

Hudson (CPD など)によってサポートされています。

オープン ソース プロジェクトでない限り、Simian の料金を支払う必要があります。

于 2010-07-15T22:18:53.353 に答える
-3

TeamCityには、ビルド システムの一部として簡単に実行できる .NET および Java 用の強力なコード複製エンジンがあります。

于 2008-11-17T16:20:28.750 に答える