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

钱忠胜  等:面向关键字流图的相似程序间测试用例的重用                                                      2695


             定义 4(前缀与后缀)     [14] .  前缀 Pref[S,i](1≤i≤L),指从字符串 S 的第 1 个字符开始至字符串的某个位置 i 结
         束的特殊子串,可记为 S[1,i];后缀 Suffix[S,i](1≤i≤L),指从字符串 S 的位置 i 开始至整个串末尾的一个特殊子串,
         可记为 S[i,L].
             根据定义 4,公共前缀(后缀)表示一个字符串既是字符串 S 的前缀(后缀),又是字符串 T 的前缀(后缀),那么
         该字符串是字符串 S 和 T 的公共前缀(后缀).
             定义 5(最大公共子图距离).  给定两个非空图 G 1 和 G 2 ,以及它们的最大公共子图 mcs(G 1 ,G 2 ),它们之间的距
         离 [21,22] 可表示为
                                                    | mcs ( ,G G  ) |
                                          (,G
                                        DG  1  2 ) 1=−    1  2                                (1)
                                                    max(| G 1  |,| G 2  |)
         其中,|G 1 |和|G 2 |分别表示 G 1 ,G 2 的节点数,mcs(G 1 ,G 2 )表示最大公共子图的节点数.那么图 G 1 与 G 2 的相似度可以
         定义为
                                                         | mcs ( ,G G  ) |
                              SG    ) =  (1−  D ( ,G G  )) 100%×  =  1  2  ×  100%            (2)
                               ( ,G
                                               2
                                             1
                                 1
                                   2
                                                        max(| G 1  |,| G 2  |)
             定义 6(组间变异和组内变异).  在统计学中,组间变异表示数据的各组平均数 X 与总平均数 X 之间的离均
                                                                           i
         差平方和,记为 SS TR ;而组内变异表示每组数据中的每个测量值 X ij 与该组平均数 X 之间的离均差平方和,记为
                                                                           i
         SS e .它们的公式分别表示为
                                        k               k  i n
                                   SS  =  n (X − ∑  X ) ,SS =  2  ∑  n (X − ∑  X  ) 2         (3)
                                    TR     i  i      e      i  ij  i
                                        i=  1           i=  1 j=  1
         其中,n i 为第 i 组的组内数据个数,k 为组数.
             定义 7(方差分析).  在统计学中,方差分析(analysis of variance,简称 ANOVA)是用于两个及两个以上样本均
         数差别的显著性检验,又称为“变异数分析”或“F 检验”.F 值为组间均方 MS TR 与组内均方 MS e 的比值,表示为
                                               F=MS TR /MS e                                  (4)
         其中,MS TR =SS TR /k−1,MS e =SS e /N−k.这里,N 为各组数据个数的和,k 为组数.
         2.2   关键字流图的构建
             关键字是代码核心的标识符,能够代表代码的结构或者数据类型.某些代码中的关键字相同,意味着它们的
         代码结构相同.源代码中,每行代码或者功能相近的若干行代码为一个基本块,每一个基本块构成一个节点.关
         键字流图的节点中存储了形成该节点基本块中的关键字,若基本块中无关键字,此节点存储字符串 null;若该行
         代码存在两个及以上的关键字,记录第 1 个关键字即可.构建关键字流图的步骤类似于控制流图的构造过程,已
         有很多研究,本节不再做具体说明.下面是冒泡排序的关键字流图构造示例.
             图 2 中,图 2(b)是图 2(a)冒泡排序源码所对应的关键字流图.可以看出,关键字流图节点中存储了形成该节
         点的关键字.例如:生成第 2 个节点的基本块中含有关键字 int,该基本块在生成关键字流图过程中将该关键字储
         存在相应的节点上.待测程序的关键字流图构建完成,接下来比较待测程序关键字流图中关键字的异同,构建待
         测程序的关键字流图最大公共子图.图 3~图 5 分别给出了冒泡排序的控制流图、程序流程图和数据流图等几
         种比较常用的软件结构图与关键字流图的比较.通过对比发现:
             •   关键字流图比较程序相似性,注重程序的结构和功能上的异同,符合功能结构相同的程序,其测试用例
                会以更大概率共享的理念;
             •   控制流图能表达程序的结构,但不能展示图中每个节点的功能;
             •   程序流程图能清晰地表达程序的流程及功能,但存在许多相似节点合并的现象;此外,用自然语言总结
                节点功能存在一定的主观性,会因个人用语不同而存在文字上差别较大的情况;
             •   数据流图比较详细地阐述了程序主体及功能,也因此使其更加复杂,在比较程序相似性方面存在与程
                序流程图相同的缺点.
   66   67   68   69   70   71   72   73   74   75   76