用于标识源代码版本之间的语义区别的方法和装置的制造方法_3

文档序号:9687265阅读:来源:国知局
一个int类型的参数,因而函数1和函数2的原型是匹配的。
[005引又例如,比较表1所示的函数1和表3所示的函数3,尽管两者的返回类型和函数 名均相同,然而由于函数1的形式参数列表包括一个int类型的参数,而函数2的形式参数 列表包括两个int类型的参数,此时函数1和函数3的原型是不匹配的。应当注意,由于函 数原型中的形式参数列表仅仅考虑形式参数的数量和类型,并不考虑形式参数的名称W及 函数内的具体实现,因而表1所示的函数1和表4所示的函数4的函数原型是相匹配的。
[0059] 本领域技术人员应当理解,函数原型可W标识函数的最重要的信息,当存在多个 相匹配的函数原型时,可W通过进一步比较两个函数的变量信息、行号信息或者指令序列 等信息,来进一步确定两个函数之间是否存在语义区别。W此方式,可W更准确地找到相匹 配的第二函数,在下文中将进一步详细描述。
[0060] 在本发明的一个实施方式中,响应于第一原型不匹配于原型,确定不存在第二函 数包括:响应于函数的原型的哈希值不匹配于第一原型的第一哈希值,确定不存在第二函 数。
[0061] 随着用户需求的增长,源代码的复杂程度可能会越来越高,函数的原型也将变得 更加复杂。此时为了降低比较过程中的计算量并且提高比较效率,还可W分别计算第一函 数的第一原型的第一哈希值,并计算函数的原型的哈希值。由于哈希算法可W确保将第一 哈希值和哈希值分别映射至唯一的数值,因而在比较时可W仅通过比较第一哈希值和哈希 值,即可确定第一原型和原型是否相匹配,进而确定在第二源代码版本中是否存在于第一 函数相匹配的第二函数。
[0062] 当确定第二源代码版本中存在第二函数时,还需要进一步比较第一调试信息中与 第一函数相关的部分W及第二调试信息中与第二函数相关联的部分,W便W更加精细的粒 度确定第一函数和第二函数之间是否存在语义区别。具体地,可W比较W下至少一个方面 的内容:编程计数器信息、行号信息、变量信息W及指令序列。
[0063] 在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括;响应于 确定存在第二函数,分别从第一调试信息中提取第一函数的第一编程计数器范围(program counterscope),W及从第二调试信息中提取第二函数的第二编程计数器范围;W及响应 于第一编程计数器范围不匹配于第二编程计数器范围,将第一函数标识为语义区别。
[0064] 编程计数器范围描述了与函数相关联的指令序列的地址范围(目P,将该函数编译 所得的指令序列的起始地址和终止地址之间的范围)。通常而言,对函数执行语义上的修改 将造成编程计数器范围的变化,因而当发现编程计数器范围发生变化时,有理由怀疑相关 的函数也出现了语义上的变化,因而可W基于编程计数器范围的变化来标识语义区别。
[0065] 当发现两个函数的编程计数器范围不同时,可W确定两个函数之间存在语义区 另IJ。应当注意,当两个函数的编程计数器范围相同的情况下,两个函数之间也可能存在语义 区别,因而判断编程计数器范围之间是否匹配并非判断是否存在语义区别的唯一标准,而 是还可W结合判断两个函数的其他方面是否匹配来进行判断。
[0066] 在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括;响应于 确定存在第二函数,分别从第一调试信息中提取第一函数的第一行的指令序列,W及从第 二调试信息中提取第二函数的第二行的指令序列;W及响应于第一行的指令序列不匹配于 第二行的指令序列,将造成第一行的指令序列和第二行的指令序列之间的不匹配的代码行 标识为语义区别。应当注意,在此的"第一"和"第二"旨在对不同函数中的代码行进行区 分,并不表示代码行在函数中的顺序。
[0067] 在调试信息中记载了函数中的每个代码行的行号W及相对应的指令序列,因而可 W通过将第一函数中的各个代码行的指令序列与第二函数中的各个代码行的指令序列进 行比较,W判断两个函数之间是否存在语义区别(例如,增加或者删除代码行)。具体地,下 文表5-表7示意性示出了函数的定义。
[0068]
[0071]
[0072] 应当注意,上文表5所示的函数5和表6所示的函数6是相匹配的函数,因而需要 进一步比较两个函数中的行号信息。通过比较发现,函数5的行号为(2-〉3-〉4),而函数6 的行号为(2-〉3-巧),此时可W比较与各个代码行相对应的指令序列;在行号2处,函数5 的指令序列和函数6的指令序列相匹配;在行号3处,函数5的指令序列和函数6的指令序 列相匹配;函数5在行号4处的指令序列与函数6在行号5处的指令序列相匹配。此时,尽 管两个函数的行号不完全相同,然而指令序列是匹配的,因而认为函数5和函数6之间不存 在语义区别。。
[0073] 应当注意,尽管在上文中仅仅示意性示出了在函数6中添加空行的情况,开发人 员还有可能将旧版本中的多个代码行合并为一行。本领域技术人员可W基于本文所述的原 理来设计具体实现细节,在此不再赏述。
[0074] 又例如,表5所示的函数5与表7所示的函数7的函数原型相同,因而函数5与函 数7是相匹配的函数。当比较函数5和函数7时可W发现,函数5的行号为(2-〉3-〉4),而 函数7的行号为(2-〉3-〉4-〉5)。可W比较与各个行号相关联的指令序列;在行号2处,函 数5的指令序列与函数7的指令序列相匹配;在行号3处,两个指令序列也匹配;在行号4 处,两个指令序列不匹配;而函数5在行号4处的指令序列与函数7在行号5处的指令序列 相匹配。因而,可W确定第4行(即,"s2=S2+1 ;")为语义区别。
[0075] 在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括;响应于 确定存在第二函数,分别从第一调试信息中提取第一函数的第一变量信息,W及从第二调 试信息中提取第二函数的第二变量信息;响应于第一变量信息不匹配于第二变量信息,确 定第一调试信息中与第一变量信息相关联的第一指令是否匹配于第二调试信息中与第二 变量信息相关联的第二指令;W及响应于第一指令不匹配于第二指令,将造成第一变量信 息和第二变量信息之间的不匹配的变量标识为语义区别。
[0076] 出于增加源代码的可读性等原因,编程人员可能会替换函数的名称,或者替换函 数中的部分或者全部变量的名称。例如,在上文表1所示的函数1和表4所示的函数4中, 函数1中的函数名称subl被替换为函数4中的化ncl,并且函数1中的变量si和s2分别 被替换为函数4中的tmpintegerl和tmplnteger2。
[0077] 应当注意,尽管函数名称和变量名称的替换导致了函数1和函数4从文本角度而 言完全不一致,然而从函数的语义方面而言,两个函数之间并不存在语义区别。因而,在标 识语义区别时还需要防止由于名称替换导致的干扰。
[0078] 具体地,需要分别从第一调试信息和第二调试信息中提取第一变量信息和第二变 量信息,并且当发现第一变量信息和第二变量信息不能匹配(例如,发现第一变量信息包 括si和s2,而第二变量信息包括tmpintegerl和tmplnteger2),此时可W进一步在第一调 试信息中确定与si相关联的第一指令,并且在第二调试信息中确定与tmpintegerl相关联 的第二指令。如果第一指令匹配于第二指令,则可W认为变量名si和tmpintegerl之间仅 仅是简单的名称替换的关系,否则可W造成第一变量信息和第二变量信息之间的不匹配的 变量(例如,函数1中的si和函数4中的tmpintegerl)标识为语义区别。类似地,本领域 技术人员还可W分别从第一调试信息和第二调试信息中提取与变量s2和tmpintegerf相 关联的指令,并将其进行比较。
[0079] 在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括;响应于 确定存在第二函数;分别从第一调试信息提取第一函数的第一指令序列,W及从第二调试 信息提取第二函数的第二指令序列;W及响应于第一指令序列匹配于第二指令序列,确定 第一函数与第二函数之间不存在语义区别。
[0080] 为了W更精细的粒度确定两个函数之间是否存在语义区别,还可W分别从第一调 试信息中提取编译第一函数所得的第一指令序列,并从第二调试信息中提取编译第二函数 所得的第二指令序列。由于第一指令序列和第二指令序列分别详细记录了第一函数和第二 函数的语义特征,因而将第一指令序列和第二指令序列进行比较,可W准确地确定两个函 数之间是否存在语义区别。当两个指令序列相匹配时,可W确定两个函数之间不存在语义 区别。
[0081] 在上文中结合具体示例描述了本发明的各个实施方式的步骤,现在将结合图5示 出本发明的方法的操作流程,W便本领域技术人员可W更明确地理解上述步骤之间的执行 顺序。图5示意性示出了根据本发明一个实施方式的通过比较调试信息而标识源代码版本 之间的语义区别的方法的流程图500。
[0082] 首先,在步骤S502中,判断在在第二源代码版本中是否存在与第一源代码版本中 的第一函数相匹配的第二函数,如果不存在则表示该第一函数仅在第一源代码版本中出 现,进而操作流程前进至步骤S508,并将第一函数标识为语义区别。当判断结果为"是"时, 操作流程前进至步骤S504,此时需要进一步基于在多个方面中比较第一调试信息和第二调 试信息,进而确定第一函数和第二函数之间是否存在语义区别。具体地,可W在如下方面中 的至少一个中比较第一函数和第二函数;编程计数器范围、行号信息、变量信息W及指令序 列。
[0083] 在步骤S506中,可W确定比较结果是否满足与不同方面相关的预定条件(例如, 当比较两个函数的编程计数器范围时,需要确定两个函数的编程计数器范围是否相同),当 不满足预定条件时,操作流程前进至步骤S508,W便将第一函数中相应的片段标识为语义 区别。当满足预定条件时,操作流程可W返回至步骤S504,W便在下一方面中进行比较。
[0084] 应当注意,在本发明的各个实施方式中可W首先比较两个函数的指令序列是否匹 配,如果比较结果为"是"则确定两个函数之间不存在语义区别;如果比较结果为"否",则可 W逐一在多个方面(例如,编程计数器信息、行号信息、变量信息)中进行比较,W便从多个 方面标识语义区别。
[
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1