重複または類似の C コードの関数への移動を自動化したいと考えています。
これは Linux で動作する必要があります。
問題のサブセット: 重複コードの検出:
試してください: PMD
特に大規模なプロジェクトでは、重複するコードを見つけるのが難しい場合があります。しかし、PMD の Copy/Paste Detector (CPD) がそれを見つけてくれます! CPD は 3 つの主要な化身を経てきました。
- 最初に、Michael Wise の Greedy String Tiling アルゴリズムのバリアントを使用して記述しました (バリアントについては、こちらで説明しています)。
...
CPD は、Java、JSP、C、C++、Fortran、および PHP コードで動作することに注意してください。
テキストの行を単に比較することはできないことに注意してください。コードを解析する必要があります。この方法で、意味的には正しいが、名前付き識別子が異なる可能性のあるセグメントを検出することもできます。
たとえば、同等であるが異なる識別子を使用する2つの関数が与えられた場合、テキスト検索ではそれらが同一であるとは見なされませんが、パーサーは認識できます。
また、C ++パーサーを作成することは、文法が与えられている場合でも、簡単な作業ではないことに注意してください。私は他の人のアドバイスを提案し、このためのツールを探します。リファクタリングツールも検索してください。
Simian(前述)はこのための優れたツールです。私は自分のプロジェクトでCloneDetectiveを使用していますが、それはうまく機能します。CloneDetectiveは無料なので、試してみても害はありません。
ソース コード内の正確なコピーおよびニアミス (コピー、貼り付け、編集) クローンを見つけるためのツールであるCloneDRを参照してください。完全な言語パーサーを使用して、言語構造に従ってクローンを見つけ、誤検知を最小限に抑え、コードのコメントまたはフォーマット方法を完全にインデントすることで、真の検出を最大化します。CloneDR は、複製されたブロックが変数を変更したり、statemen やコード ブロックを挿入したりすると、複製を見つけます。
C、C++、COBOL、C#、Java、PHP、およびその他の多くの言語用の言語フロント エンドがあります。
クローン検出レポートのサンプルは、Web サイトで確認できます。
Simianを見てみたいと思うでしょう。非営利プロジェクトの場合は無料です。次のようなものを試してください:
# Find all C source files and identify similarities/duplicate code.
simian -includes=**/*.c -excludes=**/*_test.c
https://github.com/hudayou/fib
ファイルまたはディレクトリ内の同一のコード ブロックを見つけるためのツール。