重复程序

Duplicate Programs

我想编写一个代码,可以找到代码文件之间的相似性(也许可以通过百分比或至少 "guess" 找到可以复制哪些文件的相似性),我 运行 它用于 30 个文件每个文件最多 500 行。 我想识别重复文件(或怀疑重复的文件)。

我遇到几个问题:

这 2 个问题我认为我可以通过从代码中删除所有空格、换行符和注释来解决,但后来我遇到了以下问题

代码 1:

void main()
{
    int x;
    int y;
    scanf("%d", &x);
    switch(x)
    {
        case 1:
        //some code
        break;

        case 2:
        //some code
        break;
    }
}

代码2:

#define ONE 1
#define TWO 2
void main()
{
    int a, b;
    scanf("%d", &a);
    switch(a)
    {
        case ONE:
        //some code
        break;

        case TWO:
        //some code
        break;
    }
}

我会感谢任何帮助(可能使用现有工具或通过建议算法)

谢谢。

您可能有兴趣查看 MOSS,斯坦福大学开发的一个系统,它试图准确解决您的问题。

但是,如果您对开发自己的方法感到好奇,这里有一些想法可以解决您目前提到的问题:

  1. 将代码解析为 AST,以便您可以轻松地将代码作为数据结构进行操作,并忽略空格等问题。
  2. 您可以通过自己重命名变量来检测变量名称的变化,使用某种方案来保证基于声明顺序和作用域的唯一命名。如需一些灵感,请参阅 De Bruijn indices