《基于序列聚类的相似代码检测算法》

综述:
算法首先把源代码按照其自身的结构进行分段提取,然后对各个分段进行部分代码变换,再以带权重的编辑距离为相似度量标准对这些符号进行序列聚类,得到相似的程序代码片段,以达到对源程序进行相似功能检测的目的。
本文提取的是源代码中的功能段,也就是功能函数。
定义:
1.序列1和序列2的编辑距离:序列S1经过插入,删除,替代等操作变换成序列S2所需要的最少操作次数
2.S1与S2的签名距离:取某字母在两序列中出现次数相差最大的值
3.插入删除操作:关键字权重为2,函数或变量权重为1,操作符权重为1
4.转换操作:转换前后权重相加,如果符号类型不改变,则为原来权重
聚类原则:
1.首先根据两个序列的签名距离来判断是否相似
2.如果相似,再根据两个序列的编辑距离判断是否分为同个簇
算法步骤:
1.源程序代码的分段提取
采用一种多级分段方法,把源代码分为不同标准下的多种分段,分段的标准有类,函数,语句,然后再对下一级进行分段处理。在查找相似性时,由于函数功能段是整个源程序代码的主体,因此只需要使用第二级函数分段即可。
2.程序代码的部分转换
一般来说,操作符类型的代码能很好地与其他代码区分,但是关键字类型和变量类型地代码在读取和计算距离时很难区分,故本文首先把关键字类型地代码转换成一个个数字,再计算权重编辑距离。
3.符号序列的聚类
1)判断序列与序列之间是否相似
计算签名距离,判断是否相似
若相似,计算权重编辑距离进行进一步判断
2)判断序列与簇是否相似
只需把簇中的所有序列依次与该序列进行相似性判断
如果簇中有任意一个序列与该序列相似,就判定该序列与该簇相似
3)符号序列的聚类
本文采用基于密度的聚类算法对序列聚类
此时的相似关系可能有三种:
1.没有簇与该序列相似,新建了一个簇放入该序列
2.有一个簇与该序列相似,将序列加入该簇并更新簇的特征值
3.有多个簇与该序列相似,把这几个簇合成一个新簇,更新新簇特征值

算法使用要求;
1.用于相似代码检测(有模板,且长度大致相同)。功能相似但是长度不一致的编辑距离不一定比功能不相似但长度一样的编辑距离要小,无法实现功能相似性划分的精确结果。
2.编辑距离可以在网上找代码完成,但签名距离要自己编写,另外编辑距离要自己给相应的符号类型设定相应的权重。
3.要设定相应的权重自然要把关键字,函数或变量名,操作符找出来。变量名通常由关键字命名,搜索到关键字后一个单词即为变量名。
4.分段问题,根据如智能合约,可以分为合约,函数和事件。

发布了9 篇原创文章 · 获赞 0 · 访问量 279

猜你喜欢

转载自blog.csdn.net/Dedication_/article/details/99055221