2

我需要一个非常具体的 VB(或多语言)工具。我想我会问一个是否已经存在,然后我开始自己制作一个(可能是在 python 中)。

我需要的:

  • 该工具必须以递归或非递归方式爬取路径,搜索扩展名列表,例如 .bas、.frm、.xxx
  • 然后,它必须解析这些文件,搜索函数、例程等。
  • 最后,它必须输出它找到的东西。

我基于“减少代码冗余”的想法,在这种情况下,糟糕的程序员会创建很多功能相同的功能,有时名称相同,有时不同。有4种情况:

  • 案例一:同名,同内容。
  • 案例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

你想要的是一个“克隆检测器”。这些工具在大量指定文件中查找复制和粘贴的代码。克隆不仅仅是功能;它们可以是代码块、数据声明等。

那里有各种各样的探测器,在您尝试构建自己的探测器之前,您应该知道它们是如何工作的。

有些只是匹配行以实现精确等价。虽然这些展示了基本思想,但它们的检测并不好,因为它们没有考虑到克隆代码经常有变化的事实;人们真正做的是在制作副本时进行克隆和编辑。

一些语言标记的匹配序列,例如标识符、关键字、文字、标点符号。这些至少是相对容忍空白的变化。他们可以找到其中单个标记已替换为单个标记的克隆。然而,由于它们不理解语言结构(块、语句、函数体),它们经常匹配跨越这种结构边界的序列(例如,“} {”通常被这些工具认为是克隆),它们产生相当高的错误- (非)克隆的阳性迹象。正如您所建议的那样,其中一些尝试将匹配限制为关键程序结构,例如完整的功能。

更复杂的检测器匹配程序结构。我们的克隆DR(我是原作者)是一个检测器,它使用编译器质量解析来抽象语法树,从而提取代码的精确结构。它对许多语言(包括 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 回答