6

重複または類似の C コードの関数への移動を自動化したいと考えています。

これは Linux で動作する必要があります。

4

6 に答える 6

4

問題のサブセット: 重複コードの検出:

試してください: PMD

特に大規模なプロジェクトでは、重複するコードを見つけるのが難しい場合があります。しかし、PMD の Copy/Paste Detector (CPD) がそれを見つけてくれます! CPD は 3 つの主要な化身を経てきました。

  • 最初に、Michael Wise の Greedy String Tiling アルゴリズムのバリアントを使用して記述しました (バリアントについては、こちらで説明しています)。
  • その後、Brian Ewins によって Burrows-Wheeler 変換を使用して完全に書き直されました。
  • 最後に、Karp-Rabin 文字列マッチング アルゴリズムを使用するように Steve Hawkins によって書き直されました。

...

CPD は、Java、JSP、C、C++、Fortran、および PHP コードで動作することに注意してください。

于 2009-12-15T15:25:48.720 に答える
1

テキストの行を単に比較することはできないことに注意してください。コードを解析する必要があります。この方法で、意味的には正しいが、名前付き識別子が異なる可能性のあるセグメントを検出することもできます。

たとえば、同等であるが異なる識別子を使用する2つの関数が与えられた場合、テキスト検索ではそれらが同一であるとは見なされませんが、パーサーは認識できます。

また、C ++パーサーを作成することは、文法が与えられている場合でも、簡単な作業ではないことに注意してください。私は他の人のアドバイスを提案し、このためのツールを探します。リファクタリングツールも検索してください。

于 2009-12-15T19:28:54.613 に答える
1

Simian(前述)はこのための優れたツールです。私は自分のプロジェクトでCloneDetectiveを使用していますが、それはうまく機能します。CloneDetectiveは無料なので、試してみても害はありません。

于 2009-12-15T15:34:24.337 に答える
1

ソース コード内の正確なコピーおよびニアミス (コピー、貼り付け、編集) クローンを見つけるためのツールであるCloneDRを参照してください。完全な言語パーサーを使用して、言語構造に従ってクローンを見つけ、誤検知を最小限に抑え、コードのコメントまたはフォーマット方法を完全にインデントすることで、真の検出を最大化します。CloneDR は、複製されたブロックが変数を変更したり、statemen やコード ブロックを挿入したりすると、複製を見つけます。

C、C++、COBOL、C#、Java、PHP、およびその他の多くの言語用の言語フロント エンドがあります。

クローン検出レポートのサンプルは、Web サイトで確認できます。

于 2010-02-19T09:59:05.887 に答える
1

Simianを見てみたいと思うでしょう。非営利プロジェクトの場合は無料です。次のようなものを試してください:

# Find all C source files and identify similarities/duplicate code.
simian -includes=**/*.c -excludes=**/*_test.c
于 2009-12-15T15:26:25.117 に答える
0

https://github.com/hudayou/fib

ファイルまたはディレクトリ内の同一のコード ブロックを見つけるためのツール。

于 2013-01-19T14:01:46.460 に答える