CN114168143A - 软件中源码的定位方法、装置、计算设备及可读存储介质 - Google Patents
软件中源码的定位方法、装置、计算设备及可读存储介质 Download PDFInfo
- Publication number
- CN114168143A CN114168143A CN202111414161.1A CN202111414161A CN114168143A CN 114168143 A CN114168143 A CN 114168143A CN 202111414161 A CN202111414161 A CN 202111414161A CN 114168143 A CN114168143 A CN 114168143A
- Authority
- CN
- China
- Prior art keywords
- list
- class
- source code
- name
- call
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 349
- 230000003068 static effect Effects 0.000 claims abstract description 21
- 230000000977 initiatory effect Effects 0.000 claims description 80
- 238000004891 communication Methods 0.000 description 17
- 238000010586 diagram Methods 0.000 description 16
- 230000006870 function Effects 0.000 description 14
- 230000008569 process Effects 0.000 description 11
- 238000012360 testing method Methods 0.000 description 11
- 238000010367 cloning Methods 0.000 description 6
- 230000008859 change Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 5
- 238000012545 processing Methods 0.000 description 5
- 230000002093 peripheral effect Effects 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 238000012544 monitoring process Methods 0.000 description 2
- 230000007723 transport mechanism Effects 0.000 description 2
- 238000010276 construction Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000002513 implantation Methods 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012216 screening Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种软件中源码的定位方法,基于Lint工具获取参考版本软件中目标模块对第一公共库中方法的第一调用列表,对参考版本中第一模块的源码进行静态语法分析,生成第一抽象语法树。将第一调用列表和第一抽象语法树匹配,获得第二调用列表。监测到新版本提交时,获取新版本中第二公共库与第一公共库的差异文件列表,对第二公共库的源码进行静态语法分析,生成第二抽象语法树。将差异文件列表和第二抽象语法树匹配,获得第二公共库中被发生变动的源码影响的类与方法的第一影响列表。将第二调用列表与第一影响列表进行匹配,得到目标模块中被发生变动的源码影响的类与方法的第二影响列表。本发明一并公开了相应的装置、计算设备及可读存储介质。
Description
技术领域
本发明涉及计算机领域,尤其涉及一种软件中源码的定位方法、装置、计算设备及可读存储介质。
背景技术
随着应用软件中代码的体量越来越大,在软件升级过程中精准地判断发生变动的代码所影响的范围变得越来越重要。
目前,一般采用动态分析法来获取软件升级过程中发生变动的代码所影响的范围。具体地,对内部方法进行代码植入,当执行自动化或者功能测试时,记录一次请求经过的所有内部方法,这样形成的内部方法调用链将会记录面向切面编程AOP和多态执行的真正方法。
然而,这种方法对于新增代码的影响面大部分都是依靠字节码分析,而字节码分析在多态和AOP方面存在天然短板,因此影响面会有所丢失。并且,应用内链路跟踪存在大规模代码植入,对性能和内存资源会造成一定损耗,对于代码量很大的工程,损耗尤其严重。
为此,亟需一种软件中源码的定位方法来解决上述技术问题。
发明内容
为此,本发明提供了一种软件中源码的定位方法、装置、计算设备及可读存储介质,以力图解决或者至少缓解上面存在的问题。
根据本发明的一个方面,提供一种软件中源码的定位方法,在计算设备中执行,软件包括一个公共库和至少一个模块,该方法包括:依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取所有第一模块中的各个目标模块对第一公共库中的方法的第一调用列表,第一调用列表中的每个节点包括一个目标模块中一处发起调用的源码所在的类的存储路径、该处发起调用的源码在该目标模块中的行数以及其所调用的第一公共库中的类与方法的名称;对所有第一模块的源码进行静态语法分析,生成第一抽象语法树;将第一调用列表与第一抽象语法树进行匹配,获得各个目标模块对第一公共库中的方法的第二调用列表,第二调用列表中的每个节点包括一个目标模块中一个发起调用的方法的名称、该发起调用的方法所在的类的名称以及其所调用的类与方法的名称;当监测到新版本提交时,获取第一差异文件列表,第一差异文件列表中的每个节点包括一处差异源码所在的类的名称以及该处差异源码在新版本的第二公共库中的行数,一处差异源码为将第一公共库升级为第二公共库时一个类中发生变动的源码;对新版本软件中的第二公共库的源码进行静态语法分析,生成第二抽象语法树;将第一差异文件列表与第二抽象语法树进行匹配,得到第二公共库中被发生变动的源码所影响的类与方法的第一影响列表;将第二调用列表与第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。
可选地,在根据本发明的软件中源码的定位方法中,进行静态语法分析的步骤,包括:对相应文件中的类进行解析,得到各个类的名称;对相应文件中的方法进行解析,得到各个方法的名称以及各个方法在其相应文件中的起始行和结束行;根据各个类的名称、各个方法的名称以及各个方法在相应文件中的起始行和结束行,生成相应的抽象语法树。
可选地,在根据本发明的软件中源码的定位方法中,将第一调用列表与第一抽象语法树进行匹配,获得第二调用列表的步骤,包括:将任一处发起调用的源码所在的类的存储路径中的类的名称分别与第一抽象语法树中的各个节点中的类的名称进行比对,得到发起调用的类的名称;检测发起调用的源码在目标模块中的行数是否包含在所得到的类中的某一方法所在的起始行与结束行之间;若是,则确定该方法为发起调用的源码所在的方法,得到发起调用的方法的名称;根据每个发起调用的方法的名称、每个发起调用的方法所在的类的名称以及每个发起调用的方法所调用的类与方法的名称,生成第二调用列表。
可选地,在根据本发明的软件中源码的定位方法中,获取第一差异文件列表的步骤,包括:通过git diff获取新版本软件与初始版本软件的第二差异文件列表;对第二差异文件列表进行去噪处理,得到第一差异文件列表。
可选地,在根据本发明的软件中源码的定位方法中,将第一差异文件列表与第二抽象语法树进行匹配,得到第一影响列表的步骤,包括:将任一处差异源码所在的类的名称与第二抽象语法树中的各个节点中的类的名称进行对比,得到第二公共库中被差异源码所影响的类的名称;检测差异源码在第二公共库中的行数是否包含在所得到的类中的若干方法所在的起始行与结束行之间;若是,则确定该方法为差异源码所影响的方法,得到被差异源码所影响的方法的名称;根据第二公共库中被每处差异源码所影响的类与方法的名称,生成第一影响列表。
可选地,在根据本发明的软件中源码的定位方法中,将第二调用列表与第一影响列表进行匹配,得到第二影响列表的步骤,包括:将任一目标模块中任一发起调用的方法所调用的类的名称与第一影响列表中的各个类的名称进行对比;若发起调用的方法所调用的类的名称与第一影响列表中的某一个类的名称相同,则将发起调用的方法所调用的方法的名称与第一影响列表中该类中的各个方法的名称进行对比;若发起调用的方法所调用的方法的名称与第一影响列表中该类中的某一方法的名称相同,则确定发起调用的方法为被发生变动的源码所影响的方法;根据各个目标模块中被发生变动的源码所影响的类与方法的名称,生成第二影响列表。
可选地,在根据本发明的软件中源码的定位方法中,参考版本软件为发布的第一个版本的软件。
可选地,在根据本发明的软件中源码的定位方法中,在依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取第一调用列表的步骤之前,还包括:将参考版本软件中第一公共库和所有第一模块的源码克隆至计算设备中。
可选地,在根据本发明的软件中源码的定位方法中,将参考版本软件中第一公共库和所有第一模块的源码克隆至计算设备中的步骤,包括:获取参考版本软件的配置信息,配置信息包括参考版本软件的集成包的分支信息、集成包中的第一公共库的分支信息以及集成包中的第一模块的ID列表;根据集成包的分支信息以及第一公共库的分支信息,将第一公共库的源码克隆至计算设备中;根据第一模块的ID列表,将所有第一模块的源码克隆至计算设备中。
根据本发明的又一个方面,提供一种软件中源码的定位装置,驻留在计算设备中,软件包括一个公共库和至少一个模块,该装置包括:第一调用列表获取单元,适于依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取所有第一模块中的各个目标模块对第一公共库中的方法的第一调用列表,第一调用列表中的每个节点包括一个目标模块中一处发起调用的源码所在的类的存储路径、该处发起调用的源码在该目标模块中的行数以及其所调用的第一公共库中的类与方法的名称;第一抽象语法树生成单元,适于对所有第一模块的源码进行静态语法分析,生成第一抽象语法树;第二调用列表获取单元,适于将第一调用列表与第一抽象语法树进行匹配,获得各个目标模块对第一公共库中的方法的第二调用列表,第二调用列表中的每个节点包括一个目标模块中一个发起调用的方法的名称、该发起调用的方法所在的类的名称以及其所调用的类与方法的名称;第一差异文件列表获取单元,适于当监测到新版本提交时,获取第一差异文件列表,第一差异文件列表中的每个节点包括一处差异源码所在的类的名称以及该处差异源码在新版本的第二公共库中的行数,一处差异源码为将第一公共库升级为第二公共库时一个类中发生变动的源码;第二抽象语法树生成单元,适于对新版本软件中的第二公共库的源码进行静态语法分析,生成第二抽象语法树;第一影响列表获取单元,适于将第一差异文件列表与第二抽象语法树进行匹配,得到第二公共库中被发生变动的源码所影响的类与方法的第一影响列表;第二影响列表获取单元,适于将第二调用列表与第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。
根据本发明的又一个方面,提供一种计算设备,包括:至少一个处理器;以及存储器,存储有程序指令,其中,程序指令被配置为适于由至少一个处理器执行,程序指令包括用于执行根据本发明的软件中源码的定位方法的指令。
根据本发明的又一个方面,提供一种存储有程序指令的可读存储介质,当程序指令被计算设备读取并执行时,使得计算设备执行根据本发明的软件中源码的定位方法。
根据本发明的软件中源码的定位方法,首先基于Lint工具,获取参考版本软件中各个目标模块对第一公共库中的方法的第一调用列表,并对参考版本软件中的所有第一模块的源码进行静态语法分析,生成第一抽象语法树。然后,将第一调用列表和第一抽象语法树进行匹配,获得各个目标模块对第一公共库中的方法的第二调用列表。随后,当监测到新版本提交时,则获取新版软件中第二公共库与参考版本软件中第一公共库的差异文件列表,并对新版本软件中第二公共库的源码进行静态语法分析,生成第二抽象语法树。随之,则将差异文件列表和第二抽象语法树进行匹配,获得第二公共库中被发生变动的源码所影响的类与方法的第一影响列表。最后,将第二调用列表与第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。
可见,每监测到新版本软件提交,本发明则自动获取该软件的公共库中任一方法下发生变动的源码,并基于此自动地获取软件中各个模块下被改动的源码所影响的所有方法。因此,本发明能自动精准地定位出公共库中发生变动的源码所影响的范围,从而能精确推算出需进行测试的各个功能点,实现了精确化测试,大幅降低了回归测试的成本,同时也降低了开发者的成本。
另外,本发明是根据静态生成的抽象语法树和基于Lint工具生成的调用关系来获取软件中各个模块下被改动的源码所影响的方法,因此无代码植入,从而能够进一步提高定位的精准性,并且也不会对软件的性能和内存资源造成影响。
附图说明
为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
图1示出了根据本发明一个实施例的计算设备100的结构框图;
图2示出了根据本发明一个实施例的软件中源码的定位方法200的流程图;
图3示出了根据本发明一个实施例的一个发布节点的示意图;
图4示出了根据本发明一个实施例的第一调用列表中的一个节点的示意图;
图5示出了根据本发明一个实施例的第一抽象语法树的一个节点的示意图;
图6示出了根据本发明一个实施例的第二调用列表中的一个节点的示意图;
图7示出了根据本发明一个实施例的噪音数据的示意图;
图8示出了根据本发明一个实施例的第一影响方法列表中的一个节点的示意图;
图9示出了根据本发明一个实施例的第二影响方法列表的示意图;
图10示出了根据本发明一个实施例的软件中源码的定位装置1000的结构框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
随着业务的不断发展,软件代码的体量和复杂度也在不断增加。基于此,为了提高对代码的把控精度、减少风险失控带来的问题,在软件升级过程中必须准确、全面地判定修改的代码所影响的范围,以来精确地预测测试的影响范围。
鉴于此,提出本发明的方案。本发明的一个实施例提供了一种软件中源码的定位方法,该方法可以在计算设备中执行。图1示出了根据本发明一个实施例的计算设备100的结构框图。需要说明的是,图1所示的计算设备100仅为一个示例,在实践中,用于实施本发明的软件中源码的定位方法的计算设备可以是任意型号的设备,其硬件配置情况可以与图1所示的计算设备100相同,也可以与图1所示的计算设备100不同。实践中用于实施本发明的软件中源码的定位方法的计算设备可以对图1所示的计算设备100的硬件组件进行增加或删减,本发明对计算设备的具体硬件配置情况不做限制。
如图1所示,在基本配置102中,计算设备100典型地包括系统存储器106和一个或者多个处理器104。存储器总线108可以用于在处理器104和系统存储器106之间的通信。
取决于期望的配置,处理器104可以是任何类型的处理,包括但不限于:微处理器(μP)、微控制器(μC)、数字信息处理器(DSP)或者它们的任何组合。处理器104可以包括诸如一级高速缓存110和二级高速缓存112之类的一个或者多个级别的高速缓存、处理器核心114和寄存器116。示例的处理器核心114可以包括运算逻辑单元(ALU)、浮点数单元(FPU)、数字信号处理核心(DSP核心)或者它们的任何组合。示例的存储器控制器118可以与处理器104一起使用,或者在一些实现中,存储器控制器118可以是处理器104的一个内部部分。
取决于期望的配置,系统存储器106可以是任意类型的存储器,包括但不限于:易失性存储器(诸如RAM)、非易失性存储器(诸如ROM、闪存等)或者它们的任何组合。计算设备中的物理内存通常指的是易失性存储器RAM,磁盘中的数据需要加载至物理内存中才能够被处理器104读取。系统存储器106可以包括操作系统120、一个或者多个应用122以及程序数据124。在一些实施方式中,应用122可以布置为在操作系统上由一个或多个处理器104利用程序数据124执行指令。操作系统120例如可以是Linux、Windows等,其包括用于处理基本系统服务以及执行依赖于硬件的任务的程序指令。应用122包括用于实现各种用户期望的功能的程序指令,应用122例如可以是浏览器、即时通讯软件、软件开发工具(例如集成开发环境IDE、编译器等)等,但不限于此。当应用122被安装到计算设备100中时,可以向操作系统120添加驱动模块。
在计算设备100启动运行时,处理器104会从系统存储器106中读取操作系统120的程序指令并执行。应用122运行在操作系统120之上,利用操作系统120以及底层硬件提供的接口来实现各种用户期望的功能。当用户启动应用122时,应用122会加载至系统存储器106中,处理器104从系统存储器106中读取并执行应用122的程序指令。
计算设备100还包括储存设备132,储存设备132包括可移除储存器136和不可移除储存器138,可移除储存器136和不可移除储存器138均与储存接口总线134连接。
计算设备100还可以包括有助于从各种接口设备(例如,输出设备142、外设接口144和通信设备146)到基本配置102经由总线/接口控制器130的通信的接口总线140。示例的输出设备142包括图形处理单元148和音频处理单元150。它们可以被配置为有助于经由一个或者多个A/V端口152与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口144可以包括串行接口控制器154和并行接口控制器156,它们可以被配置为有助于经由一个或者多个I/O端口158和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备146可以包括网络控制器160,其可以被布置为便于经由一个或者多个通信端口164与一个或者多个其他计算设备162通过网络通信链路的通信。
网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(RF)、微波、红外(IR)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。
在根据本发明的计算设备100中,应用122包括用于执行本发明的软件中源码的定位方法200的指令,该指令可以指示处理器104执行本发明的软件中源码的定位方法。本领域技术人员可以理解,除了用于执行软件中源码的定位方法200的指令之外,应用122还可以包括用于实现其他功能的其他应用126。
图2示出了根据本发明一个实施例的一种软件中源码的定位方法200的流程图,方法200适于在计算设备(例如图1所示的计算设备100)中执行。在此先说明一点,本发明中的软件包括一个公共库和至少一个模块。其中,公共库为由开发人员编写的一个用于供各个模块所调用的库,不包含第三方库。具体地,该公共库至少包含一个类,每个类至少包含一个方法。同样,每个模块至少包含一个类,每个类也至少包含一个方法,并且各个模块可以相互独立的存在于软件中。另外,根据本发明的一个实施例,每个模块可以以插件的形式插入到软件中。
如图2所示,本发明的软件中源码的定位方法200始于步骤S210。其中,在步骤S210之前还包括将参考版本软件中第一公共库和所有第一模块的源码克隆至计算设备中,以在该计算设备中搭建对该软件的源码进行定位的环境(进一步讲是指,搭建该软件升级时定位第一公共库中发生变动的源码所影响的各个第一模块中的方法的环境)。其中,参考版本可以为任何一个通过测试的版本。例如,参考版本软件可以是第一次通过测试的那个版本的软件。当然,对于一个软件,具体选取哪个版本作为参考版本,本发明不作限定。在具体的实施例中,本领域的技术人员可以根据实际情况设定。
根据本发明的一个实施例,可以通过获取参考版本软件的配置信息,然后对其进行解析来将参考版本软件中第一公共库的源码和所有第一模块的源码克隆至计算设备中。具体地:
首先,获取参考版本软件的配置信息。其中,Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。因此,软件的各个版本可以采用Git管理。并且,一个软件一般会对应一个集成包,该集成包中集成该软件所有的源码。因此,根据本发明的一个实施例,参考版本软件的配置信息可以包括参考版本软件的集成包的分支信息、参考版本软件的集成包中的第一公共库的分支信息以及由参考版本软件的集成包中所有第一模块的ID所组成的第一模块的ID列表。
然后,根据集成包的分支信息以及第一公共库的分支信息,将第一公共库的源码克隆至计算设备中。即,根据集成包的分支信息以及第一公共库的分支信息,从Git仓库中将第一公共库的源码下载至计算设备中。
最后,根据第一模块的ID列表,将所有第一模块的源码克隆至计算设备中。具体地,根据各个第一模块的ID列表,获取各个第一模块的分支信息。接着,根据各个第一模块的分支信息,从Git仓库中将各个第一模块的源码下载至计算设备中。
至此,便将参考版本软件中的第一公共库的源码和所有第一模块的源码克隆至了计算设备中,完成了定位环境的搭建。需要说明的是,上述已经介绍了参考版本可以为任何一个通过测试的版本。因此,在一些实施例中,对于任一软件,可以监测其发布流程,当进入到发布节点后,自动将该版本软件中的第一公共库的源码和所有第一模块的源码克隆至计算设备中以便将其作为下次升级的参考版本软件。其中,发布节点是APP开发、测试、上线流程中的最后的节点,如图3所示。
随后进入步骤S210,依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取所有第一模块中的各个目标模块对第一公共库中的方法的第一调用列表。其中,第一调用列表中的每个节点包括一个目标模块中一处发起调用的源码所在的类的存储路径、该处发起调用的源码在该目标模块中的行数以及该处发起调用的源码所调用的第一公共库中的类与方法的名称。因此,第一调用列表中包含了所有目标模块中各发起调用的源码所在的类的存储路径、各发起调用的源码在其所属的目标模块中的行数以及各发起调用的源码所调用的第一公共库中的类的名称与方法的名称。如图4所示,其示出了第一调用列表中的一个节点的示意图。
Lint是Android提供的一个静态代码扫描工具,根据本发明的一个实施例,可以在Lint工具中增加一个对方法调用的监测功能,进而来获取所有第一模块中的各个目标模块对第一公共库中的方法的第一调用列表。具体地,自定义Detector,实现UastScanner的接口,重写createUastHandler方法,返回UElementHandler实例,重写UElementHandler的visitCallExpression方法,在visitCallExpression的回调中获取被调用的类和方法,以及调用所在位置,然后输出到文件中。
进一步地讲,通过继承Lint的接口实现自定义Lint扫描器,创建语法扫描句柄实例,在语法扫描句柄的函数调用表达式的回调方法中处理函数调用表达式。首先通过函数调用表达式获取程序结构化函数实例,这个实例就是被调用的方法实例,通过程序结构化函数实例可以使用接口直接获取到方法的名称,方法的调用位置,以及方法所在的程序结构类的实例,通过类实例获取类的完整类名,通过类名筛选出目标类集,再将完整类名和方法名拼接,用于之后解析使用,然后将上述获得的信息上报输出。其中,程序结构接口,通常简称为PSI,是IntelliJ平台中负责解析文件和创建支持平台众多特性的语法和语义代码模型的层。
根据本发明的一个实施例,利用增加了方法调用监测功能的Lint工具对参考版本软件中第一公共库和所有第一模块进行扫描,获取所有第一模块中的各个目标模块对第一公共库中的方法的第一调用列表的示例性代码如下:
随后,进入步骤S220,对所有第一模块的源码进行静态语法分析,生成第一抽象语法树。其中,抽象语法树AST(Abstract Syntax Tree),简称语法树(Syntax tree),是在计算机科学中对源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。语法分析则是,根据某种给定的形式文法对由单词序列构成的输入文本进行分析并确定其语法结构的一种过程。
根据本发明的一个实施例,可以通过如下方式对所有第一模块的源码进行静态语法分析来生成第一抽象语法树。首先,对所有第一模块的源码中的各个类进行解析,得到各个类的名称。然后,对所有第一模块的源码中的各个方法进行解析,得到各个方法的名称以及各个方法在其所属的第一模块中的起始行和结束行。最后,根据解析得到的各个类的名称、各个方法的名称以及各个方法在其所属的第一模块中的起始行和结束行,生成第一抽象语法树。其中,第一抽象语法树中的每个节点包括一个方法的名称、该方法所在的类的名称以及该方法在其所属的第一模块中的起始行和结束行。如图5所示,其示出了第一抽象语法树中的一个节点的示意图。因此,第一抽象语法树中包括了所有第一模块中各个方法的名称、各个方法所在的类的名称以及各个方法在其所属的第一模块中的起始行和结束行。另,需要说明的是,对源码进行静态语法分析来生成抽象树的具体过程为现有技术(例如词法分析、语法分析等),因此本发明在此未对其进行详细阐述。
根据本发明的一个实施例,对所有第一模块的源码进行静态语法分析来生成第一抽象语法树的示例性代码如下:
至此,便得到了第一调用列表和第一抽象语法树。随后,进入步骤S230,将第一调用列表与第一抽象语法树进行匹配,获得各个目标模块对第一公共库中的方法的第二调用列表。具体地,将任一处发起调用的源码所在的类的存储路径中的类的名称分别与第一抽象语法树中的各个节点中的类的名称进行比对,得到发起该调用的类的名称。随之,检测该处发起调用的源码在目标模块中的行数是否包含在所得到的类中的某一方法所在的起始行与结束行之间。若是,则确定该方法为发起调用的源码所在的方法,得到发起调用的方法的名称。根据每个发起调用的方法的名称、每个发起调用的方法所在的类的名称以及每个发起调用的方法所调用的类与方法的名称,生成第二调用列表。
下面示出了一个将第一调用列表与第一抽象语法树进行匹配的具体实施例:
依次将第一调用列表中的每个节点处发起调用的源码所在的类的存储路径中所包含的类的名称分别与第一抽象语法树中的各个节点中的类的名称进行比对。例如,将图4中所示的第一调用列表中节点处的file_path中包含的那个类的名称和图5中所示的第一抽象语法树中节点处的filename进行比对。
当某一节点A处发起调用的源码所在的类的存储路径中所包含的类的名称与第一抽象语法树中的一个节点a中的类的名称一致时,则确定第一抽象语法树中节点a中的类为第一调用列表中节点A处发起调用的源码所在的类,即得到了发起此处调用的类的名称。同样以图4和图5中的节点为例,当图4中的file_path中包含的那个类的名称与图5中的filename相同时,则确定图4中所示的节点处发起调用的源码所在的类的名称为图5中的classname(classname与filename相同)。
在得到了发起此处调用的类的名称后,判断第一调用列表中节点A处发起调用的源码在其所属的目标模块中的行数是否包含在第一抽象语法树中节点a处的那个方法所在的起始行与结束行之间。若是,则确定第一抽象语法树节点a处的方法为第一调用列表中节点A处发起调用的源码所在的方法,即得到了发起此处调用的方法的名称。随之,将得到的第一调用列表节点A处发起调用的源码所在的类的名称、所在的方法的名称加入到第一调用列表节点A处。继续以图4和图5中的节点为例,当确定图4中所示的节点处发起调用的源码所在的类的名称为图5中的classname后,判断图4中所示的第一调用列表中节点处的func_line_pose是否包含在图5中所示的第一抽象语法树中节点处的func_line_pose和func_endline_pose之间。若是,则确定图5中所示的第一抽象语法树中节点处的methodname为图4中所示的第一调用列表中节点处的发起调用的源码所在的方法的名称。随后,将图5中的classname和methodname添加到图4中,具体可以将methodname以call_func形式加入,classname以call_classname形式加入,如图6所示。
若不是,则继续将第一调用列表中节点A处发起调用的源码所在的类的存储路径中所包含的那个类的名称继续与第一抽象语法树中的下一个节点中的类的名称进行比对,若比对一致则继续判断第一调用列表中节点A处发起调用的源码在其所属的目标模块中的行数是否包含在第一抽象语法树中该节点处的那个方法所在的起始行与结束行之间,直至第一调用列表中节点A处的发起调用的源码在其所属的目标模块中的行数包含在第一抽象语法树某节点处的那个方法所在的起始行与结束行之间,或者第一调用列表节点A处发起调用的源码所在的类的存储路径中所包含的那个类的名称已与第一抽象语法树中的所有节点中的类的名称比对完毕。
在将第一调用列表中的每个节点处发起调用的源码所在的类的存储路径中所包含的那个类的名称与第一抽象语法树中的各个节点中的类的名称全部比对完毕后,且将已得到的类的名称和方法的名称加入到第一调用列表中相应的节点处后(对于第一列表中未得到类名和方法名的节点剔除),便得到了第二调用列表。由于第一调用列表中各节点处还记录着发起调用的源码所调用的第一公共库中的类的名称与方法的名称。因此,第二调用列表中的每个节点包括一个目标模块中一个发起调用的方法的名称、该发起调用的方法所在的类的名称以及其所调用的类的名称与方法的名称。
得到第二调用列表,即,得到了参考版本软件中所有第一模块中调用了第一公共库的目标模块中的各个方法对第一公共库中的各个方法的依赖关系。随后,进入步骤S240,监测新版本软件的提交,并当监测到新版本提交时,获取第一差异文件列表。具体地,首先通过git diff获取新版本软件与初始版本软件的第二差异文件列表。然后,对第二差异文件列表进行去噪处理,得到第一差异文件列表。去噪处理是指将噪音数据进行去除。其中,噪音数据是指git diff结果中,对于解析影响范围没有作用的数据。如图7所示,其示出了根据本发明的一个实施例的噪音数据的示意图。
根据本发明的一个实施例,对第二差异文件列表进行去噪处理后,仅保留新版本软件中第二公共库与参考版本软件中第一公共库中的差异文件列表。即,第一差异文件列表为新版本软件中第二公共库与参考版本软件中第一公共库的差异文件列表。具体地,第一差异文件列表中的每个节点可以包括一处差异源码所在的类的名称以及该处差异源码在新版本软件的第二公共库的行数。其中,一处差异源码为将第一公共库升级为第二公共库时一个类中发生变动的源码。也就是说,第一差异文件列表中的每个节点包含一个公共库中源码发生变动了的类的名称以及在该类下发生变动的源码在第二公共库中的行数。需要说明的是,这里的发生变动的源码包括在方法中修改的源码和在方法中增加的源码。即,发生变动的源码既指修改的源码,还指增加的源码。
随后进入步骤S250,对新版本软件中的第二公共库的源码进行静态语法分析,生成第二抽象语法树。具体地,首先对第二公共库的源码中的各个类进行解析,得到各个类的名称。然后,对第二公共库的源码中的各个方法进行解析,得到各个方法的名称以及各个方法在第二公共库中的起始行和结束行。最后,根据解析得到的各个类的名称、各个方法的名称以及各个方法在第二公共库中的起始行和结束行,生成第二抽象语法树。其中,第二抽象语法树中的每个节点包括一个方法的名称、该方法所在的类的名称以及该方法在第二公共库中的起始行和结束行。因此,第二抽象语法树中包括了第二公共库中各个方法的名称、各个方法所在的类的名称以及各个方法在第二公共库中的起始行和结束行。同样,对源码进行静态语法分析来生成抽象树的具体过程为现有技术(例如词法分析、语法分析等),因此本发明在此未对其进行详细阐述。
在上述得到新版软件中第二公共库与参考版本软件中第一公共库的第一差异文件列表和对第二公共库进行静态语法分析生成的第二抽象语法树后,进入步骤S260,将得到的第一差异文件列表与第二抽象语法树进行匹配,得到第二公共库中被发生变动的源码所影响的类与方法的第一影响列表。具体地,将任一处差异源码所在的类的名称与第二抽象语法树中的各个节点中的类的名称进行对比,得到第二公共库中被该处差异源码所影响的类的名称。随后,检测该处差异源码在第二公共库中的行数是否包含在所得到的类中的若干方法所在的起始行与所述结束行之间。若是,则确定这些方法为该处差异源码所影响的方法,得到被该处差异源码所影响的方法的名称。根据第二公共库中被每处差异源码所影响的类的名称与方法的名称,生成第一影响列表。即,第一影响列表是由第二公共库中使用了其发生变动的源码的方法所生成的列表。也就是说,软件从参考版本升级为新版本时,公共库中的源码可能会发生变动,而第一影响列表则是公共库中使用了发生变动的源码的方法所生成的列表。其中,发生变动的源码包括在方法中修改的源码和在方法中增加的源码。
下面示出了一个将第一差异文件列表与第二抽象语法树进行匹配的具体实施例:
依次将第一差异文件列表中的每个节点处的类的名称与第二抽象语法树中的各个节点处的类的名称进行比对。
其中,当第一差异文件列表中某一节点B处的类的名称与第二抽象语法树中的一个节点b处的类的名称一致时,则确定第二抽象语法树中节点b处的类为被第一差异文件列表节点B处的差异源码所影响的类,即得到了被此处差异源码所影响的类的名称。
在得到了被节点B处的差异源码所影响的类的名称后,判断第一差异文件列表节点B处的差异源码在第二公共库中的行数是否有包含在节点b处的方法所在的起始行和结束行之间的。若有,则确定第二抽象语法树中节点b处的方法为被第一差异文件列表中节点B处的差异源码所影响的一个方法,即得到了被此处差异源码所影响的一个方法的名称。
若第一差异文件列表节点B处的差异源码在第二公共库中的行数没有包含在节点b处的方法所在的起始行和结束行之间的,或者说若第一差异文件列表节点B处的差异源码在第二公共库中的行数还存在未包含在节点b处的方法所在的起始行和结束行之间的,则继续将第一差异文件列表中节点B处的类的名称与第二抽象语法树中的下一个节点处的类的名称进行比对,若比对一致,则继续执行判断第一差异文件列表节点B处的差异源码在第二公共库中的行数是否有包含在该节点处的方法所在的起始行和结束行之间的以及后续的相应步骤,依次类推,直至第一差异文件列表中节点B处的差异源码在第二公共库中的行数已全部找到归属对象(即所存在的起始行与结束行),或者说第一差异文件列表节点B处的类的名称已与第二抽象语法树中的所有节点中的类的名称比对完毕。这样,便得到了第二公共库中被第一差异文件列表中节点B处的差异源码所影响的类的名称和所有方法的名称。
在将第一差异文件列表中每个节点处的类的名称与第二抽象语法树中的各个节点处的类的名称全部比对完毕后,便得到了第二公共库中所有被差异源码所影响的类的名称与方法的名称。随后,将第二公共库中被差异源码所影响的每个方法的名称以及其所在的类的名称作为一个节点,生成第一影响列表,即得到了第二公共库中被发生变动的源码所影响的类与方法的第一影响列表。如图8所示,其示出了第一影响列表的一个节点的示意图,其中受影响文件名与受影响完整类名相同。
至此,便得到了第二公共库中被发生变动的源码所影响的类与方法的第一影响列表,而在上述步骤S230中已得到了所有第一模块中目标模块中的各个方法对第一公共库中的各个方法的第二调用列表,因此,可以通过将第二调用列表与第一影响列表进行匹配,来获取所有第一模块中被发生变动的源码所影响的方法。
基于此,在得到第一影响列表后,进入步骤S270,将第二调用列表与第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。具体地,将任一目标模块中任一发起调用的方法所调用的类的名称与第一影响列表中的各个类的名称进行对比。若发起调用的方法所调用的类的名称与第一影响列表中的某一个类的名称相同,则将发起调用的方法所调用的方法的名称与第一影响列表中该类中的各个方法的名称进行对比。若发起调用的方法所调用的方法的名称与第一影响列表中该类中的某一方法的名称相同,则确定发起调用的方法为被发生变动的源码所影响的方法。根据各个目标模块中被发生变动的源码所影响的类的名称与方法的名称,生成第二影响列表。即,第二影响列表是由各个目标模块中被发生变动的源码所影响的方法所生成的列表。也就是说,第二影响列表是由软件中所有第一模块中被发生变动的源码所影响的方法生成的列表。
下面示出了一个将第二调用列表与第一影响列表进行匹配的具体实施例:
依次将第二调用列表中的每个节点处被调用的类的名称与第一影响列表中的各个节点处的类的名称进行比对。例如,将图6中所示的第二调用列表中节点处的被调用的类的名称classname与图8中所示的第一影响列表中节点处的类的名称className进行比对。
其中,当第二调用列表中某一节点C处被调用的类的名称与第一影响列表中的一个节点c处的类的名称一致时,则继续将第二调用列表中节点C处被调用的方法的名称与第一影响列表中节点c处的方法的名称进行比对。若节点C处被调用的方法的名称与节点c处的方法的名称也一致,则确定第二调用列表节点C处发起调用的方法为被第一影响列表中节点c处的方法所影响的一个方法,即得到了被节点c处的方法所影响的一个方法的名称以及该方法所在的类的名称。同样,以图6和图8中的节点为例,当图6中被调用的类的名称classname与图8中的类的名称className相同时,则继续将图6中所示的第二调用列表中节点处被调用的方法的名称methodname与图8中所示的第一影响列表中节点处的方法的名称funcName进行比对。若图6中被调用的方法的名称methodname与图8中的方法的名称funcName也相同,则确定图6中所示的第二调用列表中节点处的call_func为受图8中所示的第一影响列表中节点处的方法funcName所影响的一个方法,图6中所示的第二调用列表中节点处的call_classname为受图8中所示的第一影响列表中节点处的方法funcName所影响的方法call_func所在的类的名称。
若节点C处被调用的方法的名称与节点c处的方法的名称不一致,则继续将第二调用列表中节点C处被调用的类的名称与第一影响列表中的下一个节点处的类的名称进行比对,若一致,则继续将第二调用列表中节点C处的被调用的方法的名称与第一影响列表中该节点处的方法的名称进行比对,直至第二调用列表中节点C处被调用的方法的名称与第一影响列表中某一节点处的方法的名称相同,或者第二调用列表中节点C处被调用的类的名称已与第一影响列表中的所有节点处的类的名称比对完毕。这样,便确定出了第二调用列表中节点C处发起调用的方法是否受到了第一影响列表中各个方法的影响。即,确定出了第二调用列表中节点C处发起调用的方法是否受到了发生变动的源码的影响。
在将第二调用列表中的每个节点处被调用的类的名称与第一影响列表中的各个节点处的类的名称全部对比完毕后,便得到了第二调用列表中所有被第一影响列表中的各个方法所影响的方法的名称与类的名称,即得到了所有目标模块中被发生变动的源码所影响的所有方法的名称以及其所在的类的名称,进而根据被发生变动的源码所影响的所有方法的名称和类的名称,生成第二影响列表。根据本发明的一个实施例,还可以根据所影响的所有方法的名称和类的名称以及导致其受影响的发生变动的方法的名称和类的名称来生成第二影响列表,如图9所示,其示出了根据本发明一个实施例的第二影响列表的示意图。需要说明的是,对于具体采用哪种方式生成第二影响列表,本发明不作限制。在具体的实施例中,本领域的技术人员可以根据实际情况进行设定。
可见,本发明的软件中源码的定位方法,可以定位出所有目标模块中被发生变动的源码所影响的所有方法的名称以及其所在的类的名称。而上述已经指出发生变动的源码既包含增加的源码还包括修改的源码,因此对于公共库中在方法中新增的代码,本发明也能精准定位出其所影响的方法。另,在此说明一点,本发明的软件中源码的定位方法可以运用于Android操作系统,但并不限于此。
本发明还提供了一种软件中源码的定位装置。图10示出了根据本发明一个实施例的软件中源码的定位装置1000的结构框图,适于驻留在计算设备100中。其中,软件包括一个公共库和至少一个模块。如图10所示,该定位装置包括:
第一调用列表获取单元1100,适于依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取所有第一模块中的各个目标模块对第一公共库中的方法的第一调用列表,第一调用列表中的每个节点包括一个目标模块中一处发起调用的源码所在的类的存储路径、该处发起调用的源码在该目标模块中的行数以及其所调用的第一公共库中的类与方法的名称。
第一抽象语法树生成单元1200,适于对所有第一模块的源码进行静态语法分析,生成第一抽象语法树。
第二调用列表获取单元1300,适于将第一调用列表与第一抽象语法树进行匹配,获得各个目标模块对第一公共库中的方法的第二调用列表,第二调用列表中的每个节点包括一个目标模块中一个发起调用的方法的名称、该发起调用的方法所在的类的名称以及其所调用的类与方法的名称。
第一差异文件列表获取单元1400,适于当监测到新版本提交时,获取第一差异文件列表,第一差异文件列表中的每个节点包括一处差异源码所在的类的名称以及该处差异源码在新版本的第二公共库中的行数,一处差异源码为将第一公共库升级为第二公共库时一个类中发生变动的源码。
第二抽象语法树生成单元1500,适于对新版本软件中的第二公共库的源码进行静态语法分析,生成第二抽象语法树。
第一影响列表获取单元1600,适于将第一差异文件列表与第二抽象语法树进行匹配,得到第二公共库中被发生变动的源码所影响的类与方法的第一影响列表。
第二影响列表获取单元1700,适于将第二调用列表与第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。
根据本发明的软件中源码的定位装置1000,其具体细节已在基于图1至图9的描述中详细公开,在此不再赘述。
根据本发明的软件中源码的定位方法,首先基于Lint工具,获取参考版本软件中各个目标模块对第一公共库中的方法的第一调用列表,并对参考版本软件中的所有第一模块的源码进行静态语法分析,生成第一抽象语法树。然后,将第一调用列表和第一抽象语法树进行匹配,获得各个目标模块对第一公共库中的方法的第二调用列表。随后,当监测到新版本提交时,则获取新版软件中第二公共库与参考版本软件中第一公共库的差异文件列表,并对新版本软件中第二公共库的源码进行静态语法分析,生成第二抽象语法树。随之,则将差异文件列表和第二抽象语法树进行匹配,获得第二公共库中被发生变动的源码所影响的类与方法的第一影响列表。最后,将第二调用列表与第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。
可见,每监测到新版本软件提交,本发明则自动获取该软件的公共库中任一方法下发生变动的源码,并基于此自动地获取软件中各个模块下被改动的源码所影响的所有方法。因此,本发明既能自动精准地定位出公共库中修改的源码所影响的方法,还能精准定位出公共库中新增的源码所影响的方法,从而能精确推算出需进行测试的各个功能点,实现了精确化测试,大幅降低了回归测试的成本。同时,也降低了开发者的自测成本、多业务线间的沟通协调成本,从而大幅缩短了开发周期,为敏捷开发、快速迭代和试错带来了极大的便利。
另外,本发明是根据静态生成的抽象语法树和基于Lint工具生成的调用关系来获取软件中各个模块下被改动的源码所影响的方法,因此无代码植入,从而能够进一步提高定位的精准性,并且也不会对软件的性能和内存资源造成影响。
A8、如A1-A7中任一项所述的方法,其中,在依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取第一调用列表的步骤之前,还包括:将参考版本软件中第一公共库和所有第一模块的源码克隆至所述计算设备中。A9、如权利要求A8所述的方法,其中,所述将参考版本软件中第一公共库和所有第一模块的源码克隆至所述计算设备中的步骤,包括:获取参考版本软件的配置信息,所述配置信息包括参考版本软件的集成包的分支信息、所述集成包中的第一公共库的分支信息以及所述集成包中的第一模块的ID列表;根据所述集成包的分支信息以及所述第一公共库的分支信息,将所述第一公共库的源码克隆至所述计算设备中;根据所述第一模块的ID列表,将所有第一模块的源码克隆至所述计算设备中。
这里描述的各种技术可结合硬件或软件,或者它们的组合一起实现。从而,本发明的方法和设备,或者本发明的方法和设备的某些方面或部分可采取嵌入有形媒介,例如可移动硬盘、U盘、软盘、CD-ROM或者其它任意机器可读的存储介质中的程序代码(即指令)的形式,其中当程序被载入诸如计算机之类的机器,并被所述机器执行时,所述机器变成实践本发明的设备。
在程序代码在可编程计算机上执行的情况下,计算设备一般包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件),至少一个输入装置,和至少一个输出装置。其中,存储器被配置用于存储程序代码;处理器被配置用于根据该存储器中存储的所述程序代码中的指令,执行本发明的显示方法。
以示例而非限制的方式,可读介质包括可读存储介质和通信介质。可读存储介质存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息。通信介质一般以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其它数据,并且包括任何信息传递介质。以上的任一种的组合也包括在可读介质的范围之内。
在此处所提供的说明书中,算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与本发明的示例一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的,而非限制性的,本发明的范围由所附权利要求书限定。
Claims (10)
1.一种软件中源码的定位方法,适于在计算设备中执行,所述软件包括一个公共库和至少一个模块,所述方法包括:
依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取所有第一模块中的各个目标模块对所述第一公共库中的方法的第一调用列表,所述第一调用列表中的每个节点包括一个目标模块中一处发起调用的源码所在的类的存储路径、该处发起调用的源码在该目标模块中的行数以及其所调用的第一公共库中的类与方法的名称;
对所有第一模块的源码进行静态语法分析,生成第一抽象语法树;
将所述第一调用列表与所述第一抽象语法树进行匹配,获得各个目标模块对所述第一公共库中的方法的第二调用列表,所述第二调用列表中的每个节点包括一个目标模块中一个发起调用的方法的名称、该发起调用的方法所在的类的名称以及其所调用的类与方法的名称;
当监测到新版本提交时,获取第一差异文件列表,所述第一差异文件列表中的每个节点包括一处差异源码所在的类的名称以及该处差异源码在新版本的第二公共库中的行数,所述一处差异源码为将第一公共库升级为第二公共库时一个类中发生变动的源码;
对新版本软件中的第二公共库的源码进行静态语法分析,生成第二抽象语法树;
将所述第一差异文件列表与所述第二抽象语法树进行匹配,得到所述第二公共库中被发生变动的源码所影响的类与方法的第一影响列表;
将所述第二调用列表与所述第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。
2.如权利要求1所述的方法,其中,进行静态语法分析的步骤,包括:
对相应文件中的类进行解析,得到各个类的名称;
对相应文件中的方法进行解析,得到各个方法的名称以及各个方法在其相应文件中的起始行和结束行;
根据各个类的名称、各个方法的名称以及各个方法在相应文件中的起始行和结束行,生成相应的抽象语法树。
3.如权利要求2所述的方法,其中,将所述第一调用列表与所述第一抽象语法树进行匹配,获得第二调用列表的步骤,包括:
将任一处发起调用的源码所在的类的存储路径中的类的名称分别与所述第一抽象语法树中的各个节点中的类的名称进行比对,得到发起调用的类的名称;
检测发起调用的源码在目标模块中的行数是否包含在所得到的类中的某一方法所在的起始行与结束行之间;
若是,则确定该方法为发起调用的源码所在的方法,得到发起调用的方法的名称;
根据每个发起调用的方法的名称、每个发起调用的方法所在的类的名称以及每个发起调用的方法所调用的类与方法的名称,生成所述第二调用列表。
4.如权利要求1-3中任一项所述的方法,其中,所述获取第一差异文件列表的步骤,包括:
通过git diff获取新版本软件与初始版本软件的第二差异文件列表;
对所述第二差异文件列表进行去噪处理,得到所述第一差异文件列表。
5.如权利要求4所述的方法,其中,将所述第一差异文件列表与所述第二抽象语法树进行匹配,得到第一影响列表的步骤,包括:
将任一处差异源码所在的类的名称与所述第二抽象语法树中的各个节点中的类的名称进行对比,得到所述第二公共库中被差异源码所影响的类的名称;
检测差异源码在所述第二公共库中的行数是否包含在所得到的类中的若干方法所在的起始行与所述结束行之间;
若是,则确定该方法为差异源码所影响的方法,得到被差异源码所影响的方法的名称;
根据所述第二公共库中被每处差异源码所影响的类与方法的名称,生成所述第一影响列表。
6.如权利要求5所述的方法,其中,将所述第二调用列表与所述第一影响列表进行匹配,得到第二影响列表的步骤,包括:
将任一目标模块中任一发起调用的方法所调用的类的名称与所述第一影响列表中的各个类的名称进行对比;
若发起调用的方法所调用的类的名称与所述第一影响列表中的某一个类的名称相同,则将发起调用的方法所调用的方法的名称与所述第一影响列表中该类中的各个方法的名称进行对比;
若发起调用的方法所调用的方法的名称与所述第一影响列表中该类中的某一方法的名称相同,则确定发起调用的方法为被发生变动的源码所影响的方法;
根据各个目标模块中被发生变动的源码所影响的类与方法的名称,生成所述第二影响列表。
7.如权利要求1-6中任一项所述的方法,其中,所述参考版本软件为发布的第一个版本的软件。
8.一种软件中源码的定位装置,驻留在计算设备中,所述软件包括一个公共库和至少一个模块,所述装置包括:
第一调用列表获取单元,适于依据参考版本软件中第一公共库和所有第一模块的源码,基于Lint工具获取所有第一模块中的各个目标模块对所述第一公共库中的方法的第一调用列表,所述第一调用列表中的每个节点包括一个目标模块中一处发起调用的源码所在的类的存储路径、该处发起调用的源码在该目标模块中的行数以及其所调用的第一公共库中的类与方法的名称;
第一抽象语法树生成单元,适于对所有第一模块的源码进行静态语法分析,生成第一抽象语法树;
第二调用列表获取单元,适于将所述第一调用列表与所述第一抽象语法树进行匹配,获得各个目标模块对所述第一公共库中的方法的第二调用列表,所述第二调用列表中的每个节点包括一个目标模块中一个发起调用的方法的名称、该发起调用的方法所在的类的名称以及其所调用的类与方法的名称;
第一差异文件列表获取单元,适于当监测到新版本提交时,获取第一差异文件列表,所述第一差异文件列表中的每个节点包括一处差异源码所在的类的名称以及该处差异源码在新版本的第二公共库中的行数,所述一处差异源码为将第一公共库升级为第二公共库时一个类中发生变动的源码;
第二抽象语法树生成单元,适于对新版本软件中的第二公共库的源码进行静态语法分析,生成第二抽象语法树;
第一影响列表获取单元,适于将所述第一差异文件列表与所述第二抽象语法树进行匹配,得到所述第二公共库中被发生变动的源码所影响的类与方法的第一影响列表;
第二影响列表获取单元,适于将所述第二调用列表与所述第一影响列表进行匹配,得到各个目标模块中被发生变动的源码所影响的类与方法的第二影响列表。
9.一种计算设备,包括:
至少一个处理器;以及
存储器,存储有程序指令,其中,所述程序指令被配置为适于由所述至少一个处理器执行,所述程序指令包括用于执行如权利要求1-7中任一项所述方法的指令。
10.一种存储有程序指令的可读存储介质,当所述程序指令被计算设备读取并执行时,使得所述计算设备执行如权利要求1-7中任一项所述方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111414161.1A CN114168143B (zh) | 2021-11-25 | 2021-11-25 | 软件中源码的定位方法、装置、计算设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111414161.1A CN114168143B (zh) | 2021-11-25 | 2021-11-25 | 软件中源码的定位方法、装置、计算设备及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114168143A true CN114168143A (zh) | 2022-03-11 |
CN114168143B CN114168143B (zh) | 2024-08-13 |
Family
ID=80480911
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111414161.1A Active CN114168143B (zh) | 2021-11-25 | 2021-11-25 | 软件中源码的定位方法、装置、计算设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114168143B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107203468A (zh) * | 2017-04-19 | 2017-09-26 | 哈尔滨工程大学 | 一种基于ast的软件版本演化对比分析方法 |
CN111831564A (zh) * | 2020-07-09 | 2020-10-27 | 北京齐尔布莱特科技有限公司 | 一种回归测试方法、装置及计算设备 |
-
2021
- 2021-11-25 CN CN202111414161.1A patent/CN114168143B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107203468A (zh) * | 2017-04-19 | 2017-09-26 | 哈尔滨工程大学 | 一种基于ast的软件版本演化对比分析方法 |
CN111831564A (zh) * | 2020-07-09 | 2020-10-27 | 北京齐尔布莱特科技有限公司 | 一种回归测试方法、装置及计算设备 |
Non-Patent Citations (1)
Title |
---|
雷宇;黄松;于秀山;惠战伟;: "一种C代码软件设计信息提取方法研究", 南通大学学报(自然科学版), no. 04, 20 December 2016 (2016-12-20) * |
Also Published As
Publication number | Publication date |
---|---|
CN114168143B (zh) | 2024-08-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP7270764B2 (ja) | 人工知能チップ検証 | |
US9940225B2 (en) | Automated error checking system for a software application and method therefor | |
US9201632B2 (en) | Systems and methods for incremental software development | |
Zakharov et al. | Configurable toolset for static verification of operating systems kernel modules | |
JP5415557B2 (ja) | デバッギングのためのユーザ・スクリプト・コードの変換 | |
US10540262B2 (en) | Using edit and continue to dynamically set and unset optimizations in source code while debugging | |
JP2003029977A (ja) | コンピュータ装置、その例外処理プログラム及び変換プログラム、並びにコンパイル方法 | |
JP2009540464A (ja) | 反復的な静的および動的ソフトウェア分析 | |
US9336128B2 (en) | Method and system for code analysis using symbolic types | |
US9141351B2 (en) | Indicators for resources with idempotent close methods in software programs | |
US10229273B2 (en) | Identifying components for static analysis of software applications | |
US9405906B1 (en) | System and method for enhancing static analysis of software applications | |
US20070143093A1 (en) | System and method to simulate conditions and drive control-flow in software | |
US20190050209A1 (en) | Method and system to develop, deploy, test, and manage platform-independent software | |
CN113204385B (zh) | 一种插件加载方法、装置、计算设备及可读存储介质 | |
Sun et al. | {KSG}: Augmenting kernel fuzzing with system call specification generation | |
CN111176722A (zh) | 第三方库的文件版本检测方法、装置及存储介质 | |
CN111427771A (zh) | 一种代码覆盖率分析方法、设备、服务器及可读存储介质 | |
Copik et al. | Extracting clean performance models from tainted programs | |
CN111382077B (zh) | 应用程序崩溃原因定位方法、装置、电子设备及存储介质 | |
CN113238760B (zh) | 一种软件迁移方法、装置、计算设备及可读存储介质 | |
WO2022222378A1 (zh) | 一种内核裁剪方法及计算设备 | |
US9141343B2 (en) | Indicators for resources with close methods that do not complete erroneously in software programs | |
Ruprecht et al. | Automatic feature selection in large-scale system-software product lines | |
CN114168143B (zh) | 软件中源码的定位方法、装置、计算设备及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |