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

文档序号:9687265阅读:来源:国知局
,重命名操 作并不会影响源代码的运行结果,因而送些重命名仅仅属于文本内容的修改,并不导致源 代码语义上的变化。按照如图2所示的基于文本内容标识区别的技术方案,区别230可W 包括;1)删除函数subl;2)删除函数sub2 ;3)增加函数fund;4)增加函数func2 及?5) 在函数main中增加代码行printf( "a+b= %d\n" ,a+b)。
[0031] 此外,第一版本和第二版本的区别还可W包括函数位置更改后对应行号的变化。 尽管此类区别不会影响源代码的语义,但在常见的文本比较工具中仍会显示出来,送大大 增加了开发人员的工作量。
[0032] 由于文本区别并不会影响程序运行结果,在回归测试中开发人员不必关必文本区 另IJ,而是仅仅关必语义区别。本领域技术人员可W理解,在图2中所标识的区别1-5中,仅 有第5点增加代码行属于影响程序运行结果的语义区别,而其他1-4点区别仅属于文本区 另IJ。现有技术方案的缺陷在于,当使用例如图2所示的技术方案时,语义区别仅仅占所标识 区别的极少比例(20%)。因而开发人员需要从大量无关的文本区别中搜索的语义区别。
[0033] 应当注意,随着用户需求的复杂化,源代码的工程中通常会包括数百甚至更多的 文件。在图2中仅仅示意性示出了工程中包括一个文件的情况,本领域技术人员应当理解, 当源代码涉及多个文件时,开发人员可能会进行更多类型的文本修改:例如,增加或者删除 文件,将函数从一个文件移至另一文件,等等。因而,按照如图2所示的技术方案所标识出 的区别中将会包含更多的文本区别,送将使得开发人员更加难W找到的错误代码行。
[0034] 针对上述技术方案中的不足,本发明提供了一种用于标识源代码版本之间的语义 区别的方法,包括;分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调 试信息;通过比较第一调试信息与第二调试信息,确定在第二源代码版本中是否存在与第 一源代码版本中的第一函数相匹配的第二函数;W及基于确定的结果标识语义区别。
[0035] 本领域技术人员应当注意,在本发明的上下文中,"第一源代码版本"和"第二源代 码版本"并不表示时间顺序,而是"第一"和"第二"旨在对回归测试中涉及的两个源代码版 本进行区分。例如,第一源代码版本可W指回归测试中的已经经过上一轮测试的旧的源代 码版本,而第二源代码版本可W指正在经历当前轮次测试的新的源代码版本;或者,第二源 代码版本可W指旧的源代码版本,而第一源代码版本可W指新的源代码版本。
[0036] 具体地,图3示意性示出了根据本发明一个实施方式的用于标识源代码版本之间 的区别的技术方案的框图300。如图3所示,第一源代码版本310和第二源代码版本320是 回归测试中涉及的两个版本。在本发明的实施方式中,借助于比较各个版本的调试信息来 标识各个版本之间的语义区别。
[0037] 在编译时,编译器从源代码中收集大量信息,例如变量名、变量类型、函数所在行 号、代码序列所对应行号、函数名、函数的返回类型、函数的形式参数、函数的地址范围等信 息,然后按照预定的格式将送些信息写入到编译后的文件中。在本发明的上下文中,送些信 息统称为调试信息。
[003引调试信息具有多种格式,例如,St油S、C0FF、阳-C0FF和DWARF等。应当注意,在 本发明的各个实施方式中,可W基于现有技术中已知的或者将在未来开发的各种技术,来 从源代码中获取调试信息。在本发明的上下文中,将仅WDWARF为具体示例描述调试信 息。DWARF是一种广泛使用的调试信息,其全称为DebuggingWithAttributedRecord 化rmatSaDWARF记录了可执行程序的存储器地址W及与送些存储器地址相对应的源代码之 间的映射关系。关于DWARF的更多细节,本领域技术人员可W参见http://dwarfstd.org/ 和ht化://en.w化ipedia.org/wdki/DWARFW获取更多信息,本发明的上下文中将不再赏 述。
[0039] 通过比较来自两个源代码版本的调试信息中的两个对应片段(化agment),可W确 定与送些对应片段具有映射关系的源代码片段之间是否一致。由于两个源代码版本之间的 文本区别并不会导致调试信息中出现显著区别,因而通过比较调试信息可W方便并且快速 地找到两个源代码版本之间的语义区别,同时忽略文本区别。
[0040] 采用本发明的技术方案,可W从第一源代码版本310中获取第一调试信息312 (如 箭头A1所示),并且从第二源代码版本320中获取第二调试信息322 (如箭头A2所示)。继 而,通过如箭头B所示的比较/标识步骤,可W快速找到第一源代码版本310和第二源代码 版本320之间是否存在相匹配的函数,进而标识语义区别330。应当注意,在本发明的各个 实施方式中,编程人员还可W结合现有的各种调试工具,针对所标识出的语义区别330执 行进一步的处理。
[0041] 在下文中将参见附图来描述本发明的更多细节。具体地,图4示意性示出了根据 本发明一个实施方式的用于标识源代码版本之间的语义区别的方法的流程图400。在步骤 S402中,分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息。当 编译器编译源代码之后,在编译所得的文件中即包括调试信息。因而,可W分别编译第一源 代码版本和第二源代码版本,并从编译所得的相应文件中分别获得第一调试信息和第二调 试信息。备选地,由于此时的第一源代码版本和第二源代码版本是回归测试中的两个版本, 因而可W直接从用于回归测试的可执行程序中获取第一调试信息和第二调试信息。
[0042] 继而,在步骤S404中,通过比较第一调试信息与第二调试信息,确定在第二源代 码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数。由于调试信息中的 改变可W准确地反映源代码版本之间的语义区别,因而可W通过寻找两组调试信息之间的 变化,进而标识两个源代码版本之间的语义区别。
[0043] 应当注意,当调试信息出现变化后,与调试信息中出现变化的部分相对应的源代 码片段的内容被改变,并且送种改变是可W影响程序运行结果的语义上的改变,而并非仅 仅是文本上的改变。相对于现有技术中基于针对两个源代码版本进行文本比较的传统方 法,本发明提出了一种基于比较调试信息来标识源代码之间的语义区别的技术方案。采用 本发明的技术方案,可W快速准确地找到不同源代码版本之间的语义区别。
[0044] 在本发明的一个实施方式中,相匹配函数的函数原型部分是相同的,而函数体中 的代码行可W有所不同。根据本发明的技术方案,首先需要确定第一源代码版本和第二源 代码版本之间的对应关系。
[0045] 在步骤S406中,基于确定的结果标识语义区别。简单而言,当第一源代码版本中 存在第一函数,而第二源代码版本中并不存在与第一函数相匹配的第二函数时,则可W将 该第一函数标识为语义区别;而当第二版本中存在相匹配的第二函数时,可W继续比较第 一函数和第二函数的细节,W便准确地标识语义区别。
[0046] 在本发明的一个实施方式中,基于确定的结果标识语义区别包括;响应于确定不 存在第二函数,将第一函数标识为语义区别。
[0047] 具体地,例如当第一源代码版本是旧的版本而第二源代码版本是新的版本时,女口 果第一源代码版本中存在第一函数而第二源代码版本中不存在相匹配的第二函数,可W认 为在新的版本中已经删除了第一函数(或者对第一函数进行了大幅度修改)。此时该第一 函数属于语义区别,进一步开发人员可W在第一函数中查找错误。
[0048] 又例如,当第二源代码版本是旧的版本而第一源代码版本是新的版本时,如果第 一源代码版本中存在第一函数而第二源代码版本中不存在相匹配的第二函数,可W认为在 新的版本中增加了第一函数(或者对第二源代码版本中的某个函数进行了大幅度修改)。 此时该第一函数属于语义区别,进一步开发人员可W在第一函数中查找错误。
[0049] 通常而言,开发人员在基于旧源代码版本来开发新源代码版本时,一般不会修改 旧源代码版本中的函数名称。因而,为简单起见,可W首先在第二源代码版本中搜索是否存 在于第一函数名称相同的函数。当存在时,可W进一步确定找到的函数是否匹配于第一函 数;当不存在时,可W进一步基于其他方法(例如通过比较函数的原型(prototype))来查 找在第二源代码版本中是否存在与第一函数相匹配的第二函数。
[0050] 在本发明的一个实施方式中,通过比较第一调试信息与第二调试信息,确定在第 二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数包括;分别从 第一调试信息提取第一函数的第一原型,W及从第二调试信息提取函数的原型;W及响应 于函数的原型不匹配于第一原型,确定不存在第二函数;否则确定存在第二函数。
[0051] 应当注意,由于开发人员可能会修改函数的返回类型、函数的形式参数W及函数 体中的代码行,因而即使第一源代码版本和第二源代码版本中的两个函数的名称完全相 同,送两个函数也不一定是相匹配的函数。因而在本发明的上下文中进一步基于比较函数 的原型,来判断两个函数是否是相匹配的函数。
[0052] 具体而言,函数原型可W涉及如下Η个元素:函数的返回类型(returntype)、函 数名、W及形式参数(formalparameter)列表。形式参数列表包括形式参数类型,但是不 必包括形式参数的名称。函数原型描述了函数的接口(interhce),因而可W基于函数原型 是否匹配来确定两个函数是否相匹配。在下文中的表1-表4中示意性示出了 4个函数,现 在将参见表1-表4来介绍如何确定函数的原型之间是否匹配。
[0053]
[0057] 具体地,对于如上文表1所示的函数subl,函数原型可W是"intsubl(int)"。应 当注意,由于开发人员可能会修改函数名,因而在本发明的上下文中所述的函数原型的匹 配,需要在返回类型和形式参数列表两方面相匹配,而并不严格要求函数名完全一致。具体 地,尽管表2所示的函数的原型为int化ncl(int),即,函数1和函数2的名称不同(分别 是subl和化ncl),然而两个函数的返回类型均为int型,并且两个函数的形式参数列表均 包括
当前第2页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1