Page 70 - 《软件学报》2021年第9期
P. 70

2694                                 Journal of Software  软件学报 Vol.32, No.9,  September 2021

             3)   相似度的判定:使用最大公共子图距离算法计算关键字流图子图距离,该距离的大小决定了程序的相
                 似程度.

                1. 判断待测程序能否
                实现测试用例的重用
                                             判定程序        否
                            源程序            是否能实现测试              条件不满足,结束
                                             用例的重用

                                                  是
                 2. 关键字流图子图的构建              输入
                                                      输出            输入
                                            关键字流图                         公共子图
                                             构建模型          关键字流图          构建模型

                                                                    输出
                3. 相似度的判定                             输出   关键字流图    输入    最大公共
                                            程序相似度          公共子图           子图距离




                                             判断程序          得出结论
                                             是否相似



                                      Fig.1   Determining program similarity
                                           图 1   程序相似性的判定
         2.1   相关定义
             定义 1(关键字).  作为代码核心的标识符,用于表示一种数据类型或程序结构.像 Java 和 C 语言等编辑语言
         都有自定义的关键字.本文选择 Java 代码编写的程序作为实验对象,表 1 列出了 Java 语言中的关键字.
                                       Table 1  Keywords of Java language
                                           表 1   Java 语言的关键字
                                  abstract   assert   boolean  break   byte
                                   case     catch    char     class   const
                                 continue   default   do     double   else
                                  enum     extends   final   finally   float
                                   for      goto      if    implements  import
                                 instanceof   int   interface  long   native
                                   new     package   private   protected   public
                                  return   strictfp   short   static   super
                                  switch   synchronized   this   throw   throws
                                 transient   try     void    volatile   while
             定义 2(关键字流图).  关键字流图(keyword flow graph,简称 KFG)是一个五元组(V,E,keyword,entry,exit),其
         中:V 表示节点集,源程序的每个基本语句块都对应流图的相应节点;E 是边集,表示语句的流向;keyword 表示关
         键字集,存储着节点中的关键字,若源代码中无关键字,该节点储存字符 null;entry 和 exit 分别表示程序唯一的入
         口节点和出口节点.
             定义 3(关键字流图公共子图).  节点集 V 中的每个节点均是关键字流图 G 1 中的节点,同样又是关键字流图
         G 2 中的节点,那么节点集 V 在流图上构成的图即为流图 G 1 和 G 2 的公共子图.若存在节点集 G,且 G 1 和 G 2 不存
                                                                  [8]
         在其他的子图的节点数大于 G,那么 G 是 G 1 和 G 2 的一个最大公共子图 .
   65   66   67   68   69   70   71   72   73   74   75