一种基于余弦定理的代码相似度比较的函数重构方法技术

技术编号:16873492 阅读:31 留言:0更新日期:2017-12-23 11:31
本发明专利技术提供一种基于余弦定理的代码相似度比较的函数重构方法,包括获取编译的可执行文件的汇编指令并保存;读取保存的汇编指令,用分隔符将汇编指令分成各个方法函数,得到各个方法函数的方法名及汇编指令的映射表;用分割符对每条汇编指令进行分词;设置最小的汇编指令片段值及片段的相似度阈值;根据最小的汇编指令片段值选取基准比较片段,遍历各个方法函数的映射表中的汇编指令,依次选取与基准比较片段同等大小的汇编片段,并将依次选取的汇编片段逐一与基准比较片段进行相似度比较,找出相似片段;根据相似片段查找对应的汇编指令进行重构。本发明专利技术优点:可实现代码相似度的快速比较,以方便对重复的代码进行重构,确保软件代码的健壮性。

A function reconstruction method for comparison of code similarity based on cosine theorem

The present invention provides a method for reconstruction of function code similarity based on cosine theorem, including obtaining compiled executable assembly instructions and stored; reads the stored instructions, separator and the assembly instructions are divided into various methods of function, for each method function name and assembly instructions for mapping table; segmentation character segmentation of each assembly instruction set; the minimum value and the fragment assembly instruction segment similarity threshold; according to the selected benchmark minimum fragment assembly instruction fragment, assembly instructions in the mapping table traversal function of each method, followed by selecting the same size compared with the reference fragment assembly segments, and sequentially selected fragment assembly one by one, compared with the reference fragment similarity comparison to find similar fragments; according to the similar segment, find the corresponding assembly instructions Refactoring. The advantages of the invention can achieve rapid comparison of code similarity to facilitate the reconfiguration of repeated code and ensure the robustness of the software code.

【技术实现步骤摘要】
一种基于余弦定理的代码相似度比较的函数重构方法
本专利技术涉及软件开发领域,特别涉及一种基于余弦定理的代码相似度比较的函数重构方法。
技术介绍
在软件工程中,一个健壮优秀的代码,应该要求不存在重复代码,重复代码被业界认为是『万恶之源』。因此,在实际的软件开发过程中,我们时常要对代码进行重构,以消除重复代码。现有技术在实现对重复代码的消除时,一般都是通过人为的去进行代码的查看和比对,但是,在大型的软件工程中,特别是对于一个刚接触软件的新手来说,是很难确认在浩瀚的代码海洋中是否存在有与自己相似的代码,因此也很难对其进行重构。
技术实现思路
本专利技术要解决的技术问题,在于提供一种基于余弦定理的代码相似度比较的函数重构方法,通过该方法来实现代码相似度的快速比较,以方便对重复的代码进行重构,确保软件代码的健壮性。本专利技术是这样实现的:一种基于余弦定理的代码相似度比较的函数重构方法,所述方法包括如下步骤:步骤S1、获取编译出的可执行文件的汇编指令,且将获取的汇编指令保存至一输出文件中;步骤S2、从所述输出文件中读取保存的汇编指令,使用分隔符来将汇编指令分隔成各个方法函数,得到各个方法函数的方法名以及各个方法函数的汇编指令的映射表;步骤S3、使用分割符来对每条汇编指令进行分词处理;步骤S4、设置最小的汇编指令片段值以及设置片段的相似度阈值;步骤S5、先根据最小的汇编指令片段值选取一个基准比较片段;然后遍历各个方法函数的映射表中的汇编指令,依次选取与所述基准比较片段同等大小的汇编片段,并将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较;在比较的过程中,每当比较出的相似度大于等于设置的相似度阈值时,对选取的汇编片段以及基准比较片段的片段大小均加1后再进行相似度比较,且直到比较出的相似度小于设置的相似度阈值时才停止继续进行加1比较,同时将停止时所选取的汇编片段和基准比较片段判定为相似片段,并记录下这两个相似片段;步骤S6、根据记录的相似片段查找对应的汇编指令进行函数重构。进一步地,在所述步骤S5中,所述“将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较”具体为:将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较,相似度比较的算法如下:以汇编片段为向量,词为向量维度,词频为向量的一个维度上的大小,并代入N维余弦定理公式中,N为汇编片段中词的个数,计算出相似度;其中,N维余弦定理公式如下:进一步地,在所述步骤S5中,所述“记录下这两个相似片段”具体为:记录下这两个相似片段各自的所属方法函数、起始位置以及片段大小。进一步地,在所述步骤S4中,设置的最小的汇编指令片段值为3。进一步地,在所述步骤S4中,设置的片段的相似度阈值为85%。进一步地,在所述步骤S3中,所述分割符为空格、逗号或者制表符。本专利技术具有如下优点:巧妙的应用余弦定理来实现对代码相似度进行快速的比较,这在实际的软件开发过程中,可十分方便开发人员查找自己提交的代码是否与别人的代码相似,这有助于开发人员及时对重复的代码进行重构,以提高软件代码的简洁度和确保软件代码的健壮性。具体实施方式本专利技术一种基于余弦定理的代码相似度比较的函数重构方法,所述方法包括如下步骤:步骤S1、获取编译出的可执行文件的汇编指令,且将获取的汇编指令保存至一输出文件中;步骤S2、从所述输出文件中读取保存的汇编指令,使用分隔符来将汇编指令分隔成各个方法函数,得到各个方法函数的方法名以及各个方法函数的汇编指令的映射表;步骤S3、使用分割符来对每条汇编指令进行分词处理;步骤S4、设置最小的汇编指令片段值以及设置片段的相似度阈值;步骤S5、先根据最小的汇编指令片段值选取一个基准比较片段;然后遍历各个方法函数的映射表中的汇编指令,依次选取与所述基准比较片段同等大小的汇编片段,并将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较;在比较的过程中,每当比较出的相似度大于等于设置的相似度阈值时,对选取的汇编片段以及基准比较片段的片段大小均加1后再进行相似度比较,且直到比较出的相似度小于设置的相似度阈值时才停止继续进行加1比较,同时将停止时所选取的汇编片段和基准比较片段判定为相似片段,并记录下这两个相似片段;步骤S6、根据记录的相似片段查找对应的汇编指令进行函数重构。在所述步骤S5中,所述“将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较”具体为:将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较,相似度比较的算法如下:以汇编片段为向量,词为向量维度,词频为向量的一个维度上的大小,并代入N维余弦定理公式中,N为汇编片段中词的个数,计算出相似度;其中,N维余弦定理公式如下:在所述步骤S5中,所述“记录下这两个相似片段”具体为:记录下这两个相似片段各自的所属方法函数、起始位置以及片段大小,以方便开发人员能够快速、准确的查找到两个相似片段的位置。在所述步骤S4中,设置的最小的汇编指令片段值为3,设置的片段的相似度阈值为85%,以上数据是在经过大量的实践和统计分析后得到的最佳实施效果。在所述步骤S3中,所述分割符为空格、逗号(,)或者制表符()。下面以C语言为例来对本专利技术做进一步说明:1、使用objdump–D这个Linux提供的命令,来获取我们编译出来的可执行文件的汇编指令,并将获取的汇编指令保存到一输出文件(这个文件可以根据需要进行自行创建)中。2、从上述输出文件中读取保存的汇编指令,并以<functionname>:作为分隔符来将汇编指令分隔成各个方法函数,得到各个方法函数的方法名以及各个方法函数的汇编指令的映射表;例如,<functionA>:MOVregA,regB;......;ENG;<functionB>:MOVregC,regD;......;ENG。由以上可看出,这段汇编指令可分隔成<functionA>:和<functionB>:的两个方法函数,方法名分别是A和B,得到的汇编指令的映射表分别为【functionA:【MOVregA,regB;......;ENG】】和【functionB:【MOVregC,regD;......;ENG】】。3、以空格、逗号(,)或者制表符()作为分割符来对每条汇编指令进行分词。例如,汇编指令为:MOVregA,regB;则分词的结果可以是MOVregAregB,也可以是MOV,regA,regB等等,当然,在具体实施时,还可以将不同的分割符结合起来使用。4、设置的最小的汇编指令片段值为3,设置的片段的相似度阈值为85%。5、先选取一个片段大小为3的汇编片段作为基准比较片段;然后遍历各个方法函数的映射表中的汇编指令,依次选取与基准比较片段同等大小的汇编片段,并将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较;例如,基准比较片段选取的是1,2,3这3条汇编指令,那么,接下来就从2,3,4开始依次选取3条汇编指令来(在选取汇编指令时,需要遍历各个方法函数的映射表中的所有汇编指令)与基准比较片段进行相似度比较。其中,相似度比较的算法如下:以汇编片段为向量,词为向量维度,本文档来自技高网...

【技术保护点】
一种基于余弦定理的代码相似度比较的函数重构方法,其特征在于:所述方法包括如下步骤:步骤S1、获取编译出的可执行文件的汇编指令,且将获取的汇编指令保存至一输出文件中;步骤S2、从所述输出文件中读取保存的汇编指令,使用分隔符来将汇编指令分隔成各个方法函数,得到各个方法函数的方法名以及各个方法函数的汇编指令的映射表;步骤S3、使用分割符来对每条汇编指令进行分词处理;步骤S4、设置最小的汇编指令片段值以及设置片段的相似度阈值;步骤S5、先根据最小的汇编指令片段值选取一个基准比较片段;然后遍历各个方法函数的映射表中的汇编指令,依次选取与所述基准比较片段同等大小的汇编片段,并将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较;在比较的过程中,每当比较出的相似度大于等于设置的相似度阈值时,对选取的汇编片段以及基准比较片段的片段大小均加1后再进行相似度比较,且直到比较出的相似度小于设置的相似度阈值时才停止继续进行加1比较,同时将停止时所选取的汇编片段和基准比较片段判定为相似片段,并记录下这两个相似片段;步骤S6、根据记录的相似片段查找对应的汇编指令进行函数重构。

【技术特征摘要】
1.一种基于余弦定理的代码相似度比较的函数重构方法,其特征在于:所述方法包括如下步骤:步骤S1、获取编译出的可执行文件的汇编指令,且将获取的汇编指令保存至一输出文件中;步骤S2、从所述输出文件中读取保存的汇编指令,使用分隔符来将汇编指令分隔成各个方法函数,得到各个方法函数的方法名以及各个方法函数的汇编指令的映射表;步骤S3、使用分割符来对每条汇编指令进行分词处理;步骤S4、设置最小的汇编指令片段值以及设置片段的相似度阈值;步骤S5、先根据最小的汇编指令片段值选取一个基准比较片段;然后遍历各个方法函数的映射表中的汇编指令,依次选取与所述基准比较片段同等大小的汇编片段,并将依次选取的汇编片段逐一与所述基准比较片段进行相似度比较;在比较的过程中,每当比较出的相似度大于等于设置的相似度阈值时,对选取的汇编片段以及基准比较片段的片段大小均加1后再进行相似度比较,且直到比较出的相似度小于设置的相似度阈值时才停止继续进行加1比较,同时将停止时所选取的汇编片段和基准比较片段判定为相似片段,并记录下这两个相似片段;步骤S6、根据记录的相似片段查找对应的汇编指令进行函数重构。2.根据权利要求1所述的一种基于余弦定理的代码相似度比较的函数重构方法,其特征在于:在所述步骤S5中,所述“将依次选取的汇编片段逐一与所述基准比较片段进...

【专利技术属性】
技术研发人员:吴志坚
申请(专利权)人:福建星瑞格软件有限公司
类型:发明
国别省市:福建,35

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1