2

VB(または多言語)用の非常に特殊なツールが必要です。自分で作成する前に(おそらくPythonで)、すでに存在するかどうかを尋ねると思いました。

必要なもの:

  • ツールは、パスを再帰的かどうかに関係なくクロールし、.bas、.frm、.xxxなどの拡張子のリストを検索する必要があります。
  • 次に、そのファイルを解析し、関数やルーチンなどを検索する必要があります。
  • そして最後に、見つかったものを出力する必要があります。

私はこれを「コードの冗長性を減らす」という考えに基づいており、悪いプログラマーが同じことをする多くの関数を、時には同じ名前で、時にはそうではないシナリオで作成します。4つのケースがあります:

  • ケース1:同じ名前、同じコンテンツ。
  • ケース2:同じ名前、差分コンテンツ。
  • ケース3:差分名、同じ内容。
  • ケース4:差分名、差分コンテンツ。

したがって、出力は次のようになります。

===========================================================================
RESULT
===========================================================================
Errors:
---------------------------------------------------------------------------
==Name, ==Content --> 3: (Func(), Foo(), Bar()) In files (f,f2,f3)
!=Name, ==Content --> 2: (Func() + Func1(), Bar() + Bar1()) In Files (f4)

---------------------------------------------------------------------------
Warnings:
==Name, !=Content --> 1 (Foobar()) In Files (f19)

---------------------------------------------------------------------------

これは、私が何を必要としているかをあなたに知らせるためです。

だから、問題は:これに似た何かを達成するツールはありますか?

PS:はい、最初は良いコードを書く必要がありますが、ご存知のとおり、何かが起こります。

4

1 に答える 1

3

必要なのは「クローン検出器」です。これらのツールは、指定されたファイルの大規模なセット全体でコピーアンドペーストされたコードを検索します。クローンは単なる機能ではありません。それらは、コードブロック、データ宣言などです。

さまざまな検出器があります。独自の検出器を作成する前に、それらがどのように機能するかを知っておく必要があります。

正確に同等であるために線を単純に一致させるものもあります。これらは基本的な考え方を示していますが、複製されたコードにはバリエーションがあることが多いという事実を考慮していないため、検出は適切ではありません。人々が実際に行うことは、コピーを作成するときにクローンを作成して編集することです。

識別子、キーワード、リテラル、句読点など、言語トークンのシーケンスに一致するものがあります。これらは、少なくとも空白の変更に対して比較的耐性があります。また、単一のトークンが単一のトークンに置き換えられたクローンを見つけることができます。ただし、言語構造(ブロック、ステートメント、関数本体)を理解していないため、そのような構造の境界を越えるシーケンスと一致することがよくあります(たとえば、「} {」はこれらのツールによってクローンと見なされることがよくあります)。 (非)クローンの陽性の兆候。これらのいくつかは、あなたが提案したように、完全な関数などの主要なプログラム構造への一致を制限しようとします。

より洗練された検出器は、プログラム構造と一致します。私たちのCloneDR(私は元の作成者です)は、コンパイラ品質の解析を使用して構文ツリーを抽象化する検出器であり、コードの正確な構造を抽出します。これは多くの言語(VB6およびVBScriptを含む)で行われ、クローンを任意の関数、ブロック、ステートメント、または宣言として配置し、パラメーターを使用してクローンがどのように変化するかを示します。CloneDRは、フォーマットの変更、コメントの場所やコンテンツの変更、さらには複雑な構成(複数のステートメントまたは式)が単純な構成(単一のステートメントやリテラルなど)の代わりに使用されているバリエーションにも関わらず、クローンを見つけることができます。検出率が高くなる傾向がありますが(通常、10〜20%の取り外し可能な冗長性が見つかります!)、誤検出率はトークンベースの検出器よりもかなり低くなる傾向があります。

コードクローン検出の手法とツールの比較と評価:さまざまなアプローチと利点について明確に説明し、CloneDRを含む多数の検出器を比較する定性的アプローチを参照してください。

2010年10月の編集:...私がこの応答を最初に書いたとき、私はOPがVB.netに興味を持っていると思いましたが、CloneDRはそうしませんでした。その後、CloneDRにVB.net、VB6、およびVBScript機能を追加しました。(VB.netを最新の形式で解析することは、Visual Basicのような「単純な」(!)言語で想像するよりもはるかに厄介です)。

于 2010-09-02T14:39:42.057 に答える