基于路径的代码变更分析方法、装置及设备
技术领域
本说明书涉及计算机技术领域,尤其涉及一种基于路径的代码变更分析方法、装置及设备。
背景技术
随着软件规模和复杂度的不断增加,特别是在大型软件项目中,业务和代码已经越来越复杂,代码动辄是数百万行,甚至是数千万行,通常需要多人协作开发,代码之间的相互影响盘根错节,这时代码的改动,将让代码变更分析、验证变得非常复杂,研发效率也低。
基于此,需要能够基于代码的变动来有效地对代码进行影响评估的方案。
发明内容
有鉴于此,本说明书实施例提供了一种基于路径的代码变更分析方法、装置及设备,用于根据变动来有效地对代码进行影响评估。
本说明书实施例采用下述技术方案:
本说明书实施例提供一种基于路径的代码变更分析方法,包括:
对代码进行监测;
当监测到所述代码存在变更时,分别获取根据变更前的代码生成的第一全量路径和根据变更后的代码生成的第二全量路径,所述全量路径包括至少一条路径,所述路径包括至少一个节点;
根据所述第一全量路径的节点和所述第二全量路径的节点确定存在变更影响的路径;
根据预设的路径影响策略推荐所述存在变更影响的路径对应的变更影响。
本说明书实施例还提供一种基于路径的代码变更分析装置,包括:监测模块、获取模块、确定模块和推荐模块;
所述监测模块用于对代码进行监测,并当监测到所述代码存在变更时调用所述获取模块;
所述获取模块用于分别获取根据变更前的代码生成的第一全量路径和根据变更后的代码生成的第二全量路径,所述全量路径包括至少一条路径,所述路径包括至少一个节点;
所述确定模块用于根据所述第一全量路径的节点和所述第二全量路径的节点确定存在变更影响的路径;
所述推荐模块用于根据预设的路径影响策略推荐所述存在变更影响的路径对应的变更影响。
本说明书实施例还提供一种基于路径的代码变更分析的电子设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
对代码进行监测;
当监测到所述代码存在变更时,分别获取根据变更前的代码生成的第一全量路径和根据变更后的代码生成的第二全量路径,所述全量路径包括至少一条路径,所述路径包括至少一个节点;
根据所述第一全量路径的节点和所述第二全量路径的节点确定存在变更影响的路径;
根据预设的路径影响策略推荐所述存在变更影响的路径对应的变更影响。
本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:通过对代码进行监测,并在监测到代码存在变更时进行全量路径分析,然后根据全量路径确定出代码变更所造成的存在变更影响的路径,进而根据存在变更影响的路径来推荐对应的变更影响,既可避免变更影响范围过于泛泛,得不到准确的变更影响,也可以避免代码变更分析中无历史痕迹,以便于开发人员根据变更影响进行分析、验证,提高开发效率。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本说明书实施例提供的一种基于路径的代码变更分析方法的流程图。
图2为本说明书实施例提供的一种基于路径的代码变更分析方法中用于根据代码生成全量路径的流程图。
图3为本说明书实施例提供的一种基于路径的代码变更分析装置的组成示意图。
具体实施方式
对代码变更进行影响分析,常见有:一是基于源码解析分析,比如通过AST(abstract syntax tree,抽象语法树)解析关联代码,进而分析源码调用关系,来针对代码中变更部分进行影响分析,但由于AST无法解析存在代码内部的类、模板、工厂方法、泛型等问题,对各种复杂设计模式的支持不好,容易出现无法分析或者分析结果不准确的情况;二是基于文件变动进行解析变更,但由于仅解析文件之间的调用关系,解析太粗泛,解析出来的数据也不准确。三是通过字节码进行分析,但由于字节码分析的粒度过细,对增、删、改等场景的支持不好,还有字节码对人类而言可读性太差,很容易造成遗漏。
为了更好地对复杂设计模式下代码变更所带来的影响进行分析,本说明书实施例提供一种基于路径的代码变更分析方法、装置及设备,可作为代码仓库中一种代码分析管理工具。具体地,通过全量路径分析来确定出存在变更影响的路径,进而根据变更影响的路径匹配出代码的变更所带来的影响,既可避免变更影响范围过于泛泛,得不到准确的变更影响,也可以避免代码变更分析中无历史痕迹,从而方便开发人员根据变更影响进行验证,提高开发效率。
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
以下结合附图,详细说明本申请各实施例提供的技术方案。
在本说明书实施例提供的基于路径的代码变更分析方法中,从设备角度而言,执行主体可为终端,其中终端可为服务器、计算机、平板电脑、智能移动设备等可进行代码分析功能的设备,本申请对此不做具体限定。
另外,本说明书实施例中提供的基于路径的代码变更分析方法,从程序实现的角度而言,执行主体可以为终端中安装的程序,该程序可以作为与代码分析有关的独立程序或者辅助程序,本申请对此不做具体限定。
下面以代码存放于代码仓库中,通过该程序实现代码变更分析为例进行说明,其中代码仓库可为集中式源代码管理系统。
如图1所示,本申请实施例提供的基于路径的代码变更分析方法包括以下步骤:
步骤S102、对代码进行监测。
本实施例中,代码可为代码仓库中一个业务项目中的完整代码,也可为该业务项目中功能独立的一部分代码。
可选地,在对代码进行监测时可通过对代码的提交请求进行监测来及时地对代码仓库中的代码提交情况进行监测,比如当接收到提交请求时,可对提交请求对应的代码进行监测,比如监测正在提交的代码在代码仓库中是否存在先前版本。
可选地,在存有海量业务项目以及这些业务项目对应的海量代码的代码仓库中,代码的提交可能存在高并发情况,这时为降低代码仓库在监测方面的开销,提高监测效率,在对代码进行监测时还可异步地对代码的提交记录进行监测,这样可在代码仓库资源空闲时段,异步地查询代码仓库中还未进行过变更分析、且存在至少两个提交记录的相应代码进行监测。
步骤S104、判断代码是否存在变更,当存在变更时执行步骤S106,否则执行步骤S102。
具体实施中,可通过判断代码是否存在新提交情况来判断代码是否存在变更,比如在接收到提交请求时,可在代码仓库中查询是否已存在对应的前一版本的代码,若是则代码存在变更,又比如异步对代码进行监测中,若发现代码存在至少两个提交记录,这时可查询该代码是否已进行过变更分析,若否则代码存在变更,需要分析。
步骤S106、分别获取根据变更前的代码生成的第一全量路径和根据变更后的代码生成的第二全量路径,所述全量路径包括至少一条路径,所述路径包括至少一个节点。
其中,变更后的代码为最新向代码仓库提交的代码,变更前的代码为所述变更后的代码在代码仓库中对应的上一次提交的代码;路径为代码中函数从执行入口到执行出口之中若干个节点构成的一条条完整的执行路径,全量路径为代码的所有路径,即全量路径为所有函数的路径的集合;节点为路径中的最小单元。
具体实施中,在根据代码生成全量路径时,可通过将人类可识别的源码与机器可读的字节码进行关联处理,并将业务逻辑代码提取出来形成代码块来建立起合适的节点粒度,然后针对代码块进行路径生成,让代码的增、删、改等更好地融入到路径的节点中,从而有效地兼顾分析的准确性和效率。具体地,如图2所示,根据代码生成全量路径可以下步骤包括:
步骤S202、将所述代码编译生成字节码,根据所述字节码识别所述代码中的业务逻辑代码。
通过将代码解析为字节码,使得人类可读的代码映射到机器可读的字节码中,从而便于机器快速地识别出经映射后的业务逻辑代码,即根据代码中的业务逻辑代码、系统代码和指令编码等代码的自身特点来识别处理业务逻辑代码。
步骤S204、将所述业务逻辑代码进行归并,生成业务逻辑代码块。
具体实施中,可根据业务执行逻辑将业务逻辑代码进行归并,进而通过归并来将代码中的业务逻辑代码提取并生成业务逻辑代码块,这样后续处理只需对业务逻辑代码块进行处理,有利于提高整体处理效率。
步骤S206、根据所述业务逻辑代码块中的执行路径生成所述代码对应的全量路径。
具体实施中,在步骤S206中可采用AST(抽象语法树)或者CFG(Control flowgraph,控制流图)分析方法来根据所述业务逻辑代码块中的执行路径生成出代码的全量路径,也可根据需要自定义的路径生成算法根据所述业务逻辑代码块中的执行路径生成出代码的全量路径,这里不再展开说明。
通过上述步骤S202~S206,通过将人类可读的代码解析为机器可读的字节码,进而将代码中的业务逻辑代码、系统代码和指令编码分别映射到字节码中,从而可从字节码中快速地识别出业务逻辑代码,然后将业务逻辑代码进行归并生成与业务逻辑处理有关的业务逻辑代码块,最后对业务逻辑代码块进行处理来生成代码对应的全量路径。一方面,通过将代码映射到字节码中,可快速地从字节码中获取出业务逻辑代码,另一方面还将获取的业务逻辑代码以代码块的形式进行路径处理,有效地提升处理效率和代码的全量路径变更匹配的可操作性,使得路径分析中节点的粒度既不过于宽泛,也不过于太细,有效支撑代码的变更路径匹配和推荐变更影响范围,从而能兼顾分析的准确性和效率。
需要说明的是,所述第一全量路径和所述第二全量路径可采用上述步骤S202~S206生成,即根据步骤S202~S206,第一全量路径根据变更前的代码生成,第二全量路径根据变更后的代码生成。
步骤S108、根据所述第一全量路径的节点和所述第二全量路径的节点确定存在变更影响的路径。
具体实施中,可通过遍历第一全量路径的节点和第二全量路径的节点来确定存在变更的节点,进而根据存在变更的节点所在的路径确定出存在变更影响的路径。
步骤S110、根据预设的路径影响策略推荐所述存在变更影响的路径对应的变更影响。
具体实施中,预设的路径影响策略可根据业务的重要性、业务逻辑代码的复杂度等因素来设定不同路径的变更影响,其中变更影响可以包括验证等级,便于开发人员根据推荐的变更影响进行验证。
通过上述步骤S102~S110,通过路径分析,并根据预设的路径影响来确定出变更路径的最终影响,既可避免变更影响范围过于泛泛,也可以避免代码变更分析中无历史痕迹,以便于开发人员根据变更影响进行分析、验证,提高开发效率。
基于同一个发明构思,本说明书实施例中提供一种基于路径的代码变更分析装置。
需要说明的是,鉴于前述实施例中对所述基于路径的代码变更分析方法已进行了详细说明,本实施例中对所述基于路径的代码变更分析装置所涉及的相应内容将不再赘述。
如图3所示,其中虚线方框表示可选的模块,所述基于路径的代码变更分析装置包括:监测模块10、获取模块20、确定模块30和推荐模块40。其中,监测模块10用于对代码进行监测,并当监测到所述代码存在变更时调用获取模块20;获取模块20用于分别获取根据变更前的代码生成的第一全量路径和根据变更后的代码生成的第二全量路径,所述全量路径包括至少一条路径,所述路径包括至少一个节点;确定模块30用于根据所述第一全量路径的节点和所述第二全量路径的节点确定存在变更影响的路径;推荐模块40用于根据预设的路径影响策略推荐所述存在变更影响的路径对应的变更影响。
可选地,所述基于路径的代码变更分析装置还包括编译模块50、归并模块60和路径生成模块70。其中,编译模块50用于将所述代码编译生成字节码,并从所述字节码中识别出所述代码中的业务逻辑代码;归并模块60用于将所述业务逻辑代码进行归并,生成业务逻辑代码块;路径生成模块70用于根据所述业务逻辑代码块中的执行路径生成所述代码对应的全量路径。
可选地,所述基于路径的代码变更分析装置还包括遍历模块80。其中遍历模块80用于遍历所述第一全量路径的节点和所述第二全量路径的节点确定存在变更的节点;确定模块30用于根据所述存在变更的节点确定出所述存在变更影响的路径。
可选地,监测模块10用于对代码的提交请求进行监测。更进一步,监测模块10用于异步对代码的提交请求进行监测。
基于同一个发明构思,本说明书实施例提供的基于路径的代码变更分析方法对应的基于路径的代码变更分析的电子设备,所述电子设备包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行以下步骤:
监测代码是否存在变更;
当监测到所述代码存在变更时,分别获取根据变更前的代码生成的第一全量路径和根据变更后的代码生成的第二全量路径,所述全量路径包括至少一条业务路径;
根据所述第一全量路径和所述第二全量路径确定出存在变更的业务路径;
根据所述存在变更的业务路径按照预设的业务影响策略确定所述变更后的代码对应的变更影响。
基于同样的思路,本说明书实施例提供的基于路径的代码变更分析方法对应的基于路径的代码变更分析的非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:
对代码进行监测;
当监测到所述代码存在变更时,分别获取根据变更前的代码生成的第一全量路径和根据变更后的代码生成的第二全量路径,所述全量路径包括至少一条路径,所述路径包括至少一个节点;
根据所述第一全量路径的节点和所述第二全量路径的节点确定存在变更影响的路径;
根据预设的路径影响策略推荐所述存在变更影响的路径对应的变更影响。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
在本说明书中的各个实施例,本领域的技术人员应该理解,所述的“第一”和“第二”不具有实际限定意义,只是为了便于区分,防止概念混淆。
本说明书实施例提供的装置、设备、非易失性计算机存储介质与方法是对应的,因此,装置、设备、非易失性计算机存储介质也具有与对应方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说明,因此,这里不再赘述对应装置、设备、非易失性计算机存储介质的有益技术效果。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。