本发明属于代码相似度检测,具体涉及一种代码相似度检测方法、装置、电子设备及存储介质。
背景技术:
1、代码相似度检测是软件抄袭检测中最常用的一种检测方式,目前对于代码相似度检测,较常用的方式是直接基于ast语法进行相似度检测,如开源的工具clonedigger就是通过ast语法进行相似度检测。
2、然而,在实际情形中,直接通过ast语法进行相似度检测,存在非常严重的问题,其可以被很低代价绕开,只需要在原来的代码中添加大量无意义的冗余代码,换成ast语法树后,大量无意义的冗余代码也会生成到ast语法树中,从而使得原本相似度很高的两个软件,在代码相似度检测时所得到的检测结果反而是代码相似度底,从而导致代码相似度检测的准确率较低。
3、因此,如何提供一种有效的方案以提高代码相似度检测的准确性,已成为现有技术中一亟待解决的难题。
技术实现思路
1、本发明的目的是提供一种代码相似度检测方法、装置、电子设备及存储介质,用以解决现有技术中存在的上述问题。
2、为了实现上述目的,本发明采用以下技术方案:
3、第一方面,本发明提供了一种代码相似度检测方法,包括:
4、统计待进行代码相似度检测的第一软件代码和第二软件代码中通用调用的调用次数和调用类型;
5、分别将所述第一软件代码和所述第二软件代码中调用次数为0以及调用类型为赋值的通用调用判定为无意义调用;
6、分别将所述第一软件代码和所述第二软件代码转换成ast语法树,得到与所述第一软件代码对应的第一ast语法树和与所述第二软件代码对应的第二ast语法树;
7、识别所述第一ast语法树和所述第二ast语法树中的无意义逻辑代码块,所述无意义逻辑代码块为无返回值赋值、未对作用域外的变量赋值、未调用赋值外的其他函数、无返回语句且无抛出异常的逻辑代码块;
8、过滤掉所述第一软件代码和所述第二软件代码中无意义调用所对应的代码以及无意义逻辑代码块所对应的代码,得到过滤后的第一软件代码和过滤后的第二软件代码;
9、基于过滤后的第一软件代码和过滤后的第二软件代码进行代码相似度检测。
10、基于上述公开的内容,本发明通过统计待进行代码相似度检测的第一软件代码和第二软件代码中通用调用的调用次数和调用类型;分别将第一软件代码和所述第二软件代码中调用次数为0以及调用类型为赋值的通用调用判定为无意义调用;分别将第一软件代码和第二软件代码转换成ast语法树,得到与第一软件代码对应的第一ast语法树和与第二软件代码对应的第二ast语法树;识别第一ast语法树和所述第二ast语法树中的无意义逻辑代码块,无意义逻辑代码块为无返回值赋值、未对作用域外的变量赋值、未调用赋值外的其他函数、无返回语句且无抛出异常的逻辑代码块;过滤掉第一软件代码和第二软件代码中无意义调用所对应的代码以及无意义逻辑代码块所对应的代码,得到过滤后的第一软件代码和过滤后的第二软件代码;基于过滤后的第一软件代码和过滤后的第二软件代码进行代码相似度检测。如此,在进行代码相似度检测时,可先识别出软件代码中无意义的冗余代码,并过滤掉软件代码中无意义的冗余代码,然后再将过滤掉无意义的冗余代码的两份软件代码转换成ast语法树后进行相似度检测,从而可避免由于在代码中添加大量无意义的冗余代码而导致代码相似度检测准确性低的问题,提高代码相似度检测的准确性。
11、在一个可能的设计中,所述基于过滤后的第一软件代码和过滤后的第二软件代码进行代码相似度检测,包括:
12、分别将过滤后的第一软件代码和过滤后的第二软件代码转换成ast语法树,得到与过滤后的第一软件代码对应的第三ast语法树和与过滤后的第二软件代码对应的第四ast语法树;
13、对所述第三ast语法树和所述第四ast语法树进行相似度检测。
14、在一个可能的设计中,所述统计待进行代码相似度检测的第一软件代码和第二软件代码中通用调用的调用次数和调用类型,包括:
15、遍历所述第一软件代码和所述第二软件代码;
16、通过构建的符号表记录所述第一软件代码和所述第二软件代码中,所有变量、函数以及类的调用的调用名称、调用类型、作用域、对应文件和所对应的代码行数;
17、基于所述符号表中记录的数据统计出所述第一软件代码和第二软件代码中,所有变量、函数以及类的调用的调用次数和调用类型。
18、在一个可能的设计中,所述符号表为基于hash数据结构构建的或基于数组结构构建的。
19、在一个可能的设计中,所述识别所述第一ast语法树和所述第二ast语法树中的无意义逻辑代码块,包括:
20、遍历所述第一ast语法树和所述第二ast语法树中每行代码;
21、将对返回值赋值的代码所在的代码块标记为有意义的逻辑代码块;
22、将对作用域外的变量赋值的代码所在的代码块标记为有意义的逻辑代码块;
23、将调用赋值外的其他函数的代码所在的代码块标记为有意义的逻辑代码块;
24、将有返回语句的代码所在的代码块标记为有意义的逻辑代码块;
25、将有抛出异常的代码所在的代码块标记为有意义的逻辑代码块;
26、将未被标记为有意义的逻辑代码块作为无意义逻辑代码块。
27、第二方面,本发明提供了一种代码相似度检测装置,包括:
28、统计单元,用于统计待进行代码相似度检测的第一软件代码和第二软件代码中通用调用的调用次数和调用类型;
29、判断单元,用于分别将所述第一软件代码和所述第二软件代码中调用次数为0以及调用类型为赋值的通用调用判定为无意义调用;
30、转换单元,用于分别将所述第一软件代码和所述第二软件代码转换成ast语法树,得到与所述第一软件代码对应的第一ast语法树和与所述第二软件代码对应的第二ast语法树;
31、识别单元,用于识别所述第一ast语法树和所述第二ast语法树中的无意义逻辑代码块,所述无意义逻辑代码块为无返回值赋值、未对作用域外的变量赋值、未调用赋值外的其他函数、无返回语句且无抛出异常的逻辑代码块;
32、过滤单元,用于过滤掉所述第一软件代码和所述第二软件代码中无意义调用所对应的代码以及无意义逻辑代码块所对应的代码,得到过滤后的第一软件代码和过滤后的第二软件代码;
33、相似度检测单元,用于基于过滤后的第一软件代码和过滤后的第二软件代码进行代码相似度检测。
34、第三方面,本发明提供了一种电子设备,包括依次通信相连的存储器、处理器和收发器,其中,所述存储器用于存储计算机程序,所述收发器用于收发消息,所述处理器用于读取所述计算机程序,执行如上述第一方面或第一方面任一可能设计所述的代码相似度检测方法。
35、第四方面,本发明提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有指令,当所述指令在计算机上运行时,执行第一方面或第一方面任一可能设计所述的代码相似度检测方法。
36、第五方面,本发明提供了一种包含指令的计算机程序产品,当所述指令在计算机上运行时,使所述计算机执行如第一方面或第一方面任一可能设计所述的代码相似度检测方法。
37、有益效果:
38、本发明提供的代码相似度检测方法、装置、电子设备及存储介质,可在代码相似度检测时,可先识别出软件代码中无意义的冗余代码,并过滤掉软件代码中无意义的冗余代码,然后再将过滤掉无意义的冗余代码的两份软件代码转换成ast语法树后进行相似度检测,从而可避免由于在代码中添加大量无意义的冗余代码而导致代码相似度检测准确性低的问题,提高代码相似度检测的准确性,便于实际应用和推广。
1.一种代码相似度检测方法,其特征在于,包括:
2.根据权利要求1所述的代码相似度检测方法,其特征在于,所述基于过滤后的第一软件代码和过滤后的第二软件代码进行代码相似度检测,包括:
3.根据权利要求1所述的代码相似度检测方法,其特征在于,所述统计待进行代码相似度检测的第一软件代码和第二软件代码中通用调用的调用次数和调用类型,包括:
4.根据权利要求3所述的代码相似度检测方法,其特征在于,所述符号表为基于hash数据结构构建的或基于数组结构构建的。
5.根据权利要求1所述的代码相似度检测方法,其特征在于,所述识别所述第一ast语法树和所述第二ast语法树中的无意义逻辑代码块,包括:
6.一种代码相似度检测装置,其特征在于,包括:
7.一种电子设备,其特征在于,包括依次通信相连的存储器、处理器和收发器,其中,所述存储器用于存储计算机程序,所述收发器用于收发消息,所述处理器用于读取所述计算机程序,执行如权利要求1~5任意一项所述的代码相似度检测方法。
8.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有指令,当所述指令在计算机上运行时,执行如权利要求1~5任意一项所述的代码相似度检测方法。
