CN108845843A - 一种函数处理方法、装置以及相关设备 - Google Patents
一种函数处理方法、装置以及相关设备 Download PDFInfo
- Publication number
- CN108845843A CN108845843A CN201810517954.8A CN201810517954A CN108845843A CN 108845843 A CN108845843 A CN 108845843A CN 201810517954 A CN201810517954 A CN 201810517954A CN 108845843 A CN108845843 A CN 108845843A
- Authority
- CN
- China
- Prior art keywords
- function
- functions
- program
- file
- version
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4482—Procedural
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例公开了一种函数处理方法、装置以及相关设备,所述方法包括:获取第一版本程序,并获取与第一版本程序相关联的第二版本程序;获取第一版本程序中所有函数对应的信息摘要值,并获取第二版本程序中所有函数对应的信息摘要值;在第一版本程序和第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;相同函数对中的第一版本程序的函数和第二版本程序的函数具有相同的信息摘要值;根据目标函数集合中各函数对应的信息摘要值,识别目标函数集合中各函数的变化类型;变化类型包括函数新增类型、函数删除类型和函数修改类型。采用本发明,可以降低计算耗时,提高检测变化函数的效率。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种函数处理方法、装置以及相关设备。
背景技术
随着软件规模的增长和开发人员的流动,软件维护变得越来越困难。为了保证数据不丢失,需要在海量存储阵列上建立多份目录的完全拷贝,磁盘空间容易被冗余的数据占据。版本控制系统就是用于记录一个或若干文件内容变化,以便将来查阅特定版本修订情况,版本控制系统可以帮助开发活动的多个参与者完成开发过程中的记录工作,利用版本控制系统,通过比较文件的变化,以及查询修改的内容,可以将当前文件回溯到之前的状态,甚至将整个项目都回退到过去的某个时间点,降低软件开发者对软件维护的工作量。
现有的版本控制系统的工作过程是:调用diff函数,该函数可以解析两个版本之间的具有差异的行,函数输出新版本中新增的行、新版本中修改的行、老版本中删除的行以及老版本中修改的行。根据得到的具有变化的行,在程序中反向查询对应的变化函数,进而获取到新版本和老版本之间新增函数、删除函数以及修改函数。
通过对比两个版本之间程序的所有行得到变化函数,计算量巨大、计算耗时长,直接导致检测变化函数的效率低下。
发明内容
本发明实施例提供一种函数处理方法、装置以及相关设备,可以降低计算耗时,提高检测变化函数的效率。
本发明一方面提供了一种函数处理方法,包括:
获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序;
获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值;
在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;所述相同函数对中的所述第一版本程序的函数和所述第二版本程序的函数具有相同的信息摘要值;
根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型;所述变化类型包括函数新增类型、函数删除类型和函数修改类型。
其中,所述第一版本程序的创建时间戳大于所述第二版本程序的创建时间戳;
所述获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值,包括:
分别拉取所述第一版本程序的多个第一文件概要信息,以及所述第二版本程序的多个第二文件概要信息;
将属于修改类型、新增类型的第一文件概要信息对应的第一文件,组合为第一文件集合;
将属于修改类型、删除类型的第二文件概要信息对应的第二文件,组合为第二文件集合;
分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值。
其中,所述分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值,包括:
对所述第一文件集合中所有函数进行编译处理和翻译处理,得到所述第一文件集合中所有函数的位置信息;
对所述第二文件集合中所有函数进行编译处理和翻译处理,得到所述第二文件集合中所有函数的位置信息;
根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值;
根据所述第二文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第二文件集合中各函数对应的信息摘要值。
其中,所述根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值,包括:
根据所述第一信息集合中的函数的位置信息中的函数起始坐标、函数结束坐标,查找所述函数所包含的内容字符串,并将所述内容字符串转换为内容字节码;
填充所述内容字节码,得到满足位长倍数条件的待计算内容字节码,并将所述待计算内容字节码划分为多个字节码小组;
获取多个链接变量,将所述多个链接变量和所述多个字节码小组分别进行非线性函数计算,得到多个分组散列值,并将所述多个分组散列值进行级联,得到所述函数对应的信息摘要值。
其中,所述目标函数集合包括第一目标函数子集合和第二目标函数子集合;
所述在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合,包括:
将在所述第一版本程序的函数和所述第二版本程序的函数中,具有相同的信息摘要值所对应的函数对,作为相同函数对;
将所述第一文件集合中不属于所述相同函数对的函数,作为所述第一目标函数子集合;
将所述第二文件集合中不属于所述相同函数对的函数,作为所述第二目标函数子集合。
其中,所述根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型,包括:
将属于所述第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型;
将属于所述第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型;
将既属于所述第一目标函数子集合也属于所述第二目标函数子集合的函数的变化类型,确定为函数修改类型。
其中,还包括:
根据所述第一文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第一版本控制表,并将所述第一版本控制表存储于版本控制数据库;其中所述版本控制数据库的主键包括函数名,所述版本控制数据库的所述主键对应的属性包括位置信息、函数内容和信息摘要值;
根据所述第二文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第二版本控制表,并将所述第二版本控制表存储于所述版本控制数据库。
本发明另一方面提供了一种函数处理装置,包括:
获取模块,用于获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序;
计算模块,用于获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值;
提取模块,用于在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;所述相同函数对中的所述第一版本程序的函数和所述第二版本程序的函数具有相同的信息摘要值;
识别模块,用于根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型;所述变化类型包括函数新增类型、函数删除类型和函数修改类型。
其中,所述第一版本程序的创建时间戳大于所述第二版本程序的创建时间戳;
所述计算模块,包括:
拉取单元,用于分别拉取所述第一版本程序的多个第一文件概要信息,以及所述第二版本程序的多个第二文件概要信息;
组合单元,用于将属于修改类型、新增类型的第一文件概要信息对应的第一文件,组合为第一文件集合;
所述组合单元,还用于将属于修改类型、删除类型的第二文件概要信息对应的第二文件,组合为第二文件集合;
计算单元,用于分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值。
其中,所述计算单元,包括:
编译子单元,用于对所述第一文件集合中所有函数进行编译处理和翻译处理,得到所述第一文件集合中所有函数的位置信息;
所述编译子单元,还用于对所述第二文件集合中所有函数进行编译处理和翻译处理,得到所述第二文件集合中所有函数的位置信息;
第一查找子单元,用于根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值;
第二查找子单元,用于根据所述第二文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第二文件集合中各函数对应的信息摘要值。
其中,所述第一查找子单元,包括:
转换子单元,用于根据所述第一信息集合中的函数的位置信息中的函数起始坐标、函数结束坐标,查找所述函数所包含的内容字符串,并将所述内容字符串转换为内容字节码;
所述转换子单元,还用于填充所述内容字节码,得到满足位长倍数条件的待计算内容字节码,并将所述待计算内容字节码划分为多个字节码小组;
计算子单元,用于获取多个链接变量,将所述多个链接变量和所述多个字节码小组分别进行非线性函数计算,得到多个分组散列值,并将所述多个分组散列值进行级联,得到所述函数对应的信息摘要值。
其中,所述目标函数集合包括第一目标函数子集合和第二目标函数子集合;
所述提取模块,包括:
提取单元,用于将在所述第一版本程序的函数和所述第二版本程序的函数中,具有相同的信息摘要值所对应的函数对,作为相同函数对;
第一确定单元,用于将所述第一文件集合中不属于所述相同函数对的函数,作为所述第一目标函数子集合;
所述第一确定单元,还用于将所述第二文件集合中不属于所述相同函数对的函数,作为所述第二目标函数子集合。
其中,所述识别模块,包括:
第二确定单元,用于将属于所述第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型;
所述第二确定单元,还用于将属于所述第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型;
第三确定单元,用于将既属于所述第一目标函数子集合也属于所述第二目标函数子集合的函数的变化类型,确定为函数修改类型。
其中,还包括:
构建模块,用于根据所述第一文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第一版本控制表,并将所述第一版本控制表存储于版本控制数据库;其中所述版本控制数据库的主键包括函数名,所述版本控制数据库的所述主键对应的属性包括位置信息、函数内容和信息摘要值;
所述构建模块,还用于根据所述第二文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第二版本控制表,并将所述第二版本控制表存储于所述版本控制数据库。
本发明另一方面提供了一种电子设备,包括:处理器和存储器;
所述处理器和存储器相连,其中,所述存储器用于存储程序代码,所述处理器用于调用所述程序代码,以执行如本发明实施例中一方面中的方法。
本发明实施例另一方面提供了一种计算机存储介质,所述计算机存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时,执行如本发明实施例中一方面中的方法。
本发明实施例通过获取第一版本程序,并获取与第一版本程序相关联的第二版本程序;获取第一版本程序中所有函数对应的信息摘要值,并获取第二版本程序中所有函数对应的信息摘要值;在第一版本程序和第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;相同函数对中的第一版本程序的函数和第二版本程序的函数具有相同的信息摘要值;根据目标函数集合中各函数对应的信息摘要值,识别目标函数集合中各函数的变化类型。上述可知,以函数为单位,分别计算每个函数唯一对应的信息摘要值,根据该信息摘要值提取不变的函数,再将不变的函数剔除得到发生变化的函数,进而识别发生变化的函数的变化类型。相对现有的行处理,对函数进行解析可以降低计算量,提高识别函数变化类型的效率;利用函数独一无二的信息摘要值,可以提升识别的准确率。进一步地,即使两个版本程序之间函数差异很大,通过函数的信息摘要值识别函数的变化类型也具有较低的计算量。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1a-图1e是本发明实施例提供的一种函数处理方法的场景示意图;
图2a是本发明实施例提供的一种函数处理方法的流程示意图;
图2b是本发明实施例提供的另一种函数处理方法的流程示意图;
图2c是本发明实施例提供的一种主处理流程的流程示意图;
图3a是本发明实施例提供的另一种函数处理方法的流程示意图;
图3b是本发明实施例提供的另一种函数处理方法的场景示意图;
图4是本发明实施例提供的一种函数处理方法的类结构图;
图5是本发明实施例提供的一种函数处理装置的结构示意图;
图6是本发明实施例提供的一种电子设备的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参见图1a—图1e,是本发明实施例提供的一种函数处理方法的场景示意图。如图1a所示,开发人员在开发移动终端中的应用过程中,记录了4个版本的应用程序,且版本1、版本2、版本3、版本4是按照时间戳从早到晚记录的。4个版本中文件的文件概要信息如下:对文件A1来说,在版本1创建,在版本3被修改,并被重命名为A2;对文件B1来说,在版本1创建,在版本2被修改,修改后重名为B2,在版本4再被修改,再被重命名为B3;对文件C1来说,在版本3创建,在版本4被修改,修改后重命名为C2。如图1b所示,综上,在版本1中包括文件A1和文件B1;在版本2中包括文件A1和文件B2;在版本3中包括文件A2、文件B2、C1;在版本4中包括文件A2、文件B3、C2。为了对比任意两个版本的文件中函数的变化类型,接下来以版本1和版本3为例进行说明(版本3的创建时间晚于版本1的创建时间),其余任意两个版本中函数的变化类型,都可以采用相似的识别方法,其中变化类型包括函数新增类型、函数删除类型和函数修改类型,当然函数新增类型是新版本(即版本3)中函数才可以具有的变化类型,函数删除类型是老版本(即版本1)中函数才可以具有的变化类型,函数修改类型是新版本(即版本3)和老版本(即版本1)中函数都可以具有的变化类型。拉取版本1和版本3中文件的文件概要信息,确定在版本1中发生变化的文件是文件A1和文件B1;在版本3中发生变化的文件是文件A2和文件B2,新增的文件是文件C1。如图1c所示,将版本1中文件A1和文件B1中的所有函数组合为函数集合10a(即是将老版本中的函数组合为函数集合10a),函数集合10a中包括:函数1、函数2和函数3,同样将版本3中文件A2、文件B2、文件C1中的所有函数组合为函数集合10b(即是将新版本中的函数组合为函数集合10b),且函数集合10b中包括:函数1、函数2和函数4。对函数集合10a来说,首先确定函数1、函数2和函数3的位置信息(位置信息是指函数在整个版本程序中的起始行和结束行),进而分别计算函数1所包含的字符串的md5值(Message-Digest Algorithm 5,信息-摘要算法第5版)、函数2所包含的字符串的md5值、函数3所包含的字符串的md5值。对函数集合10b来说,也是首先确定函数1、函数2和函数4的位置信息,再计算函数1所包含的字符串的md5值、函数2所包含的字符串的md5值、函数4所包含的字符串的md5值。将在函数集合10a和函数集合10b中具有相同md5值的函数提取出来,即在两个函数集合中都将函数2提取出来,也就是说函数2从版本1到版本3都没有发生变化,也可以是说函数2的类型为固定类型。对函数集合10a来说,剔除函数2后,剩余函数组合为函数集合10c,即函数集合10c中包括:函数1和函数3;对函数集合10b来说,剔除函数2后,剩余函数组合为函数集合10d,即函数集合10d中包括:函数1和函数4。计算函数集合10c和函数集合10d之间的交集和差集,用于识别函数1、函数3和函数4的变化类型。如图1e所示,函数集合10c和函数集合10d的交集包括函数1,因此函数1的变化类型为函数修改类型,即是从版本1到版本3函数1是被修改的函数。函数集合10c与函数集合10d的差集包括函数3,即是函数3属于函数集合10c但不属于函数集合10d,因此函数3的变化类型为函数删除类型,即是从版本1到版本3函数3是被删除的函数。函数集合10d与函数集合10c的差集包括函数4,即是函数4属于函数集合10d但不属于函数集合10c,因此函数4的变化类型为函数新增类型,即是从版本1到版本3函数4是被新增的函数。综上所述,属于函数修改类型的函数是函数1、属于函数删除类型的函数是函数3、属于函数新增类型的函数是函数4。
通过分别计算两个版本中各函数对应的md5值,将两个版本中具有相同md5值的函数剔除,剩余的函数再组合为函数集合,计算两个函数集合的交集和差集,即可以得到两个版本中函数的变化类型,相对行处理,对函数整体进行解析可以降低计算量,且利用每个函数唯一的md5值可以提高识别函数的变化类型的准确率。
其中,计算信息摘要值(如上述实施例中的md5值)、识别各函数的变化类型的具体过程可以参见以下图2a至图4所对应的实施例。
进一步地,请参见图2a,是本发明实施例提供的一种函数处理方法的流程示意图。如图2a所示,所述函数处理方法可以包括:
步骤S101,获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序。
具体的,移动终端获取待检测函数所涉及的两个版本程序,分别称为第一版本程序和第二版本程序,其中版本程序是开发软件过程中记录的不同时期的程序代码,例如,可以是关于应用的版本程序,也可以是关于操作系统的版本程序等,第一版本程序和第二版本程序就是开发同一个软件过程中记录的不同时期的版本程序。为了方便后续对两个版本程序中函数的识别,可以将创建时间戳较大的版本程序作为第一版本程序,对应地,将创建时间戳较小的版本程序作为第二版本程序,换句话说,第一版本程序是新版本程序,第二版本程序是老版本程序。
步骤S102,获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值。
具体的,使用SVN(Subversion,版本控制系统)分别拉取第一版本程序中多个文件的文件概要信息,和拉取第二版本程序中多个文件的文件概要信息,其中第一版本程序中的文件称为第一文件,第一文件的文件概要信息称为第一文件概要信息;第二版本程序中的文件称为第二文件,第二文件的文件概要信息称为第二文件概要信息,即是拉取第一版本程序的多个第一文件的第一文件概要信息,和拉取第二版本程序的多个第二文件的第二文件概要信息。文件概要信息记录了两个版本之间文件的变化情况,文件概要信息包括:文件的名称、文件路径、文件对应的属性类型,属性类型包括:修改类型、新增类型和删除类型,当然新增类型只有第一版本程序(新版本程序)中的文件才可能具有的属性类型,删除类型只有第二版本程序(老版本程序)中的文件才可能具有的属性类型。将属于修改类型和新增类型的第一文件概要信息所对应的第一文件,组合为第一文件集合;同样将属于修改类型和删除类型的第二文件概要信息所对应的第二文件,组合为第二文件集合,其中上述获取到的第一文件集合和第二文件集合中的文件后缀名可以是.m或者是.mm。利用SVN拉取版本程序中文件的文件概要信息,可以只提取两个版本中发生变化了的文件,对于那些没有发生变化的文件可以忽略不计,进而降低后续识别函数的计算量。基于md算法(Message-Digest Algorithm,信息-摘要算法),计算提取出来的第一文件集合中所有函数的信息摘要值和提取出来的第二文件集合中所有函数的信息摘要值。
下面以md5算法(Message-Digest Algorithm 5,信息-摘要算法第5版)为例,计算第一文件集合中一个函数的md5值作为信息摘要值,当然也可以基于md4算法、md3算法、md2算法或md1算法计算每个函数对应的md4值、md3值、md2值、md1值,并将计算出来的值作为信息摘要值。为了计算函数的md5值(信息摘要值),首先要确定函数在第一文件集合中的位置信息,进而根据该位置信息提取该函数所包含字符串,称为内容字符串,其中位置信息可以包括:函数起始坐标、函数体起始坐标、函数结束坐标,函数起始坐标可以是函数名首字母所在的坐标,函数体起始坐标可以是起始大括号所在的坐标,函数结束坐标可以是函数结束大括号所在的坐标,且函数起始坐标是根据函数体起始坐标计算而来的,也就是说首先确定函数体起始坐标,然后再确定函数起始坐标。将提取出来的内容字符串转换为二进制字节码称为内容字节码,填充该内容字节码,即是在内容字节码后面添加数值0,直至填充后的内容字节码的位长满足位长倍数条件,该位长倍数条件即是内容字节码的位长对512求余的结果等于448,满足位长倍数条件的内容字节码称为待计算内容字节码,可以确定是,待计算内容字节码的位长满足:N*512+448,其中N为非负整数。将待计算内容字节码划分为等长的16个小组,每个小组称为字节码小组。初始化4个链接变量(A、B、C、D),A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210(上述4个链接变量是以大端字节序来表示),主循环有4轮,对每一轮循环都是进行16次操作,每次操作对A、B、C、D中的其中3链接变量个做一个非线性函数运算,然后将所得到的结果加上第四个变量。再将所得结果向左环移一个不定的数,并加上A、B、C或D中之一,最后用该结果取代A、B、C或D中之一。每一轮循环中利用的非线性函数为公式(1)—公式(4),一轮循环使用一个非线性函数:
F(X,Y,Z)=(X&Y)|((~X)&Z) (1)
G(X,Y,Z)=(X&Z)|(Y&(~Z)) (2)
H(X,Y,Z)=X^Y^Z (3)
I(X,Y,Z)=Y^(X|(~Z)) (4)
其中,&是与(And)运算,|是或(Or)运算,~是非(Not)运算,^是异或(Xor)运算。
对每一轮循环来说,假设Mj表示该函数的第j个字节码小组(一共有16个),ti和s为常数,上述4个非线性函数的公式可以依次转换为公式(5)—公式(8):
FF(A,B,C,D,Mj,s,ti)→A=B+((A+F(B,C,D)+Mj+ti)<<s) (5)
GG(A,B,C,D,Mj,s,ti)→A=B+((A+G(B,C,D)+Mj+ti)<<s) (6)
HH(A,B,C,D,Mj,s,ti)→A=B+((A+H(B,C,D)+Mj+ti)<<s) (7)
II(A,B,C,D,Mj,s,ti)→A=B+((A+I(B,C,D)+Mj+ti)<<s) (8)
对每轮循环完毕后都可以得到一个散列值,称之为分组散列值,该分组散列值的位长等于32位。4轮循环完毕后(即执行64次操作),可以得到4个32位的分组散列值,直接将上述4个分组散列值进行级联(例如,4个分组散列值分别为:603F52D8、44017E83、CA267751、FEE5B61B,级联上述4个分组散列值得到md5值:603F52D844017E83CA267751FEE5B61B),得到的散列值即是该函数对应的md5值。采用上述方法,可以分别获取第一文件集合中所有函数的位置信息,进而计算各函数对应的md5值(信息摘要值)、获取第二文件集合中所有函数的位置信息,进而计算各函数对应的md5值(信息摘要值)。
获取第一版本程序中一个函数的位置信息的具体过程为:首先对该函数进行预处理,并在预处理后生成该函数对应的抽象语法树(Abstract Syntax Tree,AST),预处理可以包括预编译过程以及翻译过程。生成该函数对应的AST后,再对该AST进行编译可以获取到上述函数的位置信息。位置信息可以表示为:AccountRelatedSettingDate::setIn1t1a1pushSetting|56:1,138:1|57:1,138:1,其中AccountRelatedSettingDate表示类名、setIn1t1a1pushSetting表示方法名(类名+方法名即对应一个函数)、56:1表示函数的开始行和列、138:1表示函数的结束行和列、57:1表示函数体(即是起始大括号)的开始行和列、138:1表示函数的结束行和列。对函数进行预处理的前提条件是该函数与第一版本程序已经建立链接关系(此处是以第一版本程序中的函数为例计算md5值,若是计算第二版本程序中的函数的md5值,那么对应将函数与第二版本程序建立链接关系),建立链接关系的过程是:首先创建一个前端进程,该前端进程优选为对第一版本程序进行输入的接口,通过该前端进程将第一版本程序进行输入,前端进程获取到第一版本程序后,与该第一版本程序中的函数建立链接关系。例如:可以调用Clang工具建立一个前端进程,Clang是一个C语言、C++、Objective-C、Objective-C++语言的轻量级编译器,并通过Clang工具建立第一版本程序和函数之间的链接关系。采用上述方法,可以分别获取第一文件集合中的所有函数的位置信息和第二文件集合中的所有函数的位置信息。
步骤S103,在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合。
具体的,获取相同函数对,其中相同函数对中的一个函数属于第一版本程序另一个函数属于第二版本程序,且上述两个函数的信息摘要值相同。由于每个函数的信息摘要值都是唯一的,因此若两个函数具有相同的信息摘要值,说明两个函数不论是函数名还是函数体完全一样,也说明相同函数对中的函数是从第二版本程序至第一版本程序都没有发生任何变化的函数。将在第一版本程序和第二版本程序中除相同函数对以外的函数,组合为目标函数集合,换句话说,目标函数集合中的函数的信息摘要值都各不相同。
步骤S104,根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型。
具体的,变化类型包括函数新增类型、函数删除类型和函数修改类型。若目标函数集合中的函数既属于第一版本程序也属于第二版本程序,那么说明该函数的变化类型属于函数修改类型,即是该函数在两个版本程序中都存在,但对应的信息摘要值不同,说明该函数被修改,因此属于函数修改类型;若目标函数集合中的函数属于第一版本程序但不属于第二版本程序,那么说明该函数的变化类型属于函数新增类型,即是该函数存在于新版本中但不在老版本中,说明该函数是新增的,因此属于函数新增类型;若目标函数集合中的函数属于第二版本程序但不属于第一版本程序,那么说明该函数的变化类型属于函数删除类型,即是该函数存在于老版本中但不在新版本中,说明该函数是被删除的,因此属于函数删除类型。
可选的,识别目标函数集合中所有函数的变化类型后,为了方便比较两个版本程序中函数的差异以及避免后续识别其它版本程序中函数变化类型所涉及的重复计算,可以根据第一文件集合中所有函数的函数名、函数的位置信息、函数内容、函数对应的信息摘要值之间的对应关系,构建数据库表,该数据库表称为第一版本控制表,并将该第一版本控制表存储于版本控制数据库中。第一版本控制表的主键可以是函数名,属性可以是函数的位置信息、函数内容、信息摘要值。对应地,可以根据第二文件集合中所有函数的函数名、函数的位置信息、函数内容、函数对应的信息摘要值之间的对应关系,构建数据库表,该数据库表称为第二版本控制表,并将该第二版本控制表也存储于版本控制数据库中。第二版本控制表的主键可以是函数名,属性可以是函数的位置信息、函数内容、信息摘要值。
请参见图2b,是本发明实施例提供的另一种函数处理方法的流程示意图。该方法包括:
步骤S201,开始识别版本程序中函数的变化类型。
步骤S202,快速网关(Fast Common Gate Interface,FCGI)入口接收用户请求,并拉取待检测的版本程序。
步骤S203,获取与安卓操作系统相关的版本程序。
步骤S204,获取安卓分享文件版本程序。
步骤S203,获取苹果操作系统相关的版本程序。
上述步骤S203-步骤S205表示可以识别安卓操作系统版本程序中各函数的变化类型,也可以识别安卓分享文件版本程序中各函数的变化类型,还可以识别苹果操作系统版本程序中各函数的变化类型。
步骤S206,检测获取到的版本程序是否为全量版本程序,与全量版本程序对应的是增量版本程序。其中全量版本程序是软件开发人员开发软件过程中第一次记录的程序,增量版本程序是软件开发人员开发同一个软件过程中除第一次以外记录的程序,例如,对相机应用的开发,原始版本1.0中的程序即是全量版本程序,后续版本1.1、或1.2中的程序是增量版本程序。若检测结果为:是即是全量版本程序,则执行步骤S209-步骤S211;若检测结果为:否,即是增量版本程序,则执行步骤S207-步骤S208以及步骤S210-步骤S211。
步骤S207,若获取的版本程序是增量版本程序,则拉取待检测版本程序的文件概要信息,文件概要信息记录了两个版本之间文件的变化情况,文件概要信息包括:文件的名称、文件路径、文件对应的属性类型,属性类型包括:修改类型、新增类型和删除类型。
步骤S208,将增量版本程序中的所有文件都检出。
步骤S209,若获取的版本程序是全量版本程序,则将全量版本程序中的所有文件都检出。
步骤S210,对获取到的文件执行主处理流程,识别文件中函数的变化类型。
步骤S211,结束识别版本程序中函数的变化类型。
请一并参见图2c,是本发明实施例提供的一种主处理流程的流程示意图,主处理流程的具体过程包括步骤S2101-步骤S2110,且步骤S2101-步骤S2110是图2b所对应实施例中步骤S210的一个具体实施例。
步骤S2101,开始执行主处理流程。
步骤S2102,根据文件概要信息,拉取新版本程序(第一版本程序)中属于修改类型的文件、新版本程序中属于新增类型的文件、老版本程序(第二版本程序)中属于修改类型的文件、老版本程序中属于删除类型的文件。
步骤S2103,将新版本程序中属于修改类型的文件、新版本程序中属于新增类型的文件组合为第一文件集合。
步骤S2104,获取第一文件集合中各函数的位置信息,其中位置信息包括:函数起始坐标、函数体起始坐标、函数结束坐标,函数起始坐标可以是函数名首字母所在的坐标,函数体起始坐标可以是起始大括号所在的坐标,函数结束坐标可以是函数结束大括号所在的坐标。
步骤S2105,根据第一文件集合中各函数的位置信息,确定各函数所包含的字符串,并根据字符串计算各函数对应的信息摘要值。
步骤S2106,将老版本程序中属于修改类型的文件、老版本程序中属于删除类型的文件组合为第二文件集合。
步骤S2107,获取第二文件集合中各函数的位置信息,其中位置信息包括:函数起始坐标、函数体起始坐标、函数结束坐标。
步骤S2108,根据第二文件集合中各函数的位置信息,确定各函数所包含的字符串,并根据字符串计算各函数对应的信息摘要值,计算信息摘要值的具体过程可以参见上述图2a所对应实施例中的步骤S102。
步骤S2109,将第一文件集合和第二文件集合中,具有相同信息摘要值的函数对作为相同函数对,将第一文件集合中除相同函数对以外的函数组合为第一目标函数子集合,将第二文件集合中除相同函数对以外的函数组合为第二目标函数子集合。将属于第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型;将属于第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型;将既属于第一目标函数子集合也属于第二目标函数子集合的函数的变化类型,确定为函数修改类型。
步骤S2110,结束识别版本程序中函数的变化类型。
本发明实施例通过获取第一版本程序,并获取与第一版本程序相关联的第二版本程序;获取第一版本程序中所有函数对应的信息摘要值,并获取第二版本程序中所有函数对应的信息摘要值;在第一版本程序和第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;相同函数对中的第一版本程序的函数和第二版本程序的函数具有相同的信息摘要值;根据目标函数集合中各函数对应的信息摘要值,识别目标函数集合中各函数的变化类型。上述可知,以函数为单位,将版本程序划分为多个块,计算每个函数唯一对应的信息摘要值,根据该信息摘要值提取不变的函数,将不变的函数剔除得到发生变化的函数,进而识别发生变化的函数的变化类型。相对现有的行处理,对函数进行解析可以降低计算量,提高识别函数变化类型的效率;利用函数独一无二的信息摘要值,可以提升识别的准确率。进一步地,即使两个版本程序之间差异很大,通过函数的信息摘要值识别变化类型也具有较低的计算量。
请参见图3a,是本发明实施例提供的另一种函数处理方法的流程示意图。函数处理方法包括:
步骤S301,获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序。
步骤S302,获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值。
其中,步骤S301-步骤S302的具体实现方式可以参见上述图2a所对应实施例中的步骤S101-步骤S102,此处不再赘述。
步骤S303,将在所述第一版本程序的函数和所述第二版本程序的函数中,具有相同的信息摘要值所对应的函数对,作为相同函数对。
具体的,将一个函数属于第一版本程序另一个函数属于第二版本程序,且两个函数对应的信息摘要值相同的函数对,作为相同函数对。也就是,相同函数对中的两个函数不论是函数名或者函数内容均完全一致,只是两个函数一个属于第一版本程序另一个属于第二版本程序。
步骤S304,将所述第一文件集合中不属于所述相同函数对的函数,作为所述第一目标函数子集合。
具体的,将第一文件集合中不属于相同函数对的函数所组成的集合,称之为第一目标函数子集合。例如,第一文件集合中包括:函数1、函数2、函数3和函数4,而函数1是相同函数对中的函数,因此第一目标函数子集合包括:函数2、函数3和函数4。
步骤S305,将所述第二文件集合中不属于所述相同函数对的函数,作为所述第二目标函数子集合。
具体的,将第二文件集合中除相同函数对以外的函数所组成的集合,称之为第二目标函数子集合。例如,第二文件集合中包括:函数A、函数B、函数C和函数D,而函数C是相同函数对中的函数,函数D也是相同函数对中的函数,因此第二目标函数子集合包括:函数A、函数B。将步骤S304得到的第一目标函数子集合和步骤S305得到的第二目标函数子集合均作为目标函数集合。
步骤S306,将属于所述第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型。
具体的,计算第一目标函数子集合和第二目标函数子集合的差集,将上述差集中所包括的函数的变化类型确定为函数新增类型,也即是函数新增类型的函数是属于第一目标函数子集合但不属于第二目标函数子集合,换句话说函数新增类型的函数属于新版本程序但不属于老版本程序。
步骤S307,将属于所述第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型。
具体的,计算第二目标函数子集合和第一目标函数子集合的差集,将上述差集中所包括的函数的变化类型确定为函数删除类型,也即是函数删除类型的函数是属于第二目标函数子集合但不属于第一目标函数子集合,换句话说函数删除类型的函数属于老版本程序但不属于新版本程序。
步骤S308,将既属于所述第一目标函数子集合也属于所述第二目标函数子集合的函数的变化类型,确定为函数修改类型。
具体的,计算第一目标函数子集合和第二目标函数子集合的交集,将上述交集中所包括的函数的变化类型确定为函数修改类型,也即是函数新增类型的函数是既属于第一目标函数子集合也属于第二目标函数子集合,换句话说函数修改类型的函数既属于老版本程序又属于新版本程序。
举例来说,请参见图3b,是本发明实施例提供的另一种函数处理方法的场景示意图。第一文件集合20a中包括:函数A、函数B和函数C,第二文件集合20b包括:函数A、函数B和函数D。在第一文件集合的所有函数中和第二文件集合的所有函数中,具有相同信息摘要值的函数对中的函数是函数B,即是在第一文件集合中函数B对应的信息摘要值是B6CE42,在第二文件集合中函数B对应的信息摘要值也是B6CE42。将第一文件集合中除了函数B以外的函数组合为第一目标函数子集合20c,即是第一目标函数子集合20c中包括:函数A和函数C;同理,将第二文件集合中除了函数B以外的函数组合为第二目标函数子集合20d,即是第二目标函数子集合20d中包括:函数A和函数D。计算第一目标函数子集合20c和第二目标函数子集合20d的交集,该交集所包括的函数,即是函数A的变化类型为函数修改类型,换言之,函数A既属于第一目标函数子集合20c也属于第二目标函数子集合20d,因此函数A的变化类型为函数修改类型。计算第一目标函数子集合20c和第二目标函数子集合20d的差集,该差集所包括的函数,即是函数C的变化类型为函数新增类型,换言之,函数C属于第一目标函数子集合20c但不属于第二目标函数子集合20d,因此函数C的变化类型为函数新增类型。计算第二目标函数子集合20d和第一目标函数子集合20c的差集,该差集所包括的函数,即是函数D的变化类型为函数删除类型,换言之,函数D属于第二目标函数子集合20d但不属于第一目标函数子集合20c,因此函数D的变化类型为函数删除类型。
请参见图4,是本发明实施例提供的一种函数处理方法的类结构图。对象(Object)包括:文件对象(FileObj)、差异对比对象(OCDiffObj)、OC文件解析对象(OCFileParserAll)、版本控制客户端对象(SvnClient)、文件解析对象(OCFileParser),每个对象包括一个或多个构造函数以及一个或多个方法。其中,版本控制客户端对象(SvnClient)提供的功能为:获取待检测的新版本程序和老版本程序(即是本发明所涉及的第一版本程序和第二版本程序);文件解析对象(OCFileParser)提供的功能为:拉取新版本程序中文件的文件概要信息和拉取老版本程序中文件的文件概要信息,以及根据拉取的文件概要信息获取文件;OC文件解析对象(OCFileParserAll)提供的功能为:编译和翻译文件中的函数,确定各函数的位置信息;文件对象(FileObj)提供的功能为:计算各函数的信息摘要值;差异对比对象(OCDiffObj)提供的功能为:根据各函数的信息摘要值,识别各函数的变化类型。
本发明实施例通过获取第一版本程序,并获取与第一版本程序相关联的第二版本程序;获取第一版本程序中所有函数对应的信息摘要值,并获取第二版本程序中所有函数对应的信息摘要值;在第一版本程序和第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;相同函数对中的第一版本程序的函数和第二版本程序的函数具有相同的信息摘要值;根据目标函数集合中各函数对应的信息摘要值,识别目标函数集合中各函数的变化类型。上述可知,以函数为单位,将版本程序划分为多个块,计算每个函数唯一对应的信息摘要值,根据该信息摘要值提取不变的函数,将不变的函数剔除得到发生变化的函数,进而识别发生变化的函数的变化类型。相对现有的行处理,对函数进行解析可以降低计算量,提高识别函数变化类型的效率;利用函数独一无二的信息摘要值,可以提升识别的准确率。进一步地,即使两个版本程序之间差异很大,通过函数的信息摘要值识别变化类型也具有较低的计算量。
进一步的,请参见图5,是本发明实施例提供的一种函数处理装置的结构示意图。如图5所示,函数处理装置1可以包括:获取模块11、计算模块12、提取模块13、识别模块14;
获取模块,用于获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序;
计算模块,用于获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值;
提取模块,用于在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;所述相同函数对中的所述第一版本程序的函数和所述第二版本程序的函数具有相同的信息摘要值;
识别模块,用于根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型;所述变化类型包括函数新增类型、函数删除类型和函数修改类型。
其中,获取模块11、计算模块12、提取模块13、识别模块14的具体功能实现方式可以参见上述图2a对应实施例中的步骤S101-步骤S104,这里不再进行赘述。
请参见图5,计算模块12可以包括:拉取单元121、组合单元122、计算单元123。
拉取单元121,用于分别拉取所述第一版本程序的多个第一文件概要信息,以及所述第二版本程序的多个第二文件概要信息;
组合单元122,用于将属于修改类型、新增类型的第一文件概要信息对应的第一文件,组合为第一文件集合;
所述组合单元122,还用于将属于修改类型、删除类型的第二文件概要信息对应的第二文件,组合为第二文件集合;
计算单元123,用于分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值。
其中,拉取单元121、组合单元122、计算单元123的具体功能实现方式可以参见上述图2a对应实施例中的步骤S102,这里不再进行赘述。
请参见图5,计算单元123可以包括:解析单元121、确定单元122,还可以包括:编译子单元1231、第一查找子单元1232、第二查找子单元1233。
编译子单元1231,用于对所述第一文件集合中所有函数进行编译处理和翻译处理,得到所述第一文件集合中所有函数的位置信息;
所述编译子单元1231,还用于对所述第二文件集合中所有函数进行编译处理和翻译处理,得到所述第二文件集合中所有函数的位置信息;
第一查找子单元1232,用于根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值;
第二查找子单元1233,用于根据所述第二文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第二文件集合中各函数对应的信息摘要值。
其中,编译子单元1231、第一查找子单元1232、第二查找子单元1233的具体功能实现方式可以参见上述图2a对应实施例中的步骤S102,这里不再进行赘述。
请参见图5,第一查找子单元1232可以包括:转换子单元12321、计算子单元12322。
转换子单元12321,用于根据所述第一信息集合中的函数的位置信息中的函数起始坐标、函数结束坐标,查找所述函数所包含的内容字符串,并将所述内容字符串转换为内容字节码;
所述转换子单元12321,还用于填充所述内容字节码,得到满足位长倍数条件的待计算内容字节码,并将所述待计算内容字节码划分为多个字节码小组;
计算子单元12322,用于获取多个链接变量,将所述多个链接变量和所述多个字节码小组分别进行非线性函数计算,得到多个分组散列值,并将所述多个分组散列值进行级联,得到所述函数对应的信息摘要值。
其中,转换子单元12321、计算子单元12322的具体功能实现方式可以参见上述图2a对应实施例中的步骤S102,这里不再进行赘述。
请参见图5,提取模块13可以包括:提取单元131、第一确定单元132。
提取单元131,用于将在所述第一版本程序的函数和所述第二版本程序的函数中,具有相同的信息摘要值所对应的函数对,作为相同函数对;
第一确定单元132,用于将所述第一文件集合中不属于所述相同函数对的函数,作为所述第一目标函数子集合;
所述第一确定单元132,还用于将所述第二文件集合中不属于所述相同函数对的函数,作为所述第二目标函数子集合。
其中,提取单元131、第一确定单元132的具体功能实现方式可以参见上述图3a对应实施例中的步骤S203-步骤S205,这里不再进行赘述。
请参见图5,识别模块14可以包括:第二确定单元141、第三确定单元142。
第二确定单元141,用于将属于所述第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型;
所述第二确定单元141,还用于将属于所述第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型;
第三确定单元142,用于将既属于所述第一目标函数子集合也属于所述第二目标函数子集合的函数的变化类型,确定为函数修改类型。
其中,第二确定单元141、第三确定单元142的具体功能实现方式可以参见上述图3a对应实施例中的步骤S206-步骤S208,这里不再进行赘述。
如图5所示,函数处理装置1可以包括:获取模块11、计算模块12、提取模块13、识别模块14,还可以包括构建模块15。
构建模块15,用于根据所述第一文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第一版本控制表,并将所述第一版本控制表存储于版本控制数据库;其中所述版本控制数据库的主键包括函数名,所述版本控制数据库的所述主键对应的属性包括位置信息、函数内容和信息摘要值;
所述构建模块15,还用于根据所述第二文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第二版本控制表,并将所述第二版本控制表存储于所述版本控制数据库。
其中,构建模块15的具体功能实现方式可以参见上述图2a对应实施例中的步骤S104,这里不再进行赘述。
本发明实施例通过获取第一版本程序,并获取与第一版本程序相关联的第二版本程序;获取第一版本程序中所有函数对应的信息摘要值,并获取第二版本程序中所有函数对应的信息摘要值;在第一版本程序和第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;相同函数对中的第一版本程序的函数和第二版本程序的函数具有相同的信息摘要值;根据目标函数集合中各函数对应的信息摘要值,识别目标函数集合中各函数的变化类型。上述可知,以函数为单位,将版本程序划分为多个块,计算每个函数唯一对应的信息摘要值,根据该信息摘要值提取不变的函数,将不变的函数剔除得到发生变化的函数,进而识别发生变化的函数的变化类型。相对现有的行处理,对函数进行解析可以降低计算量,提高识别函数变化类型的效率;利用函数独一无二的信息摘要值,可以提升识别的准确率。进一步地,即使两个版本程序之间差异很大,通过函数的信息摘要值识别变化类型也具有较低的计算量。
进一步地,请参见图6,是本发明实施例提供的一种电子设备的结构示意图。如图6所示,上述图5中的函数处理装置1可以应用于所述电子设备1000,所述电子设备1000可以包括:处理器1001,网络接口1004和存储器1005,此外,所述电子设备1000还可以包括:用户接口1003,和至少一个通信总线1002。其中,通信总线1002用于实现这些组件之间的连接通信。其中,用户接口1003可以包括显示屏(Display)、键盘(Keyboard),可选用户接口1003还可以包括标准的有线接口、无线接口。网络接口1004可选的可以包括标准的有线接口、无线接口(如WI-FI接口)。存储器1005可以是高速RAM存储器,也可以是非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。存储器1005可选的还可以是至少一个位于远离前述处理器1001的存储装置。如图6所示,作为一种计算机存储介质的存储器1005中可以包括操作系统、网络通信模块、用户接口模块以及设备控制应用程序。
在图6所示的电子设备1000中,网络接口1004可提供网络通讯功能;而用户接口1003主要用于为用户提供输入的接口;而处理器1001可以用于调用存储器1005中存储的设备控制应用程序,以实现:
获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序;
获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值;
在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;所述相同函数对中的所述第一版本程序的函数和所述第二版本程序的函数具有相同的信息摘要值;
根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型;所述变化类型包括函数新增类型、函数删除类型和函数修改类型。
在一个实施例中,所述第一版本程序的创建时间戳大于所述第二版本程序的创建时间戳;
所述处理器1001在执行获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值时,具体执行以下步骤:
分别拉取所述第一版本程序的多个第一文件概要信息,以及所述第二版本程序的多个第二文件概要信息;
将属于修改类型、新增类型的第一文件概要信息对应的第一文件,组合为第一文件集合;
将属于修改类型、删除类型的第二文件概要信息对应的第二文件,组合为第二文件集合;
分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值。
在一个实施例中,所述处理器1001在执行分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值时,具体执行以下步骤:
对所述第一文件集合中所有函数进行编译处理和翻译处理,得到所述第一文件集合中所有函数的位置信息;
对所述第二文件集合中所有函数进行编译处理和翻译处理,得到所述第二文件集合中所有函数的位置信息;
根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值;
根据所述第二文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第二文件集合中各函数对应的信息摘要值。
在一个实施例中,所述处理器1001在执行根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值时,具体执行以下步骤:
根据所述第一信息集合中的函数的位置信息中的函数起始坐标、函数结束坐标,查找所述函数所包含的内容字符串,并将所述内容字符串转换为内容字节码;
填充所述内容字节码,得到满足位长倍数条件的待计算内容字节码,并将所述待计算内容字节码划分为多个字节码小组;
获取多个链接变量,将所述多个链接变量和所述多个字节码小组分别进行非线性函数计算,得到多个分组散列值,并将所述多个分组散列值进行级联,得到所述函数对应的信息摘要值。
在一个实施例中,所述目标函数集合包括第一目标函数子集合和第二目标函数子集合
所述处理器1001在执行在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合时,具体执行以下步骤:
将在所述第一版本程序的函数和所述第二版本程序的函数中,具有相同的信息摘要值所对应的函数对,作为相同函数对;
将所述第一文件集合中不属于所述相同函数对的函数,作为所述第一目标函数子集合;
将所述第二文件集合中不属于所述相同函数对的函数,作为所述第二目标函数子集合。
在一个实施例中,所述处理器1001在根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型时,具体执行以下步骤:
将属于所述第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型;
将属于所述第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型;
将既属于所述第一目标函数子集合也属于所述第二目标函数子集合的函数的变化类型,确定为函数修改类型。
在一个实施例中,所述处理器1001还执行以下步骤:
根据所述第一文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第一版本控制表,并将所述第一版本控制表存储于版本控制数据库;其中所述版本控制数据库的主键包括函数名,所述版本控制数据库的所述主键对应的属性包括位置信息、函数内容和信息摘要值;
根据所述第二文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第二版本控制表,并将所述第二版本控制表存储于所述版本控制数据库。
本发明实施例通过获取第一版本程序,并获取与第一版本程序相关联的第二版本程序;获取第一版本程序中所有函数对应的信息摘要值,并获取第二版本程序中所有函数对应的信息摘要值;在第一版本程序和第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;相同函数对中的第一版本程序的函数和第二版本程序的函数具有相同的信息摘要值;根据目标函数集合中各函数对应的信息摘要值,识别目标函数集合中各函数的变化类型。上述可知,以函数为单位,将版本程序划分为多个块,计算每个函数唯一对应的信息摘要值,根据该信息摘要值提取不变的函数,将不变的函数剔除得到发生变化的函数,进而识别发生变化的函数的变化类型。相对现有的行处理,对函数进行解析可以降低计算量,提高识别函数变化类型的效率;利用函数独一无二的信息摘要值,可以提升识别的准确率。进一步地,即使两个版本程序之间差异很大,通过函数的信息摘要值识别变化类型也具有较低的计算量。
应当理解,本发明实施例中所描述的电子设备1000可执行前文图2a到图4所对应实施例中对所述函数处理方法的描述,也可执行前文图5所对应实施例中对所述函数处理装置1的描述,在此不再赘述。另外,对采用相同方法的有益效果描述,也不再进行赘述。
此外,这里需要指出的是:本发明实施例还提供了一种计算机存储介质,且所述计算机存储介质中存储有前文提及的函数处理装置1所执行的计算机程序,且所述计算机程序包括程序指令,当所述处理器执行所述程序指令时,能够执行前文图2a到图4所对应实施例中对所述函数处理方法的描述,因此,这里将不再进行赘述。另外,对采用相同方法的有益效果描述,也不再进行赘述。对于本发明所涉及的计算机存储介质实施例中未披露的技术细节,请参照本发明方法实施例的描述。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random AccessMemory,RAM)等。
以上所揭露的仅为本发明较佳实施例而已,当然不能以此来限定本发明之权利范围,因此依本发明权利要求所作的等同变化,仍属本发明所涵盖的范围。
Claims (15)
1.一种函数处理方法,其特征在于,包括:
获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序;
获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值;
在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;所述相同函数对中的所述第一版本程序的函数和所述第二版本程序的函数具有相同的信息摘要值;
根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型;所述变化类型包括函数新增类型、函数删除类型和函数修改类型。
2.根据权利要求1所述的方法,其特征在于,所述第一版本程序的创建时间戳大于所述第二版本程序的创建时间戳;
所述获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值,包括:
分别拉取所述第一版本程序的多个第一文件概要信息,以及所述第二版本程序的多个第二文件概要信息;
将属于修改类型、新增类型的第一文件概要信息对应的第一文件,组合为第一文件集合;
将属于修改类型、删除类型的第二文件概要信息对应的第二文件,组合为第二文件集合;
分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值。
3.根据权利要求2所述的方法,其特征在于,所述分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值,包括:
对所述第一文件集合中所有函数进行编译处理和翻译处理,得到所述第一文件集合中所有函数的位置信息;
对所述第二文件集合中所有函数进行编译处理和翻译处理,得到所述第二文件集合中所有函数的位置信息;
根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值;
根据所述第二文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第二文件集合中各函数对应的信息摘要值。
4.根据权利要求3所述的方法,其特征在于,所述根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值,包括:
根据所述第一信息集合中的函数的位置信息中的函数起始坐标、函数结束坐标,查找所述函数所包含的内容字符串,并将所述内容字符串转换为内容字节码;
填充所述内容字节码,得到满足位长倍数条件的待计算内容字节码,并将所述待计算内容字节码划分为多个字节码小组;
获取多个链接变量,将所述多个链接变量和所述多个字节码小组分别进行非线性函数计算,得到多个分组散列值,并将所述多个分组散列值进行级联,得到所述函数对应的信息摘要值。
5.根据权利要求2所述的方法,其特征在于,所述目标函数集合包括第一目标函数子集合和第二目标函数子集合;
所述在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合,包括:
将在所述第一版本程序的函数和所述第二版本程序的函数中,具有相同的信息摘要值所对应的函数对,作为相同函数对;
将所述第一文件集合中不属于所述相同函数对的函数,作为所述第一目标函数子集合;
将所述第二文件集合中不属于所述相同函数对的函数,作为所述第二目标函数子集合。
6.根据权利要求5所述的方法,其特征在于,所述根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型,包括:
将属于所述第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型;
将属于所述第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型;
将既属于所述第一目标函数子集合也属于所述第二目标函数子集合的函数的变化类型,确定为函数修改类型。
7.根据权利要求3所述的方法,其特征在于,还包括:
根据所述第一文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第一版本控制表,并将所述第一版本控制表存储于版本控制数据库;其中所述版本控制数据库的主键包括函数名,所述版本控制数据库的所述主键对应的属性包括位置信息、函数内容和信息摘要值;
根据所述第二文件集合中所有函数的函数名、位置信息、函数内容、信息摘要值之间的映射关系,构建第二版本控制表,并将所述第二版本控制表存储于所述版本控制数据库。
8.一种函数处理装置,其特征在于,包括:
获取模块,用于获取第一版本程序,并获取与所述第一版本程序相关联的第二版本程序;
计算模块,用于获取所述第一版本程序中所有函数对应的信息摘要值,并获取所述第二版本程序中所有函数对应的信息摘要值;
提取模块,用于在所述第一版本程序和所述第二版本程序中获取除了相同函数对以外的函数,作为目标函数集合;所述相同函数对中的所述第一版本程序的函数和所述第二版本程序的函数具有相同的信息摘要值;
识别模块,用于根据所述目标函数集合中各函数对应的所述信息摘要值,识别所述目标函数集合中各函数的变化类型;所述变化类型包括函数新增类型、函数删除类型和函数修改类型。
9.根据权利要求8所述的装置,其特征在于,所述第一版本程序的创建时间戳大于所述第二版本程序的创建时间戳;
所述计算模块,包括:
拉取单元,用于分别拉取所述第一版本程序的多个第一文件概要信息,以及所述第二版本程序的多个第二文件概要信息;
组合单元,用于将属于修改类型、新增类型的第一文件概要信息对应的第一文件,组合为第一文件集合;
所述组合单元,还用于将属于修改类型、删除类型的第二文件概要信息对应的第二文件,组合为第二文件集合;
计算单元,用于分别计算所述第一文件集合中所有函数对应的信息摘要值、所述第二文件集合中所有函数对应的信息摘要值。
10.根据权利要求9所述的装置,其特征在于,所述计算单元,包括:
编译子单元,用于对所述第一文件集合中所有函数进行编译处理和翻译处理,得到所述第一文件集合中所有函数的位置信息;
所述编译子单元,还用于对所述第二文件集合中所有函数进行编译处理和翻译处理,得到所述第二文件集合中所有函数的位置信息;
第一查找子单元,用于根据所述第一文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第一文件集合中各函数对应的信息摘要值;
第二查找子单元,用于根据所述第二文件集合中所有函数的位置信息,查找每个函数所包含的内容字符串,并根据每个函数所包含的内容字符串分别计算所述第二文件集合中各函数对应的信息摘要值。
11.根据权利要求10所述的装置,其特征在于,所述第一查找子单元,包括:
转换子单元,用于根据所述第一信息集合中的函数的位置信息中的函数起始坐标、函数结束坐标,查找所述函数所包含的内容字符串,并将所述内容字符串转换为内容字节码;
所述转换子单元,还用于填充所述内容字节码,得到满足位长倍数条件的待计算内容字节码,并将所述待计算内容字节码划分为多个字节码小组;
计算子单元,用于获取多个链接变量,将所述多个链接变量和所述多个字节码小组分别进行非线性函数计算,得到多个分组散列值,并将所述多个分组散列值进行级联,得到所述函数对应的信息摘要值。
12.根据权利要求9所述的装置,其特征在于,所述目标函数集合包括第一目标函数子集合和第二目标函数子集合;
所述提取模块,包括:
提取单元,用于将在所述第一版本程序的函数和所述第二版本程序的函数中,具有相同的信息摘要值所对应的函数对,作为相同函数对;
第一确定单元,用于将所述第一文件集合中不属于所述相同函数对的函数,作为所述第一目标函数子集合;
所述第一确定单元,还用于将所述第二文件集合中不属于所述相同函数对的函数,作为所述第二目标函数子集合。
13.根据权利要求12所述的方装置,其特征在于,所述识别模块,包括:
第二确定单元,用于将属于所述第一目标函数子集合但不属于第二目标函数子集合的函数的变化类型,确定为函数新增类型;
所述第二确定单元,还用于将属于所述第二目标函数子集合但不属于第一目标函数子集合的函数的变化类型,确定为函数删除类型;
第三确定单元,用于将既属于所述第一目标函数子集合也属于所述第二目标函数子集合的函数的变化类型,确定为函数修改类型。
14.一种电子设备,其特征在于,包括:处理器和存储器;
所述处理器和存储器相连,其中,所述存储器用于存储程序代码,所述处理器用于调用所述程序代码,以执行如权利要求1-7任一项所述的方法。
15.一种计算机存储介质,其特征在于,所述计算机存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时,执行如权利要求1-7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810517954.8A CN108845843B (zh) | 2018-05-25 | 2018-05-25 | 一种函数处理方法、装置以及相关设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810517954.8A CN108845843B (zh) | 2018-05-25 | 2018-05-25 | 一种函数处理方法、装置以及相关设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108845843A true CN108845843A (zh) | 2018-11-20 |
CN108845843B CN108845843B (zh) | 2022-04-29 |
Family
ID=64213537
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810517954.8A Active CN108845843B (zh) | 2018-05-25 | 2018-05-25 | 一种函数处理方法、装置以及相关设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108845843B (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110134595A (zh) * | 2019-04-19 | 2019-08-16 | 平安科技(深圳)有限公司 | Svn资源库测试前的分析方法、装置、计算机设备 |
CN110532019A (zh) * | 2019-06-27 | 2019-12-03 | 北京大学 | 一种软件代码片段历史追溯的方法 |
CN110601957A (zh) * | 2019-09-06 | 2019-12-20 | 香港乐蜜有限公司 | 系统私信校验方法、装置、电子设备和存储介质 |
CN112817637A (zh) * | 2021-04-16 | 2021-05-18 | 四川新网银行股份有限公司 | 获得系统代码修改后受影响的对外提供服务接口的方法 |
CN113656318A (zh) * | 2021-08-23 | 2021-11-16 | 上海哔哩哔哩科技有限公司 | 软件版本测试方法、装置及计算机设备 |
CN115080255A (zh) * | 2022-06-28 | 2022-09-20 | 奇秦科技(北京)股份有限公司 | 一种基于并发安全的分布式批量数据处理方法及系统 |
CN110134595B (zh) * | 2019-04-19 | 2024-05-28 | 平安科技(深圳)有限公司 | Svn资源库测试前的分析方法、装置、计算机设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104035772A (zh) * | 2014-06-09 | 2014-09-10 | 中国科学院软件研究所 | 基于静态分析的源码多版本函数调用关系差异性标识方法 |
CN104123493A (zh) * | 2014-07-31 | 2014-10-29 | 百度在线网络技术(北京)有限公司 | 应用程序的安全性检测方法和装置 |
US20150324178A1 (en) * | 2014-05-09 | 2015-11-12 | Gerald Arnold | Hash-based change tracking for software make tools |
CN105069084A (zh) * | 2015-07-31 | 2015-11-18 | 南威软件股份有限公司 | 一种面向海量数据高效取差集的方法 |
CN107203468A (zh) * | 2017-04-19 | 2017-09-26 | 哈尔滨工程大学 | 一种基于ast的软件版本演化对比分析方法 |
-
2018
- 2018-05-25 CN CN201810517954.8A patent/CN108845843B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150324178A1 (en) * | 2014-05-09 | 2015-11-12 | Gerald Arnold | Hash-based change tracking for software make tools |
CN104035772A (zh) * | 2014-06-09 | 2014-09-10 | 中国科学院软件研究所 | 基于静态分析的源码多版本函数调用关系差异性标识方法 |
CN104123493A (zh) * | 2014-07-31 | 2014-10-29 | 百度在线网络技术(北京)有限公司 | 应用程序的安全性检测方法和装置 |
CN105069084A (zh) * | 2015-07-31 | 2015-11-18 | 南威软件股份有限公司 | 一种面向海量数据高效取差集的方法 |
CN107203468A (zh) * | 2017-04-19 | 2017-09-26 | 哈尔滨工程大学 | 一种基于ast的软件版本演化对比分析方法 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110134595A (zh) * | 2019-04-19 | 2019-08-16 | 平安科技(深圳)有限公司 | Svn资源库测试前的分析方法、装置、计算机设备 |
CN110134595B (zh) * | 2019-04-19 | 2024-05-28 | 平安科技(深圳)有限公司 | Svn资源库测试前的分析方法、装置、计算机设备 |
CN110532019A (zh) * | 2019-06-27 | 2019-12-03 | 北京大学 | 一种软件代码片段历史追溯的方法 |
CN110601957A (zh) * | 2019-09-06 | 2019-12-20 | 香港乐蜜有限公司 | 系统私信校验方法、装置、电子设备和存储介质 |
CN110601957B (zh) * | 2019-09-06 | 2021-07-27 | 卓米私人有限公司 | 系统私信校验方法、装置、电子设备和存储介质 |
CN112817637A (zh) * | 2021-04-16 | 2021-05-18 | 四川新网银行股份有限公司 | 获得系统代码修改后受影响的对外提供服务接口的方法 |
CN113656318A (zh) * | 2021-08-23 | 2021-11-16 | 上海哔哩哔哩科技有限公司 | 软件版本测试方法、装置及计算机设备 |
CN115080255A (zh) * | 2022-06-28 | 2022-09-20 | 奇秦科技(北京)股份有限公司 | 一种基于并发安全的分布式批量数据处理方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108845843B (zh) | 2022-04-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108845843A (zh) | 一种函数处理方法、装置以及相关设备 | |
CN108388425B (zh) | 一种基于lstm自动补全代码的方法 | |
CN111026470B (zh) | 用于输入数据的验证和转换的系统和方法 | |
US10620945B2 (en) | API specification generation | |
CN103491205B (zh) | 一种基于视频搜索的关联资源地址的推送方法和装置 | |
US9098627B2 (en) | Providing a core dump-level stack trace | |
CN107832047B (zh) | 一种基于lstm的非api函数实参推荐方法 | |
CN112154420B (zh) | 自动智能云服务测试工具 | |
US20190303109A1 (en) | Code completion for overloaded methods | |
CN105895090A (zh) | 语音信号处理方法及装置 | |
CN106713273B (zh) | 一种基于字典树剪枝搜索的协议关键字识别方法 | |
CN110334326B (zh) | 一种识别配方文件并转化为xml文件的方法及系统 | |
US20190318015A1 (en) | Dynamically synchronizing electronic surveys and collaborative survey representation documents | |
CN110688151B (zh) | 一种面向以太坊Solidity智能合约的安全翻译与解析方法 | |
CN104598218A (zh) | 用于合并和重用门户信息的方法和系统 | |
CN109947399A (zh) | 代码结构生成方法、装置、计算机装置及可读存储介质 | |
CN109858025B (zh) | 一种地址标准化语料的分词方法及系统 | |
CN107885501A (zh) | 获取Android中组件相互引用关系的方法及装置 | |
CN109976806B (zh) | 基于字节码序列匹配的Java语句块克隆检测方法 | |
US20230106226A1 (en) | Code enrichment for training language models relating to computer programming | |
CN117940894A (zh) | 用于检测代码克隆的系统和方法 | |
CN106919403B (zh) | 云环境下基于Java字节码的多粒度代码克隆检测方法 | |
CN117289929A (zh) | 一种插件框架、插件及数据处理方法、装置及电子设备 | |
JP5875961B2 (ja) | ソースコード類似度評価プログラム、ソースコード類似度評価装置、および、コンピュータ読み取り可能な記憶媒体 | |
US10540157B2 (en) | Systems to remove object relational mappings from a software project |
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 |