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

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


             begin
             1   keywords←findKeywords(program1,program2);   //查找待测程序源代码基本块中关键字
             2   KFGs←buildKFGs(keywords);   //分别构建待测程序的关键字流图
             3   subgraphs←findSubgraphs(KFGs);  //利用动态规划算法寻找关键字流图的最大公共子图
             4   Knum,Snum←nodeNumber(KFGs,Subgraphs);   //计算每个关键字流图的节点数,最大公共子图节点数
             5   similarity←calculateSimilarity(Knum,Snum);   //计算待测程序相似度
             6   return similarity;
             end
             本节采用自适应的方法进行实验来选取程序是否相似的阈值                       [23] ,实验对象为已知功能相近的程序或者不
         相近的程序,实验方法为本节所提的程序相似性检测方法.表 3 和表 4 分别给出了本文方法验证部分基础程序
         及系统中常用功能程序的相似性实验结果.
                               Table 3    Testing of the similarity between basic programs     (%)
                                        表  3   基础程序间相似性的检测                               (%)
                         插值查找    二分查找     折半查找    顺序查找    基数排序     简单选择    冒泡排序     希尔排序
                插值查找       100      71      75      71       56      50       50      43
                二分查找       71      100      75      62       43      37       37      43
                折半查找       75       75      100     100      43      37       37      43
                顺序查找       71       62      100     100      43      37       37      43
                基数排序       56       43      43      43      100      71       71      86
                简单选择       50       37      37      37       71      100     100      67
                冒泡排序       50       37      37      37       71      100     100      67
                希尔排序       43       43      43      43       86      67       67      100
                       Table 4    Testing of similarity between commonly-used programs in the system    (%)
                                     表  4   系统常用功能程序间相似性的检测                           (%)
                                    用户登录 b         登录验证         信息下载         身份验证 b
                      用户登录 a           84            44            42           38
                      身份验证 a           37            55            43           92
                       数据处理            32            36            38           47
             表 3 考察了多个查找算法和排序算法两种不同功能的程序.从表中实验的数据可以看出:功能相近程序的
         相似性皆超过 70%;而不同功能的程序即使程序规模相近,其相似度也在 70%以下.本文将 70%设定为程序是否
         相似的阈值.
             表 4 中选用系统中常用的功能程序考察其相似度.用户登录 a 与用户登录 b 是两种不同脚本的登录算法,
         登录验证为用户登录时后台的验证算法.用户登录、身份验证、数据处理和信息下载为同一系统下不同功能的
         算法.表 4 中的实验结果再次验证了功能相同的程序间相似性较高,而功能不同的不相似程序的相似度均在
         70%以下,证明本文将判定程序是否相似的阈值设定在 70%的合理性(在判定规模较小的程序时存在一定的偶
         然性,应将特例排除).
         2.5   用关键字流图比较程序相似性的优势
             公共关键字流图子图比较程序相似性具有以下优势.
             1)   将程序转化成关键字流图,关键字是代码的核心标识符,关键字相同的节点意味着生成该节点的代码
                 语句结构相同.通过比较关键字流图来判定程序的相似性,解决了两个程序功能相同但源代码差异较
                 大的问题;
             2)   本文是在关键字流图最大公共子图的基础上比较程序的相似度.相对于最长公共子串比较相似性,公
                 共关键字流图子图更大程度比较了两个程序,避免了最长公共子串比较程序只取决于最长公共子串
                 大小片面性的问题;
   70   71   72   73   74   75   76   77   78   79   80