CN105446723A - 用于标识源代码版本之间的语义区别的方法和装置 - Google Patents

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

Info

Publication number
CN105446723A
CN105446723A CN201410444102.2A CN201410444102A CN105446723A CN 105446723 A CN105446723 A CN 105446723A CN 201410444102 A CN201410444102 A CN 201410444102A CN 105446723 A CN105446723 A CN 105446723A
Authority
CN
China
Prior art keywords
function
debugging message
source code
response
instruction sequence
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201410444102.2A
Other languages
English (en)
Other versions
CN105446723B (zh
Inventor
林科文
纪金松
张青山
张玉珩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to CN201410444102.2A priority Critical patent/CN105446723B/zh
Priority to US14/838,445 priority patent/US9594553B2/en
Publication of CN105446723A publication Critical patent/CN105446723A/zh
Application granted granted Critical
Publication of CN105446723B publication Critical patent/CN105446723B/zh
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/71Version control; Configuration management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及用于标识源代码版本之间的语义区别的方法和装置。在本发明的一个实施方式中,提供了一种用于标识源代码版本之间的语义区别的方法,包括:分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息;通过比较所述第一调试信息与所述第二调试信息,确定在所述第二源代码版本中是否存在与所述第一源代码版本中的第一函数相匹配的第二函数;以及基于所述确定的结果标识所述语义区别。在本发明的一个实施方式中,提供了一种用于标识源代码版本之间的语义区别的装置。采用本发明,可以快速并且准确地标识各个源代码版本之间的语义区别。

Description

用于标识源代码版本之间的语义区别的方法和装置
技术领域
本发明的各实施方式涉及软件开发,更具体地,涉及在软件开发期间用于标识源代码版本之间的语义区别(semanticdifference)的方法和装置。
背景技术
随着用户需求的增加,计算机软件的功能也日益复杂。在软件开发周期中,需要频繁地对各个开发阶段中的不同的源代码版本进行测试。回归测试(regressiontesting)指修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码出现错误。作为软件开发的一个重要组成部分,回归测试在整个软件开发过程中占有很大的工作量比重。通常而言,开发人员逐步完成软件设计中的各项功能,并且基于回归测试来确保源代码的正确。
例如,开发人员编写了第一源代码版本,经过测试后发现该第一源代码版本可以实现预期的设计。继而,开发人员可以在该第一源代码版本的基础上继续开发其他功能并完成第二源代码版本。在后续的开发第二版本源代码过程期间将会添加新的代码,并且还可能会修改第一源代码版本中的已经通过测试的已有代码。
在针对第二源代码版本进行测试时,可能会发现第二源代码版本中引入了在第一源代码版本中不存在的新问题。例如,第一源代码版本可以通过某些测试用例(testcase)的测试,然而,第二源代码版本不能通过这些测试用例的测试。此时则需要比较第一源代码版本和第二源代码版本之间的区别,以便发现并排除在开发第二源代码版本期间引入的错误。
然而,开发过程可能会涉及到复杂的过程,例如,开发人员可能会加入新的代码行、删除现有代码行、修改现有代码行等,这些修改可能会在两个源代码版本之间引入语义区别(即,可能会导致运行结果的不同)。另外,开发人员还有可能会调整代码行/函数在源代码中的顺序(例如,交换两个代码行/函数的位置)、替换变量(variable)名/函数名等。尽管从文本角度看来,上述这些修改将会在两个源代码版本之间引入文本区别,然而对于编程语言的编译和执行而言,这些文本区别并不会对运行结果产生影响,因而在查找新引入的错误时,可以仅关注于语义区别而忽略文本区别。
目前已经提出了在回归测试中用于辅助查找各个源代码版本之间的区别的技术方案,然而这些技术方案主要基于分析各个版本之间的文本区别来实现。这些技术方案会将原本不会对程序的运行结果产生任何影响的文本修改标识为区别,造成开发人员不得不在所标识的大量区别中人工地寻找真正对运行结果产生影响的语义区别。
因而,如何快速并且准确地标识出各个源代码版本之间的语义区别,成为目前的一个研究热点。
发明内容
因而,期望开发一种能够标识不同源代码版本之间的语义区别的技术方案。期望该技术方案可以忽略不同源代码版本之间的文本区别,而仅标识各个版本之间的语义区别,以便于开发人员可以快速定位开发期间被修改的导致程序产生不同运行结果的内容,进而找到可能引起错误的代码行。
在本发明的一个实施方式中,提供了一种用于标识源代码版本之间的语义区别的方法,包括:分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息;通过比较第一调试信息与第二调试信息,确定在第二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数;以及基于确定的结果标识语义区别。
在本发明的一个实施方式中,提供了一种用于标识源代码版本之间的语义区别的装置,包括:获取模块,配置用于分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息;确定模块,配置用于通过比较第一调试信息与第二调试信息,确定在第二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数;以及标识模块,配置用于基于确定的结果标识语义区别。
采用本发明所述的方法和装置,可以在尽量不改变现有软件开发流程的情况下,快速并且准确地标识各个源代码版本之间的语义区别。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其他目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图;
图2示意性示出了根据一个技术方案的用于标识源代码版本之间的区别的框图;
图3示意性示出了根据本发明一个实施方式的用于标识源代码版本之间的语义区别的技术方案的框图;
图4示意性示出了根据本发明一个实施方式的用于标识源代码版本之间的语义区别的方法的流程图;
图5示意性示出了根据本发明一个实施方式的通过比较调试信息而标识源代码版本之间的语义区别的方法的流程图;
图6示意性示出了根据本发明一个实施方式的标识语义区别的框图;以及
图7示意性示出了根据本发明一个实施方式的用于标识源代码版本之间的语义区别的装置的框图。
具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
图1示出了适于用来实现本发明实施方式的示例性计算机系统/服务器12的框图。图1显示的计算机系统/服务器12仅仅是一个示例,不应对本发明实施方式的功能和使用范围带来任何限制。
如图1所示,计算机系统/服务器12以通用计算设备的形式表现。计算机系统/服务器12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
计算机系统/服务器12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机系统/服务器12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
系统存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30和/或高速缓存存储器32。计算机系统/服务器12可以进一步包括其他可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图1未显示,通常称为“硬盘驱动器”)。尽管图1中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其他光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明各实施方式的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括——但不限于——操作系统、一个或者多个应用程序、其他程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本发明所描述的实施方式中的功能和/或方法。
计算机系统/服务器12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其他计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,计算机系统/服务器12还可以通过网络适配器20与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机系统/服务器12的其他模块通信。应当明白,尽管图中未示出,可以结合计算机系统/服务器12使用其他硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
图2示意性示出了根据一个技术方案的用于标识源代码版本之间的区别的框图200。如图2所示,第一版本210包括主函数main和两个函数sub1和sub2,第二版本220包括主函数main和两个函数func1和func2。应当注意,根据如图2所示的基于文本变化来标识各个源代码版本之间的区别的技术方案,第一版本210和第二版本220之间存在大量区别。
假设第二版本220是在第一版本210基础上开发的最新源代码版本,针对第一版本210的修改包括:1)将函数sub1重命名为func1,并将函数sub1中的变量p1、s1、s2分别重命名为inputInteger、tmpInteger1和tmpInteger2;2)将函数sub2重命名为func2,并且将函数sub2中的变量p2重命名为inputInteger;以及3)在函数main中添加新代码行printf(“a+b=%d\n”,a+b)。根据现有的技术方案,上述第1-3点涉及的修改均为第一版本210和第二版本220之间的区别。
本领域技术人员应当理解,尽管对多个函数和变量进行了重命名,然而,重命名操作并不会影响源代码的运行结果,因而这些重命名仅仅属于文本内容的修改,并不导致源代码语义上的变化。按照如图2所示的基于文本内容标识区别的技术方案,区别230可以包括:1)删除函数sub1;2)删除函数sub2;3)增加函数func1;4)增加函数func2;以及5)在函数main中增加代码行printf(“a+b=%d\n”,a+b)。
此外,第一版本和第二版本的区别还可以包括函数位置更改后对应行号的变化。尽管此类区别不会影响源代码的语义,但在常见的文本比较工具中仍会显示出来,这大大增加了开发人员的工作量。
由于文本区别并不会影响程序运行结果,在回归测试中开发人员不必关心文本区别,而是仅仅关心语义区别。本领域技术人员可以理解,在图2中所标识的区别1-5中,仅有第5点增加代码行属于影响程序运行结果的语义区别,而其他1-4点区别仅属于文本区别。现有技术方案的缺陷在于,当使用例如图2所示的技术方案时,语义区别仅仅占所标识区别的极少比例(20%)。因而开发人员需要从大量无关的文本区别中搜索的语义区别。
应当注意,随着用户需求的复杂化,源代码的工程中通常会包括数百甚至更多的文件。在图2中仅仅示意性示出了工程中包括一个文件的情况,本领域技术人员应当理解,当源代码涉及多个文件时,开发人员可能会进行更多类型的文本修改:例如,增加或者删除文件,将函数从一个文件移至另一文件,等等。因而,按照如图2所示的技术方案所标识出的区别中将会包含更多的文本区别,这将使得开发人员更加难以找到的错误代码行。
针对上述技术方案中的不足,本发明提供了一种用于标识源代码版本之间的语义区别的方法,包括:分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息;通过比较第一调试信息与第二调试信息,确定在第二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数;以及基于确定的结果标识语义区别。
本领域技术人员应当注意,在本发明的上下文中,“第一源代码版本”和“第二源代码版本”并不表示时间顺序,而是“第一”和“第二”旨在对回归测试中涉及的两个源代码版本进行区分。例如,第一源代码版本可以指回归测试中的已经经过上一轮测试的旧的源代码版本,而第二源代码版本可以指正在经历当前轮次测试的新的源代码版本;或者,第二源代码版本可以指旧的源代码版本,而第一源代码版本可以指新的源代码版本。
具体地,图3示意性示出了根据本发明一个实施方式的用于标识源代码版本之间的区别的技术方案的框图300。如图3所示,第一源代码版本310和第二源代码版本320是回归测试中涉及的两个版本。在本发明的实施方式中,借助于比较各个版本的调试信息来标识各个版本之间的语义区别。
在编译时,编译器从源代码中收集大量信息,例如变量名、变量类型、函数所在行号、代码序列所对应行号、函数名、函数的返回类型、函数的形式参数、函数的地址范围等信息,然后按照预定的格式将这些信息写入到编译后的文件中。在本发明的上下文中,这些信息统称为调试信息。
调试信息具有多种格式,例如,stabs、COFF、PE-COFF和DWARF等。应当注意,在本发明的各个实施方式中,可以基于现有技术中已知的或者将在未来开发的各种技术,来从源代码中获取调试信息。在本发明的上下文中,将仅以DWARF为具体示例描述调试信息。DWARF是一种广泛使用的调试信息,其全称为DebuggingWithAttributedRecordFormats。DWARF记录了可执行程序的存储器地址以及与这些存储器地址相对应的源代码之间的映射关系。关于DWARF的更多细节,本领域技术人员可以参见http://dwarfstd.org/和http://en.wikipedia.org/wiki/DWARF以获取更多信息,本发明的上下文中将不再赘述。
通过比较来自两个源代码版本的调试信息中的两个对应片段(fragment),可以确定与这些对应片段具有映射关系的源代码片段之间是否一致。由于两个源代码版本之间的文本区别并不会导致调试信息中出现显著区别,因而通过比较调试信息可以方便并且快速地找到两个源代码版本之间的语义区别,同时忽略文本区别。
采用本发明的技术方案,可以从第一源代码版本310中获取第一调试信息312(如箭头A1所示),并且从第二源代码版本320中获取第二调试信息322(如箭头A2所示)。继而,通过如箭头B所示的比较/标识步骤,可以快速找到第一源代码版本310和第二源代码版本320之间是否存在相匹配的函数,进而标识语义区别330。应当注意,在本发明的各个实施方式中,编程人员还可以结合现有的各种调试工具,针对所标识出的语义区别330执行进一步的处理。
在下文中将参见附图来描述本发明的更多细节。具体地,图4示意性示出了根据本发明一个实施方式的用于标识源代码版本之间的语义区别的方法的流程图400。在步骤S402中,分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息。当编译器编译源代码之后,在编译所得的文件中即包括调试信息。因而,可以分别编译第一源代码版本和第二源代码版本,并从编译所得的相应文件中分别获得第一调试信息和第二调试信息。备选地,由于此时的第一源代码版本和第二源代码版本是回归测试中的两个版本,因而可以直接从用于回归测试的可执行程序中获取第一调试信息和第二调试信息。
继而,在步骤S404中,通过比较第一调试信息与第二调试信息,确定在第二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数。由于调试信息中的改变可以准确地反映源代码版本之间的语义区别,因而可以通过寻找两组调试信息之间的变化,进而标识两个源代码版本之间的语义区别。
应当注意,当调试信息出现变化后,与调试信息中出现变化的部分相对应的源代码片段的内容被改变,并且这种改变是可以影响程序运行结果的语义上的改变,而并非仅仅是文本上的改变。相对于现有技术中基于针对两个源代码版本进行文本比较的传统方法,本发明提出了一种基于比较调试信息来标识源代码之间的语义区别的技术方案。采用本发明的技术方案,可以快速准确地找到不同源代码版本之间的语义区别。
在本发明的一个实施方式中,相匹配函数的函数原型部分是相同的,而函数体中的代码行可以有所不同。根据本发明的技术方案,首先需要确定第一源代码版本和第二源代码版本之间的对应关系。
在步骤S406中,基于确定的结果标识语义区别。简单而言,当第一源代码版本中存在第一函数,而第二源代码版本中并不存在与第一函数相匹配的第二函数时,则可以将该第一函数标识为语义区别;而当第二版本中存在相匹配的第二函数时,可以继续比较第一函数和第二函数的细节,以便准确地标识语义区别。
在本发明的一个实施方式中,基于确定的结果标识语义区别包括:响应于确定不存在第二函数,将第一函数标识为语义区别。
具体地,例如当第一源代码版本是旧的版本而第二源代码版本是新的版本时,如果第一源代码版本中存在第一函数而第二源代码版本中不存在相匹配的第二函数,可以认为在新的版本中已经删除了第一函数(或者对第一函数进行了大幅度修改)。此时该第一函数属于语义区别,进一步开发人员可以在第一函数中查找错误。
又例如,当第二源代码版本是旧的版本而第一源代码版本是新的版本时,如果第一源代码版本中存在第一函数而第二源代码版本中不存在相匹配的第二函数,可以认为在新的版本中增加了第一函数(或者对第二源代码版本中的某个函数进行了大幅度修改)。此时该第一函数属于语义区别,进一步开发人员可以在第一函数中查找错误。
通常而言,开发人员在基于旧源代码版本来开发新源代码版本时,一般不会修改旧源代码版本中的函数名称。因而,为简单起见,可以首先在第二源代码版本中搜索是否存在于第一函数名称相同的函数。当存在时,可以进一步确定找到的函数是否匹配于第一函数;当不存在时,可以进一步基于其他方法(例如通过比较函数的原型(prototype))来查找在第二源代码版本中是否存在与第一函数相匹配的第二函数。
在本发明的一个实施方式中,通过比较第一调试信息与第二调试信息,确定在第二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数包括:分别从第一调试信息提取第一函数的第一原型,以及从第二调试信息提取函数的原型;以及响应于函数的原型不匹配于第一原型,确定不存在第二函数;否则确定存在第二函数。
应当注意,由于开发人员可能会修改函数的返回类型、函数的形式参数以及函数体中的代码行,因而即使第一源代码版本和第二源代码版本中的两个函数的名称完全相同,这两个函数也不一定是相匹配的函数。因而在本发明的上下文中进一步基于比较函数的原型,来判断两个函数是否是相匹配的函数。
具体而言,函数原型可以涉及如下三个元素:函数的返回类型(returntype)、函数名、以及形式参数(formalparameter)列表。形式参数列表包括形式参数类型,但是不必包括形式参数的名称。函数原型描述了函数的接口(interface),因而可以基于函数原型是否匹配来确定两个函数是否相匹配。在下文中的表1-表4中示意性示出了4个函数,现在将参见表1-表4来介绍如何确定函数的原型之间是否匹配。
具体地,对于如上文表1所示的函数sub1,函数原型可以是“intsub1(int)”。应当注意,由于开发人员可能会修改函数名,因而在本发明的上下文中所述的函数原型的匹配,需要在返回类型和形式参数列表两方面相匹配,而并不严格要求函数名完全一致。具体地,尽管表2所示的函数的原型为intfunc1(int),即,函数1和函数2的名称不同(分别是sub1和func1),然而两个函数的返回类型均为int型,并且两个函数的形式参数列表均包括一个int类型的参数,因而函数1和函数2的原型是匹配的。
又例如,比较表1所示的函数1和表3所示的函数3,尽管两者的返回类型和函数名均相同,然而由于函数1的形式参数列表包括一个int类型的参数,而函数2的形式参数列表包括两个int类型的参数,此时函数1和函数3的原型是不匹配的。应当注意,由于函数原型中的形式参数列表仅仅考虑形式参数的数量和类型,并不考虑形式参数的名称以及函数内的具体实现,因而表1所示的函数1和表4所示的函数4的函数原型是相匹配的。
本领域技术人员应当理解,函数原型可以标识函数的最重要的信息,当存在多个相匹配的函数原型时,可以通过进一步比较两个函数的变量信息、行号信息或者指令序列等信息,来进一步确定两个函数之间是否存在语义区别。以此方式,可以更准确地找到相匹配的第二函数,在下文中将进一步详细描述。
在本发明的一个实施方式中,响应于第一原型不匹配于原型,确定不存在第二函数包括:响应于函数的原型的哈希值不匹配于第一原型的第一哈希值,确定不存在第二函数。
随着用户需求的增长,源代码的复杂程度可能会越来越高,函数的原型也将变得更加复杂。此时为了降低比较过程中的计算量并且提高比较效率,还可以分别计算第一函数的第一原型的第一哈希值,并计算函数的原型的哈希值。由于哈希算法可以确保将第一哈希值和哈希值分别映射至唯一的数值,因而在比较时可以仅通过比较第一哈希值和哈希值,即可确定第一原型和原型是否相匹配,进而确定在第二源代码版本中是否存在于第一函数相匹配的第二函数。
当确定第二源代码版本中存在第二函数时,还需要进一步比较第一调试信息中与第一函数相关的部分以及第二调试信息中与第二函数相关联的部分,以便以更加精细的粒度确定第一函数和第二函数之间是否存在语义区别。具体地,可以比较以下至少一个方面的内容:编程计数器信息、行号信息、变量信息以及指令序列。
在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括:响应于确定存在第二函数,分别从第一调试信息中提取第一函数的第一编程计数器范围(programcounterscope),以及从第二调试信息中提取第二函数的第二编程计数器范围;以及响应于第一编程计数器范围不匹配于第二编程计数器范围,将第一函数标识为语义区别。
编程计数器范围描述了与函数相关联的指令序列的地址范围(即,将该函数编译所得的指令序列的起始地址和终止地址之间的范围)。通常而言,对函数执行语义上的修改将造成编程计数器范围的变化,因而当发现编程计数器范围发生变化时,有理由怀疑相关的函数也出现了语义上的变化,因而可以基于编程计数器范围的变化来标识语义区别。
当发现两个函数的编程计数器范围不同时,可以确定两个函数之间存在语义区别。应当注意,当两个函数的编程计数器范围相同的情况下,两个函数之间也可能存在语义区别,因而判断编程计数器范围之间是否匹配并非判断是否存在语义区别的唯一标准,而是还可以结合判断两个函数的其他方面是否匹配来进行判断。
在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括:响应于确定存在第二函数,分别从第一调试信息中提取第一函数的第一行的指令序列,以及从第二调试信息中提取第二函数的第二行的指令序列;以及响应于第一行的指令序列不匹配于第二行的指令序列,将造成第一行的指令序列和第二行的指令序列之间的不匹配的代码行标识为语义区别。应当注意,在此的“第一”和“第二”旨在对不同函数中的代码行进行区分,并不表示代码行在函数中的顺序。
在调试信息中记载了函数中的每个代码行的行号以及相对应的指令序列,因而可以通过将第一函数中的各个代码行的指令序列与第二函数中的各个代码行的指令序列进行比较,以判断两个函数之间是否存在语义区别(例如,增加或者删除代码行)。具体地,下文表5-表7示意性示出了函数的定义。
应当注意,上文表5所示的函数5和表6所示的函数6是相匹配的函数,因而需要进一步比较两个函数中的行号信息。通过比较发现,函数5的行号为(2->3->4),而函数6的行号为(2->3->5),此时可以比较与各个代码行相对应的指令序列:在行号2处,函数5的指令序列和函数6的指令序列相匹配;在行号3处,函数5的指令序列和函数6的指令序列相匹配;函数5在行号4处的指令序列与函数6在行号5处的指令序列相匹配。此时,尽管两个函数的行号不完全相同,然而指令序列是匹配的,因而认为函数5和函数6之间不存在语义区别。。
应当注意,尽管在上文中仅仅示意性示出了在函数6中添加空行的情况,开发人员还有可能将旧版本中的多个代码行合并为一行。本领域技术人员可以基于本文所述的原理来设计具体实现细节,在此不再赘述。
又例如,表5所示的函数5与表7所示的函数7的函数原型相同,因而函数5与函数7是相匹配的函数。当比较函数5和函数7时可以发现,函数5的行号为(2->3->4),而函数7的行号为(2->3->4->5)。可以比较与各个行号相关联的指令序列:在行号2处,函数5的指令序列与函数7的指令序列相匹配;在行号3处,两个指令序列也匹配;在行号4处,两个指令序列不匹配;而函数5在行号4处的指令序列与函数7在行号5处的指令序列相匹配。因而,可以确定第4行(即,“s2=s2+1;”)为语义区别。
在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括:响应于确定存在第二函数,分别从第一调试信息中提取第一函数的第一变量信息,以及从第二调试信息中提取第二函数的第二变量信息;响应于第一变量信息不匹配于第二变量信息,确定第一调试信息中与第一变量信息相关联的第一指令是否匹配于第二调试信息中与第二变量信息相关联的第二指令;以及响应于第一指令不匹配于第二指令,将造成第一变量信息和第二变量信息之间的不匹配的变量标识为语义区别。
出于增加源代码的可读性等原因,编程人员可能会替换函数的名称,或者替换函数中的部分或者全部变量的名称。例如,在上文表1所示的函数1和表4所示的函数4中,函数1中的函数名称sub1被替换为函数4中的func1,并且函数1中的变量s1和s2分别被替换为函数4中的tmpInteger1和tmpInteger2。
应当注意,尽管函数名称和变量名称的替换导致了函数1和函数4从文本角度而言完全不一致,然而从函数的语义方面而言,两个函数之间并不存在语义区别。因而,在标识语义区别时还需要防止由于名称替换导致的干扰。
具体地,需要分别从第一调试信息和第二调试信息中提取第一变量信息和第二变量信息,并且当发现第一变量信息和第二变量信息不能匹配(例如,发现第一变量信息包括s1和s2,而第二变量信息包括tmpInteger1和tmpInteger2),此时可以进一步在第一调试信息中确定与s1相关联的第一指令,并且在第二调试信息中确定与tmpInteger1相关联的第二指令。如果第一指令匹配于第二指令,则可以认为变量名s1和tmpInteger1之间仅仅是简单的名称替换的关系,否则可以造成第一变量信息和第二变量信息之间的不匹配的变量(例如,函数1中的s1和函数4中的tmpInteger1)标识为语义区别。类似地,本领域技术人员还可以分别从第一调试信息和第二调试信息中提取与变量s2和tmpInteger2相关联的指令,并将其进行比较。
在本发明的一个实施方式中,基于确定的结果标识语义区别进一步包括:响应于确定存在第二函数:分别从第一调试信息提取第一函数的第一指令序列,以及从第二调试信息提取第二函数的第二指令序列;以及响应于第一指令序列匹配于第二指令序列,确定第一函数与第二函数之间不存在语义区别。
为了以更精细的粒度确定两个函数之间是否存在语义区别,还可以分别从第一调试信息中提取编译第一函数所得的第一指令序列,并从第二调试信息中提取编译第二函数所得的第二指令序列。由于第一指令序列和第二指令序列分别详细记录了第一函数和第二函数的语义特征,因而将第一指令序列和第二指令序列进行比较,可以准确地确定两个函数之间是否存在语义区别。当两个指令序列相匹配时,可以确定两个函数之间不存在语义区别。
在上文中结合具体示例描述了本发明的各个实施方式的步骤,现在将结合图5示出本发明的方法的操作流程,以便本领域技术人员可以更明确地理解上述步骤之间的执行顺序。图5示意性示出了根据本发明一个实施方式的通过比较调试信息而标识源代码版本之间的语义区别的方法的流程图500。
首先,在步骤S502中,判断在在第二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数,如果不存在则表示该第一函数仅在第一源代码版本中出现,进而操作流程前进至步骤S508,并将第一函数标识为语义区别。当判断结果为“是”时,操作流程前进至步骤S504,此时需要进一步基于在多个方面中比较第一调试信息和第二调试信息,进而确定第一函数和第二函数之间是否存在语义区别。具体地,可以在如下方面中的至少一个中比较第一函数和第二函数:编程计数器范围、行号信息、变量信息以及指令序列。
在步骤S506中,可以确定比较结果是否满足与不同方面相关的预定条件(例如,当比较两个函数的编程计数器范围时,需要确定两个函数的编程计数器范围是否相同),当不满足预定条件时,操作流程前进至步骤S508,以便将第一函数中相应的片段标识为语义区别。当满足预定条件时,操作流程可以返回至步骤S504,以便在下一方面中进行比较。
应当注意,在本发明的各个实施方式中可以首先比较两个函数的指令序列是否匹配,如果比较结果为“是”则确定两个函数之间不存在语义区别;如果比较结果为“否”,则可以逐一在多个方面(例如,编程计数器信息、行号信息、变量信息)中进行比较,以便从多个方面标识语义区别。
应当注意,本领域技术人员可以根据具体应用环境的要求,从上述多个方面中选择一个或者多个方面进行比较。例如,当发现两个函数的编程计数器范围不匹配时,还可以比较两个函数的行号信息,以便确定是否执行了增加或者删除代码行的修改。又例如,当发现两个函数的指令序列完全匹配时,可以确定两个函数之间不存在语义区别。
图6示意性示出了根据本发明一个实施方式的标识语义区别的框图600。采用上文所述的方法,可以发现如下修改:第一版本610中的函数sub1匹配于第二版本620中的函数func1(如箭头C1所示),第一版本610中的函数sub2匹配于第二版本620中的函数func2(如箭头C3所示),第一版本610中的函数main匹配于第二版本620中的函数main(如箭头C2所示),并且第一版本610中的某些变量名称被替换为第二版本620中的某些变量名称(例如,s1被替换为tmpInteger1,s2被替换为tmpInteger2,等等)。
采用本发明的各个实施方式的方法,上述这些修改仅仅属于文本上的修改,而并不改变源代码的语义。第一版本610和第二版本620之间的语义区别仅在于:在第二版本620中第27行中插入了新的代码行“printf(“a+b=%d\n”,a+b)”(如语义区别630所示)。
本领域技术人员可以理解,相对于现有的基于文本来标识两个源代码版本之间的区别的方法,采用本发明的技术方案可以标识出可能对编程结果造成影响的语义区别。
具体地,通过在第一版本610和第二版本620之间搜索相匹配的函数,可以忽略移动函数的位置造成的文本区别;通过比较相匹配的函数的变量信息,可以忽略变量名替换造成的文本区别;通过比较相匹配的函数的行号信息,可以确定在第二版本620的第27行插入了新的代码行。以此方式,可以快速并且准确地找到两个源代码版本之间的语义区别,进而大大降低了开发人员从大量无关文本区别中搜索语义区别的工作量。
在本发明的一个实施方式中,分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息包括:从编译第一源代码所得的第一目标文件和第一可执行文件中的任一项获取第一调试信息;以及从编译第二源代码所得的第二目标文件和第二可执行版本中的任一项获取第二调试信息。应当注意,由于调试信息是通过编译操作来获得的,因而可以从编译所得的目标文件或者可执行文件中获取调试信息。
前面已经参考附图描述了实现本发明的方法的各个实施方式。本领域技术人员可以理解的是,上述方法既可以以软件方式实现,也可以以硬件方式实现,或者通过软件与硬件相结合的方式实现。并且,本领域技术人员可以理解,通过以软件、硬件或者软硬件相结合的方式实现上述方法中的各个步骤,可以提供一种基于相同发明构思的一种设备。即使该设备在硬件结构上与通用处理设备相同,由于其中所包含的软件的作用,使得该设备表现出区别于通用处理设备的特性,从而形成本发明的各个实施方式的设备。本发明中所述设备包括若干装置或模块,所述装置或模块被配置为执行相应步骤。本领域的所述技术人员通过阅读本说明书可以理解如何编写程序实现所述装置或模块执行的动作。由于所述设备与方法基于相同的发明构思,因此其中相同或相应的实现细节同样适用于与上述方法对应的装置或模块,由于其在上文中已经进行了详细和完整的描述,因此在下文中可能不再进行赘述。
图7示意性示出了根据本发明一个实施方式的用于标识源代码版本之间的区别的装置的框图700。具体地,示出了一种用于标识源代码版本之间的语义区别的装置,包括:获取模块710,配置用于分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息;确定模块720,配置用于通过比较第一调试信息与第二调试信息,确定在第二源代码版本中是否存在与第一源代码版本中的第一函数相匹配的第二函数;以及标识模块730,配置用于基于确定的结果标识语义区别。
在本发明的一个实施方式中,标识模块730包括:第一标识模块,配置用于响应于确定不存在第二函数,将第一函数标识为语义区别。
在本发明的一个实施方式中,确定模块720包括:原型提取模块,配置用于分别从第一调试信息提取第一函数的第一原型,以及从第二调试信息提取函数的原型;以及函数确定模块,配置用于响应于函数的原型不匹配于第一原型,确定不存在第二函数;否则确定存在第二函数。
在本发明的一个实施方式中,函数确定模块包括:哈希模块,配置用于响应于函数的原型的哈希值不匹配于第一原型的第一哈希值。
在本发明的一个实施方式中,标识模块730包括:范围提取模块,配置用于响应于确定存在第二函数,分别从第一调试信息中提取第一函数的第一编程计数器范围,以及从第二调试信息中提取第二函数的第二编程计数器范围;以及第二标识模块,配置用于响应于第一编程计数器范围不匹配于第二编程计数器范围,将第一函数标识为语义区别。
在本发明的一个实施方式中,标识模块进一步包括:行号信息提取模块,配置用于分别从第一调试信息中提取第一函数的第一行的指令序列,以及从第二调试信息中提取第二函数的第二行的指令序列;以及第三标识模块,配置用于响应于第一行的指令序列不匹配于第二行的指令序列,将造成第一行的指令序列和第二行的指令序列之间的不匹配的代码行标识为语义区别。
在本发明的一个实施方式中,标识模块进一步包括:变量信息提取模块,配置用于响应于确定存在第二函数,分别从第一调试信息中提取第一函数的第一变量信息,以及从第二调试信息中提取第二函数的第二变量信息;指令比较模块,配置用于响应于第一变量信息不匹配于第二变量信息,确定第一调试信息中与第一变量信息相关联的第一指令是否匹配于第二调试信息中与第二变量信息相关联的第二指令;以及第四标识模块,配置用于响应于第一指令不匹配于第二指令,将造成第一变量信息和第二变量信息之间的不匹配的变量标识为语义区别。
在本发明的一个实施方式中,标识模块进一步包括:指令序列提取模块,配置用于响应于确定存在第二函数:分别从第一调试信息提取第一函数的第一指令序列,以及从第二调试信息提取第二函数的第二指令序列;以及第五标识模块,配置用于响应于第一指令序列匹配于第二指令序列,确定第一函数与第二函数之间不存在语义区别。
在本发明的一个实施方式中,获取模块710包括:第一获取模块,配置用于从编译第一源代码所得的第一目标文件和第一可执行文件中的任一项获取第一调试信息;以及第二获取模块,配置用于从编译第二源代码所得的第二目标文件和第二可执行文件中的任一项获取第二调试信息。
采用本发明所述的方法和装置,可以在尽量不改变现有软件开发流程的情况下,快速并且准确地标识各个源代码版本之间的语义区别。
本发明可以是系统、方法和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于使处理器实现本发明的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘服务器。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本发明操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施方式中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本发明的各个方面。
这里参照根据本发明实施方式的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本发明的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,从而生产出一种机器,使得这些指令在通过计算机或其他可编程数据处理装置的处理器执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其他可编程数据处理装置、或其他设备上,使得在计算机、其他可编程数据处理装置或其他设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其他可编程数据处理装置、或其他设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本发明的多个实施方式的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施方式,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施方式。在不偏离所说明的各实施方式的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施方式的原理、实际应用或对市场中的技术的技术改进,或者使本技术领域的其他普通技术人员能理解本文披露的各实施方式。

Claims (18)

1.一种用于标识源代码版本之间的语义区别的方法,包括:
分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息;
通过比较所述第一调试信息与所述第二调试信息,确定在所述第二源代码版本中是否存在与所述第一源代码版本中的第一函数相匹配的第二函数;以及
基于所述确定的结果标识所述语义区别。
2.根据权利要求1所述的方法,其中所述基于所述确定的结果标识所述语义区别包括:
响应于确定不存在所述第二函数,将所述第一函数标识为所述语义区别。
3.根据权利要求2所述的方法,其中所述通过比较所述第一调试信息与所述第二调试信息,确定在所述第二源代码版本中是否存在与所述第一源代码版本中的第一函数相匹配的第二函数包括:
分别从所述第一调试信息提取所述第一函数的第一原型,以及从所述第二调试信息提取函数的原型;以及
响应于所述函数的原型不匹配于所述第一原型,确定不存在所述第二函数;否则确定存在所述第二函数。
4.根据权利要求3所述的方法,其中所述响应于所述函数的原型不匹配于所述第一原型,确定不存在所述第二函数包括:
响应于所述函数的原型的哈希值不匹配于所述第一原型的第一哈希值,确定不存在所述第二函数。
5.根据权利要求1-4中的任一项所述的方法,其中所述基于所述确定的结果标识所述语义区别进一步包括:响应于确定存在所述第二函数,
分别从所述第一调试信息中提取所述第一函数的第一编程计数器范围,以及从所述第二调试信息中提取所述第二函数的第二编程计数器范围;以及
响应于所述第一编程计数器范围不匹配于所述第二编程计数器范围,将所述第一函数标识为所述语义区别。
6.根据权利要求1-4中的任一项所述的方法,其中所述基于所述确定的结果标识所述语义区别进一步包括:响应于确定存在所述第二函数,
分别从所述第一调试信息中提取所述第一函数的第一行的指令序列,以及从所述第二调试信息中提取所述第二函数的第二行的指令序列;以及
响应于所述第一行的指令序列不匹配于所述第二行的指令序列,将造成所述第一行的指令序列和所述第二行的指令序列之间的不匹配的代码行标识为所述语义区别。
7.根据权利要求1-4中的任一项所述的方法,其中所述基于所述确定的结果标识所述语义区别进一步包括:响应于确定存在所述第二函数,
分别从所述第一调试信息中提取所述第一函数的第一变量信息,以及从所述第二调试信息中提取所述第二函数的第二变量信息;
响应于所述第一变量信息不匹配于所述第二变量信息,确定所述第一调试信息中与所述第一变量信息相关联的第一指令是否匹配于所述第二调试信息中与所述第二变量信息相关联的第二指令;以及
响应于所述第一指令不匹配于所述第二指令,将造成第一变量信息和所述第二变量信息之间的不匹配的变量标识为所述语义区别。
8.根据权利要求1-4中的任一项所述的方法,其中所述基于所述确定的结果标识所述语义区别进一步包括:响应于确定存在所述第二函数:
分别从所述第一调试信息获取所述第一函数的第一指令序列,以及从所述第二调试信息获取所述第二函数的第二指令序列;以及
响应于所述第一指令序列匹配于所述第二指令序列,确定所述第一函数与所述第二函数之间不存在语义区别。
9.根据权利要求1所述的方法,其中所述分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息包括:
从编译所述第一源代码所得的第一目标文件和第一可执行文件中的任一项获取所述第一调试信息;以及
从编译所述第二源代码所得的第二目标文件和第二可执行文件中的任一项获取所述第二调试信息。
10.一种用于标识源代码版本之间的语义区别的装置,包括:
获取模块,配置用于分别获取第一源代码版本的第一调试信息和第二源代码版本的第二调试信息;
确定模块,配置用于通过比较所述第一调试信息与所述第二调试信息,确定在所述第二源代码版本中是否存在与所述第一源代码版本中的第一函数相匹配的第二函数;以及
标识模块,配置用于基于所述确定的结果标识所述语义区别。
11.根据权利要求10所述的装置,其中所述标识模块包括:
第一标识模块,配置用于响应于确定不存在所述第二函数,将所述第一函数标识为所述语义区别。
12.根据权利要求11所述的装置,其中所述确定模块包括:
原型提取模块,配置用于分别从所述第一调试信息提取所述第一函数的第一原型,以及从所述第二调试信息提取函数的原型;以及
函数确定模块,配置用于响应于所述函数的原型不匹配于所述第一原型,确定不存在所述第二函数;否则确定存在所述第二函数。
13.根据权利要求12所述的装置,其中所述函数确定模块包括:
哈希模块,配置用于响应于所述函数的原型的哈希值不匹配于所述第一原型的第一哈希值,确定不存在所述第二函数。
14.根据权利要求10-13中的任一项所述的装置,其中所述标识模块包括:
范围提取模块,配置用于响应于确定存在所述第二函数,分别从所述第一调试信息中提取所述第一函数的第一编程计数器范围,以及从所述第二调试信息中提取所述第二函数的第二编程计数器范围;以及
第二标识模块,配置用于响应于所述第一编程计数器范围不匹配于所述第二编程计数器范围,将所述第一函数标识为所述语义区别。
15.根据权利要求10-13中的任一项所述的装置,其中所述标识模块进一步包括:
行号信息提取模块,配置用于分别从所述第一调试信息中提取所述第一函数的第一行的指令序列,以及从所述第二调试信息中提取所述第二函数的第二行的指令序列;以及
第三标识模块,配置用于响应于所述第一行的指令序列不匹配于所述第二行的指令序列,将造成所述第一行的指令序列和所述第二行的指令序列之间的不匹配的代码行标识为所述语义区别。
16.根据权利要求10-13中的任一项所述的装置,其中所述标识模块进一步包括:
变量信息提取模块,配置用于响应于确定存在所述第二函数,分别从所述第一调试信息中提取所述第一函数的第一变量信息,以及从所述第二调试信息中提取所述第二函数的第二变量信息;
指令比较模块,配置用于响应于所述第一变量信息不匹配于所述第二变量信息,确定所述第一调试信息中与所述第一变量信息相关联的第一指令是否匹配于所述第二调试信息中与所述第二变量信息相关联的第二指令;以及
第四标识模块,配置用于响应于所述第一指令不匹配于所述第二指令,将造成第一变量信息和所述第二变量信息之间的不匹配的变量标识为所述语义区别。
17.根据权利要求10-13中的任一项所述的装置,其中所述标识模块进一步包括:
指令序列提取模块,配置用于响应于确定存在所述第二函数:分别从所述第一调试信息提取所述第一函数的第一指令序列,以及从所述第二调试信息提取所述第二函数的第二指令序列;以及
第五标识模块,配置用于响应于所述第一指令序列匹配于所述第二指令序列,确定所述第一函数与所述第二函数之间不存在语义区别。
18.根据权利要求10所述的装置,其中所述获取模块包括:
第一获取模块,配置用于从编译所述第一源代码所得的第一目标文件和第一可执行文件中的任一项获取所述第一调试信息;以及
第二获取模块,配置用于从编译所述第二源代码所得的第二目标文件和第二可执行文件中的任一项获取所述第二调试信息。
CN201410444102.2A 2014-09-02 2014-09-02 用于标识源代码版本之间的语义区别的方法和装置 Expired - Fee Related CN105446723B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201410444102.2A CN105446723B (zh) 2014-09-02 2014-09-02 用于标识源代码版本之间的语义区别的方法和装置
US14/838,445 US9594553B2 (en) 2014-09-02 2015-08-28 Identifying semantic differences between source code versions

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201410444102.2A CN105446723B (zh) 2014-09-02 2014-09-02 用于标识源代码版本之间的语义区别的方法和装置

Publications (2)

Publication Number Publication Date
CN105446723A true CN105446723A (zh) 2016-03-30
CN105446723B CN105446723B (zh) 2018-11-23

Family

ID=55402576

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201410444102.2A Expired - Fee Related CN105446723B (zh) 2014-09-02 2014-09-02 用于标识源代码版本之间的语义区别的方法和装置

Country Status (2)

Country Link
US (1) US9594553B2 (zh)
CN (1) CN105446723B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106095663A (zh) * 2016-05-26 2016-11-09 西安交通大学 基于切片模型的程序回归错误定位方法
CN110659200A (zh) * 2018-06-29 2020-01-07 中国航发商用航空发动机有限责任公司 航空机载软件的源码和目标码对比分析方法及系统
CN111158694A (zh) * 2019-12-19 2020-05-15 杭州迪普科技股份有限公司 编译告警处理方法及装置
CN112698832A (zh) * 2020-12-28 2021-04-23 东软集团股份有限公司 一种识别代码变更影响范围的方法、装置及设备
CN113656318A (zh) * 2021-08-23 2021-11-16 上海哔哩哔哩科技有限公司 软件版本测试方法、装置及计算机设备

Families Citing this family (32)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10579497B2 (en) * 2013-02-26 2020-03-03 Red Hat, Inc. Providing context simulation
CN105446723B (zh) * 2014-09-02 2018-11-23 国际商业机器公司 用于标识源代码版本之间的语义区别的方法和装置
US9672031B2 (en) * 2015-09-01 2017-06-06 Ca, Inc. Controlling repetitive check-in of intermediate versions of source code from a developer's computer to a source code repository
US10509719B2 (en) * 2015-09-08 2019-12-17 Micro Focus Llc Automatic regression identification
US10409559B2 (en) 2016-03-18 2019-09-10 Oracle International Corporation Single-source-base compilation for multiple target environments
US9804829B2 (en) * 2016-03-31 2017-10-31 Ca, Inc. Interface definition language compiler with version reconciliation
US9916235B2 (en) * 2016-08-09 2018-03-13 Seagate Technology Llc Code failure locator
US10572245B1 (en) * 2016-08-30 2020-02-25 Amazon Technologies, Inc. Identifying versions of running programs using signatures derived from object files
US9870314B1 (en) * 2016-12-12 2018-01-16 Red Hat, Inc. Update testing by build introspection
CN106951228B (zh) * 2017-02-21 2023-07-18 腾讯科技(深圳)有限公司 版本迭代中差异的处理方法和装置
US10635426B2 (en) 2017-03-17 2020-04-28 Microsoft Technology Licensing, Llc Runtime deployment of payloads in a cloud service
US10452515B2 (en) * 2017-06-06 2019-10-22 Sap Se Automated root cause detection using data flow analysis
CN115357897A (zh) * 2017-12-28 2022-11-18 超聚变数字技术有限公司 一种开源软件识别方法及装置
CN108427637B (zh) * 2018-01-18 2021-05-25 平安科技(深圳)有限公司 测试案例推荐方法、电子装置及可读存储介质
US11531531B1 (en) 2018-03-08 2022-12-20 Amazon Technologies, Inc. Non-disruptive introduction of live update functionality into long-running applications
CN108509200A (zh) * 2018-03-13 2018-09-07 中国银行股份有限公司 一种建立软件源代码与执行码之间关联的方法及装置
US11429380B2 (en) * 2018-09-25 2022-08-30 Fossid AB Method for converting source code into numeric identifiers and comparison against data sets
CN110221968A (zh) * 2019-05-20 2019-09-10 平安普惠企业管理有限公司 软件测试方法及相关产品
US11397817B2 (en) 2019-08-22 2022-07-26 Denso Corporation Binary patch reconciliation and instrumentation system
CN110532193A (zh) * 2019-09-09 2019-12-03 珠海金山网络游戏科技有限公司 一种性能分析方法、装置、计算设备及存储介质
WO2021050065A1 (en) * 2019-09-12 2021-03-18 Hewlett-Packard Development Company, L.P. Regression testing of applications based on source code change locations and source code test locations
US20210182247A1 (en) * 2019-12-16 2021-06-17 Chicago Mercantile Exchange Inc. Validation of system functionality subsequent to modification using parallel regression testing
CN111367796B (zh) * 2020-02-26 2023-06-16 浪潮通用软件有限公司 应用程序调试方法及装置
CN111506342A (zh) * 2020-04-23 2020-08-07 北京奇艺世纪科技有限公司 版本差异检测方法、装置、电子设备及存储介质
CN111597069B (zh) * 2020-05-21 2023-06-13 中国工商银行股份有限公司 程序处理方法、装置、电子设备和存储介质
US11119907B1 (en) 2020-08-19 2021-09-14 Oracle International Corporation Techniques for tracking and testing code modifications using semantic catalogue
CN112527659A (zh) * 2020-12-17 2021-03-19 展讯通信(上海)有限公司 测试方法及装置
US20210182031A1 (en) * 2020-12-23 2021-06-17 Intel Corporation Methods and apparatus for automatic detection of software bugs
CN112631935A (zh) * 2020-12-30 2021-04-09 中国农业银行股份有限公司 一种基于版本冲突的测试方法和装置
CN113900962B (zh) * 2021-12-10 2022-03-18 广州易方信息科技股份有限公司 代码差异检测方法及装置
CN114385231B (zh) * 2021-12-20 2024-05-28 杭州安恒信息安全技术有限公司 数据处理方法、装置、存储介质及电子设备
CN114500282B (zh) * 2022-01-06 2023-05-30 广东美的暖通设备有限公司 室内机位置识别方法、装置、电子设备及介质

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040221270A1 (en) * 1999-12-29 2004-11-04 Emmett Witchel Method for determining the degree to which changed code has been exercised
US20050028143A1 (en) * 2003-07-31 2005-02-03 International Business Machines Corporation Automated semantic-based updates to modified code base
TW201142706A (en) * 2010-05-31 2011-12-01 Ibm Method, system, and computer program product for hierarchical program source management
CN102681835A (zh) * 2010-12-20 2012-09-19 微软公司 代码克隆通知以及体系结构改变可视化
CN103262047A (zh) * 2010-12-15 2013-08-21 微软公司 使用代码克隆检测的智能代码差分

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB0018042D0 (en) * 2000-07-21 2000-09-13 Monsell Edm Ltd Method of and software for recordal and validation of changes to markup language files
US20070168975A1 (en) * 2005-12-13 2007-07-19 Thomas Kessler Debugger and test tool
WO2008119572A1 (en) * 2007-03-29 2008-10-09 International Business Machines Corporation An apparatus and method for identifying contextual changes in source code
US8132157B2 (en) * 2008-01-17 2012-03-06 International Business Machines Corporation Method of automatic regression testing
US8752020B2 (en) * 2008-08-21 2014-06-10 International Business Machines Corporation System and process for debugging object-oriented programming code leveraging runtime metadata
US20100299654A1 (en) * 2009-05-21 2010-11-25 Microsoft Corporation Approach for root causing regression bugs
CN102110048B (zh) 2009-12-28 2014-07-09 国际商业机器公司 用于基于框架的应用程序的回归测试选择方法和装置
US8533668B2 (en) * 2010-04-26 2013-09-10 Red Hat, Inc. Comparing source code using code statement structures
CN105446723B (zh) * 2014-09-02 2018-11-23 国际商业机器公司 用于标识源代码版本之间的语义区别的方法和装置

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040221270A1 (en) * 1999-12-29 2004-11-04 Emmett Witchel Method for determining the degree to which changed code has been exercised
US20050028143A1 (en) * 2003-07-31 2005-02-03 International Business Machines Corporation Automated semantic-based updates to modified code base
TW201142706A (en) * 2010-05-31 2011-12-01 Ibm Method, system, and computer program product for hierarchical program source management
CN103262047A (zh) * 2010-12-15 2013-08-21 微软公司 使用代码克隆检测的智能代码差分
CN102681835A (zh) * 2010-12-20 2012-09-19 微软公司 代码克隆通知以及体系结构改变可视化

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106095663A (zh) * 2016-05-26 2016-11-09 西安交通大学 基于切片模型的程序回归错误定位方法
CN106095663B (zh) * 2016-05-26 2017-06-27 西安交通大学 基于切片模型的程序回归错误定位方法
CN110659200A (zh) * 2018-06-29 2020-01-07 中国航发商用航空发动机有限责任公司 航空机载软件的源码和目标码对比分析方法及系统
CN110659200B (zh) * 2018-06-29 2023-05-02 中国航发商用航空发动机有限责任公司 航空机载软件的源码和目标码对比分析方法及系统
CN111158694A (zh) * 2019-12-19 2020-05-15 杭州迪普科技股份有限公司 编译告警处理方法及装置
CN112698832A (zh) * 2020-12-28 2021-04-23 东软集团股份有限公司 一种识别代码变更影响范围的方法、装置及设备
CN112698832B (zh) * 2020-12-28 2024-02-13 东软集团股份有限公司 一种识别代码变更影响范围的方法、装置及设备
CN113656318A (zh) * 2021-08-23 2021-11-16 上海哔哩哔哩科技有限公司 软件版本测试方法、装置及计算机设备

Also Published As

Publication number Publication date
CN105446723B (zh) 2018-11-23
US20160062765A1 (en) 2016-03-03
US9594553B2 (en) 2017-03-14

Similar Documents

Publication Publication Date Title
CN105446723A (zh) 用于标识源代码版本之间的语义区别的方法和装置
US10235141B2 (en) Method and system for providing source code suggestion to a user in real-time
CN105335137A (zh) 用于处理源文件的方法和装置
CN103765402B (zh) 使用混合代码签名跟踪程序的调用上下文
CN103678110B (zh) 提供修改相关信息的方法和装置
US20160306612A1 (en) Determining errors and warnings corresponding to a source code revision
US20150370685A1 (en) Defect localization in software integration tests
KR20130135271A (ko) 코드 복제 통지 및 아키텍처 변경 가시화
EP2885701A1 (en) Predicting software build errors
US10049031B2 (en) Correlation of violating change sets in regression testing of computer software
CN103164334A (zh) 检测web应用自动测试用例中的断裂点的系统和方法
US9134977B2 (en) Compiler operation for handling conditional statements
CN104899010A (zh) 源代码的多语言化方法及系统
KR102160780B1 (ko) 버그 정정 시스템 및 버그 정정 방법
CN105335282A (zh) 用于应用的跨平台测试的方法和系统
CN105701006A (zh) 用于程序调试中的变量跟踪的方法和系统
CN105446725A (zh) 用于模型驱动开发的方法和系统
CN105094780A (zh) 一种信息关联的方法和装置
CN103345412A (zh) 打补丁的方法及装置
Lee et al. Automatic detection and update suggestion for outdated API names in documentation
CN105630661A (zh) 用于自动化跨系统程序调试的方法和装置
CN104572439A (zh) 回归警告方法和系统
RU2656580C2 (ru) Определение порядка инициализации статистических объектов
CN105630625A (zh) 检测数据副本之间的一致性的方法和装置
US8966455B2 (en) Flow analysis in program execution

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
CF01 Termination of patent right due to non-payment of annual fee
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20181123