简单代码克隆检测(五)(控制流特征的提取)
Published:
本文主要介绍利用soot工具提取class文件中的cfg特征,并通过GEM(graph embedding Method)来求流程图之间的相似性。
实验背景:
实验原理:
按照论文中的描述,提取代码的第三个特征是CFG(控制流图的特征),而且这个特征的提取和利用跟前几个特征不太一样:
文中说identifier
,AST
,bytecode
representations,用的是之前我们介绍的autoencoder
,而CFG
用的是图形的embedding
实验步骤:
使用soot工具获取dot文件:
使用soot工具对class文件进行解析的时候,一直出错,不是class找不到,就是名字不对应,不管是cmd命令行还是编写程序调用都会出现很多的问题,最终还是采用了文档中不推荐使用的方法,加上参数–allow-phantom-refs
,最终是能够解析一个单独的文件,在进行对整个文件夹解析的时候,前面进行都很顺利,在中间出了错,不能继续向下解析了,此时我们已经得到了1w多个文件: 解析出来的文件:
随便打开一个文件查看里面的内容:
利用graphviz
生成png
图片:
处理dot文件,生成指定格式的训练数据:
观察论文作者提供的数据我们可以发现,他只提取了dot 文件中的顶点和顶点的关系,顶点的定义并没有提取,所以我就写了一个处理程序,提取指定字符串。
论文作者提供的数据:
提取的代码部分截图:
这里说一下,为了更加符合项目实际的要求,我把所有小于1k的数据基本上都排除了,留下来的基本上都是可以进行试验的数据,而且和bytecode提取的函数基本上一直,因为二者都是对class文件进行操作的。
对文件进行筛选:
最终得到的数据形式:
共1400多条数据
将生成的数据输入到GEM中得到距离矩阵:
这里我直接调用了论文作者给的代码,但其中有一个参数并没有给出具体的值,就是embedding size
,我暂时先设置成10,运行的过程因为需要各种神经网络的包,所以我直接在贾老师的服务器上跑了一下:
GEM:
最终跑出来的距离矩阵:
这次跑出来的结果我并没有时间进行统计,之前直接在MATLAB中进行操作就可以得到相似度很高的克隆对,这次是文件,还需要另外写代码,思路基本上都是一样的,所以基本上都可以实现查找相似的克隆对。
实验总结
这次实验中遇到的最大的困难就是soot
工具的使用,大概断断续续用了2天来进行这个cfg解析,关键还是要看他给的文档,除了普遍的方法,也要尝试一些极端的方法,由于我对最终的结果没有进行统计,所以不能直接说明这个特征对代码克隆的判断有什么影响,但是从目前的数据来说,发现有大量的相同的数据,但是他们的代码并不类似,而且绝大多数的方法的结构是顺序结构,也就是我们前面展示的第一种,所以只要语句的个数相同就能被判断完全相同,我感觉最主要的依赖的representation还是AST
和identifier
。