数据处理方法以及装置与流程

文档序号:32251692发布日期:2022-11-19 01:41阅读:75来源:国知局
数据处理方法以及装置与流程

1.本说明书实施例涉及计算机技术领域,特别涉及数据处理方法以及装置。


背景技术:

2.随着计算机技术的发展,用户对计算机软件的功能需求也越来越多。通常情况下,会针对现有的软件进行功能更新,以保证用户对功能的需求能够实现。
3.在对现有软件进行功能更新时,通常会通过人工遍历函数关系调用图的方式对现有软件的函数调用关系进行更新,会造成人力资源的浪费,增加成本,并且,在函数调用关系较为复杂的情况下,通过人工遍历函数关系调用图的方式可能出现遗漏的情况。因此,亟需一种有效的方案以解决上述问题。


技术实现要素:

4.有鉴于此,本说明书实施例提供了一种数据处理方法。本说明书一个或者多个实施例同时涉及一种数据处理装置,一种计算设备,一种计算机可读存储介质以及一种计算机程序,以解决现有技术中存在的技术缺陷。
5.根据本说明书实施例的第一方面,提供了一种数据处理方法,包括:
6.在目标程序的当前函数关系调用图中,确定至少两个原函数节点;
7.为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一;
8.在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添加结果生成标识函数关系调用图;
9.根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。
10.根据本说明书实施例的第二方面,提供了一种数据处理装置,包括:
11.确定模块,被配置为在目标程序的当前函数关系调用图中,确定至少两个原函数节点;
12.第一标识模块,被配置为为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一;
13.第二标识模块,被配置为在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添加结果生成标识函数关系调用图;
14.更新模块,被配置为根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。
15.根据本说明书实施例的第三方面,提供了一种计算设备,包括:
16.存储器和处理器;
17.所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令,该计算机可执行指令被处理器执行时实现上述数据处理方法的步骤。
18.根据本说明书实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机可执行指令,该指令被处理器执行时实现上述数据处理方法的步骤。
19.根据本说明书实施例的第五方面,提供了一种计算机程序,其中,当所述计算机程序在计算机中执行时,令计算机执行上述数据处理方法的步骤。
20.本说明书一个实施例提供的数据处理方法,在目标程序的当前函数关系调用图中,确定至少两个原函数节点;为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一;通过对当前函数关系调用图中的原函数节点添加第一类型标识,实现了对当前函数关系调用图中的原函数节点与关联函数节点之间的区分,使得根据添加结果能够确定当前函数关系调用图中剩余的关联函数节点,为后续对当前函数关系调用图中的所有函数节点添加标识提供了有利条件,进一步避免了遗漏当前函数关系调用图中的函数节点。
21.在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添加结果生成标识函数关系调用图;通过确定原函数节点与关联函数节点之间的连接关系,以已经添加第一类型标识的原函数节点作为源头,对与其关联的关联函数节点添加第二类型标识,实现了对当前函数关系调用图中的所有函数节点添加标识,替代了人工遍历的方式,节省人力资源,减少成本,保证了生成标识函数关系调用图的准确性,为后续根据标识函数关系调用图对确定目标函数调用关系提供了基础。
22.根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。实现了在原函数和新增函数之间插入判断函数,以使目标程序在后续应用过程中,可以根据目标函数调用关系保证目标程序功能的运行,以达到节省调用资源的目的,进一步提高目标程序更新后的性能。
附图说明
23.图1是本说明书一个实施例提供的一种数据处理方法的流程图;
24.图2是本说明书一个实施例提供的一种数据处理方法的处理过程示意图;
25.图3是本说明书一个实施例提供的一种数据处理方法应用于染色的处理过程流程图;
26.图4是本说明书一个实施例提供的一种数据处理装置的结构示意图;
27.图5是本说明书一个实施例提供的一种计算设备的结构框图。
具体实施方式
28.在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵
的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。
29.在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
30.应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
31.首先,对本说明书一个或多个实施例涉及的名词术语进行解释。
32.跳转标签:(jumplabel):是动态替换指令的一套机制,当我们需要切换代码路径的时候可以帮我们把空操作指令(nop)替换成跳转指令(jmp),指向我们需要执行的指令,这样在运行到这里的时候就可以无需判断直接跳转,这样就可以避免缓存缺失(cache miss)和分支未命中(branch miss)。
33.原函数路径:指的是对于更新了目标功能的目标程序来说,在没有使用目标功能时按照原有逻辑运行的路径。
34.功能函数路径:指的是对于更新了目标功能的目标程序来说,使用目标功能的情况下,调用与目标功能对应的新增函数的路径。
35.开关函数:指的是控制原函数路径和功能函数路径之间切换的函数。
36.判断函数:指的是用于判断当前路径是原函数路径还是功能函数路径的函数。
37.在本说明书中,提供了一种数据处理方法,本说明书同时涉及一种数据处理装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。
38.实际应用中,在对软件进行开发更新的过程中,是在一个较为成熟的软件系统中开发新的功能特性,新的功能特性会在软件的原始通用函数路径上新增一些调用函数或者更改原有的调用逻辑。而软件在后续应用过程中无法准确判断当前路径是选择原有的函数路径还是新增的功能函数路径,从而造成对调用资源的浪费,引起软件性能下降。因此亟需一种技术方案解决上述问题。
39.有鉴于此,本说明书一个实施例提供一种数据处理方法,在目标程序的当前函数关系调用图中,确定至少两个原函数节点;为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一;通过对当前函数关系调用图中的原函数节点添加第一类型标识,实现了对当前函数关系调用图中的原函数节点与关联函数节点之间的区分,使得根据添加结果能够确定当前函数关系调用图中剩余的关联函数节点,为后续对当前函数关系调用图中的所有函数节点添加标识提供了有利条件,进一步避免了遗漏当前函数关系调用图中的函数节点。
40.在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添
加结果生成标识函数关系调用图;通过确定原函数节点与关联函数节点之间的连接关系,以已经添加第一类型标识的原函数节点作为源头,对与其关联的关联函数节点添加第二类型标识,实现了对当前函数关系调用图中的所有函数节点添加标识,保证了生成标识函数关系调用图的准确性,为后续根据标识函数关系调用图对确定目标函数调用关系提供了基础。
41.根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。实现了在原函数和新增函数之间插入判断函数,以使目标程序在后续应用过程中,可以根据目标函数调用关系保证目标程序功能的运行,以达到节省调用资源的目的,进一步提高目标程序更新后的性能。
42.参见图1,图1示出了根据本说明书一个实施例提供的一种数据处理方法的流程图,具体包括以下步骤。
43.步骤102,在目标程序的当前函数关系调用图中,确定至少两个原函数节点。
44.其中,目标程序指的是软件,具体可以理解为正在开发中的软件。可以理解的是,目标程序能够实现的功能对应于其调用的函数。当前函数关系调用图指的是目标程序所能够实现的功能对应的所有函数之间的调用关系图,当前函数关系调用图中可以包括函数节点和函数节点之间的连接关系。原函数节点指的是对目标程序更新之前的目标程序原始版本中包含的所有函数,可以理解的,目标程序中包含至少两个与其能够实现的功能对应的原函数,那么目标程序的当前函数关系调用图中也包括至少两个原函数节点。
45.此外,该数据处理方法可以用于目标程序进行更新之后,在目标程序更新版本的当前函数关系调用图中,确定至少两个原函数节点。目标程序更新版本指的是对目标程序原始版本进行更新之后得到的版本,此处的更新可以理解为在目标程序原始版本开发新的功能,而新的功能会在目标程序原始版本的函数调用路径上新增函数。
46.实际应用中,函数关系调用图可以理解为有向图,在数学上,一个图(graph)是表示物件与物件之间的关系的方法,是图论的基本研究对象。一个图看起来是由一些小圆点(称为顶点或节点)和连结这些圆点的直线或曲线(称为边)组成的。如果给图的每条边规定一个方向,那么得到的图称为有向图,其边也称为有向边。在有向图中,与一个节点相关联的边有出边和入边之分,而与一个有向边关联的两个点也有始点和终点之分。可以利用有向图来描述目标程序更新版本对应的函数调用关系,具体的,可以将目标程序更新版本对应的函数放入节点构成函数节点,根据目标程序更新版本对应的函数调用关系,确定函数节点之间的边的方向,即函数节点之间的连接关系,函数节点与函数节点之间的连接关系共同构成函数关系调用图。
47.基于此,可以根据对应目标程序更新版本的函数以及函数之间的调用关系,创建对应目标程序更新版本的有向图,在有向图中,确定对目标程序更新之前的原始版本的原函数节点。
48.具体实施时,可以通过人工确定当前函数关系调用图中的至少两个原函数节点,也可以通过查询函数更新表确定原函数节点,可以理解的,在对目标程序进行更新时,函数更新表中存储有与当前更新周期对应的新增函数,可以通过遍历函数更新表的方式在当前函数关系调用图中确定至少两个原函数节点;也就是说,函数更新表中存储的函数信息均为新增函数对应的信息,在函数调用关系更新阶段,通过遍历函数更新表,即可确定目标程
序对应的原函数节点,即存在于表中的函数均为新增函数,未存在于表中的函数均为原函数,以此即可在函数关系调用图中确定原函数节点。
49.举例而言,对应目标程序原始版本包括a函数和b函数,其中,a函数调用b函数,在对目标程序原始版本进行更新之后得到的目标程序更新版本包含a函数、b函数和c函数,将c函数存储于函数更新表,a函数调用c函数,其中c函数是目标程序更新版本更新的功能对应的函数节点,对应目标程序更新版本的函数关系调用图包括a函数节点、b函数节点和c函数节点,a函数节点和b函数节点之间的有向边为由a函数节点指向b函数节点,a函数节点和c函数节点之间的有向边为由a函数节点指向c函数节点,构成有向图。在有向图中,通过遍历函数更新表,确定函数更新表中不存在的函数为原函数节点,即确定原函数节点为a函数节点和b函数节点。
50.步骤104,为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一。
51.具体的,在当前函数关系调用图中确定了至少两个原函数节点的基础上,为了在当前函数关系调用图中区分目标程序原始版本对应的原函数节点和目标程序更新版本对应的新增函数节点,可以对当前函数关系调用图中的至少两个原函数节点中的第一原函数节点添加第一类型标识,那么未被添加第一类型标识的剩余的函数节点即为目标程序更新版本对应的新增函数节点。
52.其中,第一原函数节点可以理解为至少两个原函数节点中的每个第一原函数节点,即可以理解为当前函数关系调用图中的其中一个原函数节点,那么为至少两个原函数节点中的第一原函数节点添加第一类型标识,可以理解为对至少两个原函数节点中的每个第一原函数节点添加第一类型标识,由此实现对当前函数关系调用图中的所有原函数节点都添加第一类型标识;第一类型标识可以用于标识第一原函数节点的函数类型,可以理解的是,对于不同函数类型的第一原函数节点,添加与该函数类型对应的第一类型标识。关联函数节点指的是当前函数关系调用图中除了原函数节点之外的剩余的其他函数节点。
53.基于此,根据第一原函数节点对应的函数类型,针对当前函数关系调用图中的至少两个原函数节点中的每个第一原函数节点添加用于标识该函数类型的第一类型标识,在每个第一原函数节点为不同的函数类型时,针对当前函数关系调用图中的每个第一原函数节点添加与该函数类型对应的第一类型标识,根据添加第一类型标识之后的原函数节点,在当前函数关系调用图中确定除了原函数节点之外的剩余的其他函数节点。
54.沿用上例,在有向图中确定的原函数节点为a函数节点和b函数节点,a函数节点对应的函数类型为a类型,b函数节点对应的函数类型为b类型,在有向图中针对a函数节点添加第一a类型标识,针对b函数节点添加第一b类型标识,根据添加结果在有向图中确定的关联函数节点为c函数节点。
55.进一步的,为了针对当前函数关系调用图中的不同类型的至少两个原函数节点,添加第一类型标识,可以确定第一原函数节点的函数类型,根据第一原函数节点的函数类型,对第一原函数节点添加第一类型标识,具体实现方式如下:
56.对所述当前函数关系调用图中的至少两个原函数节点进行遍历,根据遍历结果确定所述第一原函数节点的函数类型;
57.基于预设的函数类型与第一类型标识之间的对应关系,确定所述函数类型对应的第一类型标识;
58.为所述第一原函数节点添加与所述函数类型对应的第一类型标识。
59.其中,函数类型用于表示函数节点对应的函数的类型,函数类型可以包括但不限于调用函数、开关函数和接口函数等。遍历(traversal),是指沿着某条搜索路线,依次对函数关系调用图中每个函数节点均做一次访问。函数类型与第一类型标识之间的对应关系可以是预先设置的,基于函数类型查询该函数类型与第一类型标识之间的对应关系,即可得到该函数类型对应的第一类型标识。
60.基于此,对当前函数关系调用图中的每个原函数节点均做一次访问,根据访问结果确定第一原函数节点对应的函数类型,基于确定的函数类型,读取预设的函数类型与第一类型标识之间的对应关系,确定函数类型对应的第一类型标识,针对函数类型对应的原函数节点,添加与函数类型对应的第一类型标识。
61.沿用上例,在有向图中确定的原函数节点为a函数节点和b函数节点,遍历有向图中的a函数节点和b函数节点,确定a函数节点对应的函数类型为a类型,确定b函数节点对应的函数类型为b类型,基于a类型读取预设的函数类型与第一类型标识之间的对应关系,确定a类型对应的第一类型标识为第一a类型标识,基于b类型读取预设的函数类型与第一类型标识之间的对应关系,确定b类型对应的第一类型标识为第一b类型标识,在有向图中针对a函数节点添加第一a类型标识,针对b函数节点添加第一b类型标识。
62.综上,通过根据原函数节点对应的函数类型,对当前函数关系调用图中的第一原函数节点添加与函数类型对应的第一类型标识,实现了对当前函数关系调用图中的原函数节点的标识,为后续对当前函数关系调用图中的所有函数节点进行标识提供了有利条件。
63.进一步的,对于不同类型的第一原函数节点,可以添加不同的第一类型标识。可以理解的,在目标程序的当前函数关系调用图中,第一原函数节点的函数类型可以为调用函数、接口函数以及开关函数。为第一原函数节点添加与函数类型对应的第一类型标识,具体实现方式如下:
64.(1)在所述函数类型包括调用函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识;
65.其中,对应调用函数类型的第一原函数节点,可以理解为第一原函数节点对应的函数类型为调用函数类型,调用函数可以理解为目标程序中实现功能对应的函数,调用函数可以包括调用开关函数的接口函数和功能函数等;第一子标识可以用于标识调用函数类型对应的第一原函数节点。
66.基于此,在当前函数关系调用图中的所有第一原函数节点只存在调用函数类型时,可以对调用函数类型对应的所有第一原函数节点添加第一子标识。
67.举例而言,在当前函数关系调用图中确定对应调用函数类型的第一原函数节点a、b、c,对第一原函数节点a、b、c都添加蓝色标识。
68.(2)在所述函数类型包括调用函数类型和接口函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识,以及为对应所述接口函数类型的第一原函数节点添加第二子标识;
69.其中,对应接口函数类型的第一原函数节点可以理解为第一原函数节点对应的函
数类型为接口函数类型,接口函数可以理解为不调用开关函数的接口函数;第二子标识可以用于标识接口函数类型对应的第一原函数节点。可以理解的,第一子标识和第二子标识不同。
70.基于此,在当前函数关系调用图中存在调用函数类型对应的第一原函数节点、和接口函数类型对应的第一原函数节点的情况下,对调用函数类型对应的第一原函数节点添加第一子标识,对接口函数类型对应的第一原函数节点添加第二子标识。
71.举例而言,在当前函数关系调用图中确定对应调用函数类型的第一原函数节点a、b、c,确定对应接口函数类型的第一原函数节点d,对第一原函数节点a、b、c添加蓝色标识,对第一原函数节点d添加绿色标识。
72.(3)在所述函数类型包括调用函数类型和开关函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识,以及为对应所述开关函数类型的第一原函数节点添加第三子标识;
73.其中,对应开关函数类型的第一原函数节点可以理解为第一原函数节点对应的函数类型为开关函数类型;第三子标识可以用于标识开关函数类型对应的第一原函数节点。可以理解的,第一子标识和第三子标识不同。
74.基于此,在当前函数关系调用图中存在调用函数类型对应的第一原函数节点、和开关函数类型对应的第一原函数节点的情况下,对调用函数类型对应的第一原函数节点添加第一子标识,对开关函数类型对应的第一原函数节点添加第二子标识。
75.举例而言,在当前函数关系调用图中确定对应调用函数类型的第一原函数节点a、b、c,确定对应开关函数类型的第一原函数节点e、f,对第一原函数节点a、b、c添加蓝色标识,对第一原函数节点e、f添加紫色标识。
76.(4)在所述函数类型包括调用函数类型、接口函数类型以及开关函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识,为对应所述接口函数类型的第一原函数节点添加第二子标识,以及为对应所述开关函数类型的第一原函数节点添加第三子标识。
77.基于此,根据遍历当前函数关系调用图的遍历结果,能够确定当前函数关系调用图中的每个第一原函数节点,以及确定对应调用函数类型的第一原函数节点、对应接口函数类型的第一原函数节点、以及对应开关函数类型的第一原函数节点,基于函数类型与第一类型标识之间的对应关系,能够确定调用函数类型对应的第一子标识、接口函数类型对应的第二子标识以及开关函数类型对应的第三子标识。为调用函数类型的第一原函数节点添加第一子标识,为对应接口函数类型的第一原函数节点添加第二子标识,为对应开关函数类型的第一原函数节点添加第三子标识。
78.实际应用中,目标程序的原函数节点对应的函数类型可能只包括一种,也可能包括多种函数类型。根据遍历结果确定的原函数节点对应的函数类型有几种,就确定这几种函数类型中每种函数类型对应的第一类型标识并添加,以对目标程序中所有函数类型的原函数节点添加标识。
79.举例而言,确定的原函数节点为a、b、c、d四个函数节点,确定a函数节点对应的函数类型为调用函数类型,b函数节点和c函数节点对应的函数类型为接口函数类型,d函数节点对应的函数类型为开关函数类型,基于函数类型和第一类型标识之间的对应关系,确定a
函数节点的调用函数类型对应蓝色标识,确定b函数节点和c函数节点的接口函数类型对应绿色标识,确定d函数节点的开关函数类型对应紫色标识,对a函数节点添加蓝色标识,对b函数节点和c函数节点添加绿色标识,对d函数节点添加紫色标识。
80.综上,通过对原函数节点对应的不同的函数类型添加对应的第一类型标识,实现了对当前函数关系调用图中的所有原函数节点的标识,为后续对当前函数关系调用图中的所有函数节点添加标识提供基础。
81.步骤106,在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添加结果生成标识函数关系调用图。
82.具体的,在当前函数关系调用图中确定关联函数节点之后,为了对关联函数节点添加相应的标识,需要确定至少两个原函数节点与关联函数节点之间的连接关系,并根据连接关系针对关联函数节点添加第二类型标识,从而能够根据添加结果生成标识函数关系调用图。
83.其中,原函数节点和关联函数节点之间的连接关系可以用于表示原函数和关联函数之间的调用关系,原函数节点指向关联函数节点的连接关系可以用于表示原函数调用关联函数,原函数节点指向关联函数节点,也可以理解为原函数节点出边连接关联函数节点。第二类型标识可以与第一类型标识相同,也可以不同。标识函数关系调用图指的是对当前函数关系调用图中的所有函数节点添加标识之后生成的函数关系调用图,可以理解的,从当前函数关系调用图到标识函数关系调用图的过程中,当前函数关系调用图中的函数节点之间的函数调用关系不发生改变,改变的是当前函数关系调用图中的函数节点的标识状态。原函数节点和关联函数节点之间的连接关系,可以包括由原函数节点指向关联函数节点的出边连接关系,也可以包括由关联函数节点指向原函数节点的入边连接关系。
84.此外,原函数节点和关联函数节点之间的连接关系,也可以仅理解为由原函数节点指向关联函数节点的出边连接关系。例如,a函数节点和b函数节点之间的连接关系,可以仅理解为由a函数节点指向b函数节点的出边连接关系。
85.可以理解的,由原函数节点指向关联函数节点的连接关系,对原函数节点来说属于出边连接关系,而对关联函数节点来说属于入边连接关系。
86.基于此,在当前函数关系调用图中确定原函数节点和关联函数节点之间的连接关系,进而确定原函数节点对应的原函数与关联函数节点对应的关联函数之间的调用关系,根据连接关系以及原函数节点添加的标识,对关联函数节点添加第二类型标识。
87.沿用上例,确定的原函数节点为a、b、c、d四个函数节点,对a函数节点添加蓝色标识,对b函数节点和c函数节点添加绿色标识,对d函数节点添加紫色标识,确定的关联函数节点,也即是说函数关系调用图中未添加标识节点为e、f、g三个关联函数节点,其中,a函数节点分别出边连接e函数节点和f函数节点,b函数节点出边连接g函数节点,也即是说,a函数分别调用e函数和f函数,b函数调用g函数。根据a函数节点和e函数节点之间的出边连接关系,对e函数节点添加绿色标识;根据a函数节点与f函数节点之间的出边连接关系,对f函数节点添加绿色标识;根据b函数节点和g函数节点之间的出边连接关系,对g函数节点添加紫色标识。
88.进一步的,在对关联函数节点添加第二类型标识时,为了保证对当前函数关系调
用图中的所有函数节点都能添加标识,实现后续的确定判断函数的插入位置,可以以添加了第一类型标识的原函数节点作为源头,根据原函数节点与关联函数节点之间的连接关系,依次对关联函数节点进行传播标识,直至当前函数关系调用图中的所有关联函数节点都被标识,具体实现方式如下:
89.遍历所述当前函数关系调用图,确定所述原函数节点与所述关联函数节点之间的第i连接关系,根据所述第i连接关系针对所述关联函数节点添加第j标识,得到第j标识函数节点,其中i、j从1取值且i为正整数;
90.判断所述当前函数关系调用图是否存在剩余的关联函数节点;
91.若是,i、j自增1,并执行所述遍历所述当前函数关系调用图步骤;
92.若否,在所述当前函数关系调用图中确定与所述第j标识函数节点具有连接关系的第j标识关联函数节点的标识状态,在所述标识状态为未标识状态的情况下,针对所述第j标识关联函数节点添加第j+1标识,直至第j标识关联函数节点的标识状态都为已标识状态,执行根据添加结果生成标识函数关系调用图步骤。
93.具体的,当i和j均为1的情况下,确定原函数节点与关联函数节点之间的第一连接关系,第一连接关系可以为直接调用关系,可以理解的,关联函数节点中包括与原函数节点具有第一连接关系的关联函数节点,和与原函数节点不具有第一连接关系的关联函数节点,对与原函数节点具有第一连接关系的关联函数节点添加第一标识,得到第一标识函数节点,判断当前函数关系调用图中是否存在剩余的关联函数节点。剩余的关联函数节点,即为前述与原函数节点不具有第一连接关系的关联函数节点。
94.若是,i和j自增1变为2,则再次遍历当前函数关系调用图,确定原函数节点与剩余的关联函数节点之间的第二连接关系,第二连接关系可以为间接调用关系,可以理解的,与原函数节点具有间接调用关系的关联函数节点,与第一标识函数节点可能存在直接调用关系,再次对与原函数节点具有第二连接关系的关联函数节点添加第二标识,得到第二标识函数节点,再次执行上述判断步骤。
95.若否,则在当前函数关系调用图中确定与第一标识函数节点具有连接关系的第一标识关联函数节点,并确定其标识状态,在其标识状态为未标识状态的情况下,对第一标识关联函数节点添加第二标识,直至所有第一标识关联函数节点的标识状态都为已标识状态,此时函数关系调用图中的所有函数节点都为已标识状态,从而生成标识函数关系调用图。
96.其中,第j标识和第j+1标识可以相同,也可以不同。
97.综上,通过以添加了第一类型标识的原函数节点作为源头,根据原函数节点与关联函数节点之间的连接关系,依次对关联函数节点添加第二类型标识,直至当前函数关系调用图中不存在剩余的关联函数节点时,还通过对已经添加标识的关联函数节点具有连接关系的函数节点进行检查,进一步提高标识函数关系调用图的生成准确率,避免当前函数关系调用图中存在未被标识的函数节点。
98.进一步的,在根据连接关系为关联函数节点添加第二类型标识时,可以选用上述方法根据连接关系依次为关联函数节点添加第二类型标识,具体实现方式如下:
99.根据所述连接关系中的第一连接关系,在所述关联函数节点中确定与所述调用函数类型对应的第一原函数节点关联的第一关联函数节点;
100.为所述第一关联函数节点添加第一关联标识,在所述当前函数关系调用图中确定第一剩余关联函数节点;
101.根据所述连接关系中的第二连接关系,在所述第一剩余关联函数节点中确定第一子关联函数节点和第二子关联函数节点,为所述第一子关联函数节点和所述第二子关联函数节点添加第二关联标识。
102.其中,第一关联函数节点指的是与调用函数类型对应的第一原函数节点具有第一连接关系的函数节点,此处的第一连接关系可以是调用函数类型对应的第一原函数节点与第一关联函数节点之间的连接关系。第一剩余关联函数节点指的是经过对第一关联函数节点添加第一关联标识之后,当前函数关系调用图中剩余的未被标识的关联函数节点。
103.相应的,第一子关联函数节点指的是与第一关联函数节点具有第二连接关系的函数节点,第二子关联函数节点指的是与第一关联函数节点具有第二连接关系的函数节点;第二连接关系可以包括第一子连接关系和第二子连接关系,第一子连接关系可以理解为第一关联函数节点和第一子关联函数节点之间的连接关系,第二子连接关系可以理解为第一子关联函数节点和第二子关联函数节点之间的连接关系。
104.可以理解的,在为关联函数节点添加第二类型标识的过程中,可以以调用函数类型对应的第一原函数节点为源头,依次根据第一连接关系、第一子连接关系和第二子连接关系确定第一关联函数节点、第一子关联函数节点和第二子关联函数节点,并添加第二类型标识。
105.基于此,可以根据调用函数类型对应的第一原函数节点和第一关联函数节点之间的连接关系,确定与调用函数类型对应的第一原函数节点关联的第一关联函数节点,并为第一关联函数节点添加第一关联标识。此时能够确定,当前函数关系调用图中剩余的未被标识的第一剩余关联函数节点,再根据第二连接关系确定与第一关联函数节点关联的第一子关联函数节点以及第二子关联函数节点,并为第一子关联函数节点和第二子关联函数节点添加不同于第一关联标识的第二关联标识。
106.沿用上例,在当前函数关系调用图中,为调用函数类型对应的第一原函数节点a、b、c添加蓝色标识后,根据第一连接关系,确定与第一原函数节点a关联的第一关联函数节点g、与第一原函数节点b关联的第一关联函数节点h,为第一关联函数节点g、h添加绿色标识,根据第二连接关系,确定与第一关联函数节点g具有第一子连接关系的第一子关联函数节点i,以及确定与第一子关联函数节点i具有第二子连接关系的第二子关联函数节点j,为第一子关联函数节点i和第二子关联函数节点j添加紫色标识。
107.综上,通过以调用函数类型对应的第一原函数节点为源头,依次对与其具有连接关系的关联函数节点添加第一关联标识和第二关联标识,能够完成对当前函数关系调用图中的关联函数节点的标识,避免遗漏,为后续生成标识函数关系调用图提供有利条件。
108.实际应用中,目标程序的当前函数关系调用图中的原函数节点的函数类型仅包括调用函数类型的情况下,此时根据所述连接关系中的第二连接关系,在所述第一剩余关联函数节点中确定第一子关联函数节点和第二子关联函数节点的具体实现方式如下:
109.根据所述连接关系中的第一子连接关系,在所述第一剩余关联函数节点中确定与所述第一关联函数节点关联的第一子关联函数节点;根据所述连接关系中的第二子连接关系,在所述第一剩余关联函数节点中确定与所述第一子关联函数节点关联的第二子关联函
数节点。
110.基于此,可以根据第一关联函数节点和第一子关联函数节点之间的第一子连接关系,确定与第一关联函数节点关联的第一子关联函数节点,根据第一子关联函数节点与第二子关联函数节点之间的第二子连接关系,确定与第一子关联函数节点关联的第二子关联函数节点。
111.在依次根据第一子连接关系和第二子连接关系确定第一子关联函数节点和第二子关联函数节点之后,可以为第一子关联函数节点和第二子关联函数节点添加第二关联标识。
112.举例而言,在当前函数关系调用图中仅存在调用函数类型对应的第一原函数节点a、b、c时,根据第一连接关系,确定与第一原函数节点a关联的第一关联函数节点g、与第一原函数节点b关联的第一关联函数节点h之后,可以根据第一子连接关系,确定与第一关联函数节点g关联的第一子关联函数节点i,以及根据第二子连接关系确定与第一子关联函数节点i关联的第二子关联函数节点j。之后,可以为第一子关联函数节点i添加紫色标识,以及为第二子关联函数节点j添加紫色标识。
113.综上,通过依次根据第一子连接关系和第二子连接关系,确定第一子关联函数节点和第二子关联函数节点,并为第一子关联函数节点和第二子关联函数节点添加第二关联标识,避免了对函数节点添加标识的遗漏,为后续实现生成标识函数关系调用图提供有利条件。
114.在目标程序的当前函数关系调用图中的原函数节点的函数类型包括调用函数类型和接口函数类型的情况下,根据所述连接关系中的第二连接关系,在所述第一剩余关联函数节点中确定第一子关联函数节点和第二子关联函数节点的具体实现方式如下:
115.在所述第二子标识和所述第一关联标识相同的情况下,根据所述连接关系中的第一子连接关系,在所述第一剩余关联函数节点中分别确定与所述第一关联函数节点关联的第一子关联函数节点、以及与所述接口函数类型对应的第一原函数节点关联的第一子关联函数节点;
116.根据所述连接关系中的第二子连接关系,在所述第一剩余关联函数节点中确定与所述第一子关联函数节点关联的第二子关联函数节点。
117.基于此,在为接口函数类型对应的第一原函数节点添加的第二子标识和为第一关联函数节点添加的第一关联标识相同的情况下,可以确定与接口函数类型对应的第一原函数节点关联的第一子关联函数节点,以及确定与第一关联函数节点关联的第一子关联函数节点,也即是说,确定的是添加了第一关联标识和第二子标识的函数节点关联的第一子关联函数节点,之后再根据第二子连接关系确定与第一子关联函数节点关联的第二子关联函数节点。
118.在依次确定了第一子关联函数节点和第二子关联函数节点之后,可以为第一子关联函数节点和第二子关联函数节点添加第二关联标识。
119.可以理解的,由于此种情况下当前函数关系调用图中还存在接口函数类型的第一原函数节点,并对其添加了第二子标识,使第二子标识和第一关联标识相同,并确定添加了第一关联标识和第二子标识的函数节点关联的第一子关联函数节点,是为了防止与接口函数类型对应的第一原函数节点关联的函数节点在添加标识的过程中被遗漏。
120.沿用上例,在当前函数关系调用图中确定对应调用函数类型的第一原函数节点a、b、c,确定对应接口函数类型的第一原函数节点d,根据第一连接关系,确定与第一原函数节点a关联的第一关联函数节点g、与第一原函数节点b关联的第一关联函数节点h之后,可以根据第一子连接关系,确定与第一关联函数节点g关联的第一子关联函数节点i,根据第二子连接关系,确定与接口函数类型对应的第一原函数节点d关联的第一子关联函数节点k,之后,可以根据第二子连接关系确定与第一子关联函数节点i关联的第二子关联函数节点j,以及与第一子关联函数节点k关联的第二子关联函数节点l。之后,可以为第一子关联函数节点k添加紫色标识,以及为第二子关联函数节点j和第二子关联函数节点l添加紫色标识。
121.综上,通过确定与接口函数类型对应的第一原函数节点关联的第一子关联函数节点、以及与第一关联函数节点关联的第一子关联函数节点,实现了防止接口函数类型对应的第一原函数节点关联的函数节点在添加标识的过程中被遗漏,提升了后续生成标识函数关系调用图的准确度和全面性。
122.在目标程序的当前函数关系调用图中的原函数节点的函数类型包括调用函数类型和开关函数类型的情况下,根据所述连接关系中的第二连接关系,在所述第一剩余关联函数节点中确定第一子关联函数节点和第二子关联函数节点的具体实现方式如下:
123.根据所述连接关系中的第一子连接关系,在所述第一剩余关联函数节点中确定与所述第一关联函数节点关联的第一子关联函数节点;
124.在所述第三子标识和所述第二关联标识相同的情况下,根据所述连接关系中的第二子连接关系,在所述第一剩余关联函数节点中分别确定与所述第一子关联函数节点关联的第二子关联函数节点、以及与所述开关函数类型对应的第一原函数节点关联的第二子关联函数节点。
125.基于此,在为开关函数类型对应的第一原函数节点添加的第三子标识和为第一子关联函数节点添加的第二关联标识相同的情况下,可以确定与开关函数类型对应的第一原函数节点关联的第二子关联函数节点,以及确定与第一子关联函数节点关联的第二子关联函数节点,也即是说,确定的是添加了第二关联标识和第三子标识的函数节点关联的第二子关联函数节点。
126.在确定第一子关联函数节点和第二子关联函数节点之后,可以对第一子关联函数节点和第二子关联函数节点添加第二关联标识。
127.可以理解的,由于此种情况下当前函数关系调用图中还存在开关函数类型的第一原函数节点,并对其添加了第三子标识,使第二子标识和第二关联标识相同,并确定添加了第二关联标识和第三子标识的函数节点关联的第二子关联函数节点,是为了防止与开关函数类型对应的第一原函数节点关联的函数节点在添加标识的过程中被遗漏。
128.沿用上例,在当前函数关系调用图中确定对应调用函数类型的第一原函数节点a、b、c,确定对应开关函数类型的第一原函数节点e、f,根据第一连接关系,确定与第一原函数节点a关联的第一关联函数节点g、与第一原函数节点b关联的第一关联函数节点h之后,可以根据第一子连接关系确定第一关联函数节点g关联的第一子关联函数节点m,以及与第一关联函数节点h关联的第一子关联函数节点n,之后根据第二子连接关系,可以确定第一子关联函数节点m关联的第二子关联函数节点o,以及对应开关函数类型的第一原函数节点e
关联的第二子关联函数节点p。之后,可以为第一子关联函数节点m、第一子关联函数节点n、第二子关联函数节点o以及第二子关联函数节点p添加紫色标识。
129.综上,通过在以调用函数类型对应的第一原函数节点为源头依次添加标识的过程中,考虑到开关函数类型对应的第一原函数节点关联的第二子关联函数节点,并为其添加第二关联标识,实现了防止函数节点的遗漏,使得当前函数关系调用图中的所有函数节点都能被添加标识,为后续生成标识函数关系调用图提供条件。
130.进一步的,在第一原函数节点对应的函数类型包括调用函数类型、接口函数类型和开关函数类型这三种类型的情况下,可以根据所述连接关系中的第二连接关系,在所述第一剩余关联函数节点中确定第一子关联函数节点和第二子关联函数节点,具体实现方式如下:
131.在所述第二子标识和所述第一关联标识相同的情况下,根据所述连接关系中的第一子连接关系,在所述第一剩余关联函数节点中分别确定与所述第一关联函数节点关联的第一子关联函数节点、以及与所述接口函数类型对应的第一原函数节点关联的第一子关联函数节点;
132.在所述第三子标识和所述第二关联标识相同的情况下,根据所述连接关系中的第二子连接关系,在所述第一剩余关联函数节点中分别确定与所述第一子关联函数节点关联的第二子关联函数节点、以及与所述开关函数类型对应的第一原函数节点关联的第二子关联函数节点。
133.其中,第一子关联函数节点指的是与第一关联函数节点和接口函数类型对应的第一原函数节点具有第一子连接关系的函数节点,此处的第一子连接关系可以是接口函数类型对应的第一原函数节点、第一关联函数节点与第一剩余关联函数节点之间的连接关系,可以理解的是,第二子标识和第一关联标识相同的情况下,表明针对第一关联函数节点添加的第一关联标识即为第二子标识,与添加第二子标识的接口函数类型对应的第一原函数节点具有第一子连接关系的函数节点,以及与添加第一关联标识的第一关联函数节点具有第一子连接关系的函数节点,都是第一子关联函数节点,也即是说,与添加第二子标识的函数节点具有连接关系的函数节点即为第一子关联函数节点。
134.相应的,第二子关联函数节点指的是与第一子关联函数节点和开关函数类型对应的第一原函数节点具有第二子连接关系的函数节点,此处的第二子连接关系指的是开关函数类型对应的第一原函数节点、第一子关联函数节点与第一剩余关联函数节点之间的连接关系,可以理解的是,第三子标识和第二关联标识相同的情况下,表明针对第一子关联函数节点添加的第二关联标识即为第三子标识,与添加第三子标识的开关函数类型对应的第一原函数节点具有第二子连接关系的函数节点,以及与添加第二关联标识的第一子关联函数节点具有第二子连接关系的函数节点,都是第二子关联函数节点,也即是说,与添加第三子标识的函数节点具有连接关系的函数节点即为第二子关联函数节点。
135.基于此,可以根据调用函数类型对应的第一原函数节点和关联函数节点之间的第一连接关系,在关联函数节点中确定与调用函数类型对应的第一原函数节点关联的第一关联函数节点,并针对第一关联函数节点添加第二子标识,在当前函数关系调用图中确定剩余的未被标识的关联函数节点;根据接口函数类型对应的第一原函数节点、第一关联函数节点与第一剩余关联函数节点之间的第一子连接关系,分别确定与接口函数类型对应的第
一原函数节点关联的第一子关联函数节点,以及与第一关联函数节点关联的第一子关联函数节点,并针对第一子关联函数节点添加第三子标识。根据开关函数类型对应的第一原函数节点、第一子关联函数节点与关联函数节点之间的连接关系,分别确定与开关函数类型对应的第一原函数节点关联的第二子关联函数节点,以及与第一子关联函数节点关联的第二子关联函数节点,并根据第二子关联函数节点的标识状态,针对第二子关联函数节点添加第二关联标识,即,添加第三子标识。
136.沿用上例,确定的原函数节点为a调用函数节点、b接口函数节点、c接口函数节点、d开关函数节点,调用函数类型对应第一子标识蓝色标识,接口函数类型对应第二子标识绿色标识,开关函数类型对应第三子标识紫色标识,对a函数节点添加蓝色标识,对b函数节点和c函数节点添加绿色标识,对d函数节点添加紫色标识,此时函数关系调用图中的关联函数节点包括e、f、g、h、i函数节点,其中,a函数节点分别出边连接e函数节点和f函数节点,e函数节点出边连接g函数节点,b函数节点出边连接h函数节点,d函数节点出边连接i函数节点。
137.在关联函数节点中确定与a函数节点关联的第一关联函数节点e函数节点和f函数节点,对e函数节点和f函数节点添加第一关联标识,即第二子标识绿色标识。此时当前函数关系调用图中的第一剩余关联函数节点为g、h、i函数节点。
138.在第一剩余关联函数节点中确定和第一关联函数节点e、f,以及接口函数节点b、c关联的第一子关联函数节点,与e函数节点关联的第一子关联函数节点为g函数节点,与b函数节点关联的第一子关联函数节点为h函数节点,针对g、h函数节点添加第二关联标识,即第三子标识紫色标识。
139.在所有的关联函数节点中确定与第一子关联函数节点g、h,以及与开关函数节点d关联的第二子关联函数节点,与g函数节点关联的第二子关联函数节点为e函数节点,与h函数节点关联的第二子关联函数节点为b函数节点,与d函数节点关联的第二子关联函数节点为i函数节点,此时e函数节点和b函数节点的标识状态为已标识状态,i函数节点的标识状态为未标识状态,针对i函数节点添加第二关联标识,即第三子标识紫色标识。
140.此外,实际应用中,还可以对原函数节点和关联函数节点之间的连接关系进行标识,即,对有向图中的两个节点之间的边进行标识,具体的,可以根据连接关系的起始节点的标识,对连接关系添加相应的标识。例如,a原函数节点添加蓝色标识,b关联函数节点添加绿色标识,a原函数节点指向b关联函数节点,可以根据a原函数节点添加的蓝色标识,对a原函数节点指向b关联函数节点的边添加蓝色标识。
141.综上,通过以添加第一类型标识的原函数节点为源头,依次对与原函数节点具有连接关系的关联函数节点添加第二类型标识,能够实现对函数关系调用图中的所有函数节点添加标识,为后续确定判断函数的插入位置提供依据,进一步使目标程序能够在应用阶段通过判断函数判断目标程序调用的函数路径,从而减少资源的消耗。
142.进一步的,为了在确定第一连接关系的过程中,方便统计具有相同标识的函数节点,可以创建与标识对应的链表,并将添加了对应标识的函数节点存储至链表,避免遗漏,具体实现方式如下:
143.创建所述第一子标识对应的第一链表,将所述调用函数类型对应的第一原函数节点存储至所述第一链表;
144.遍历所述第一链表,在所述当前函数关系调用图中确定所述调用函数类型对应的第一原函数节点与所述关联函数节点之间的第一连接关系。
145.其中,调用函数类型对应的第一原函数节点是已经添加了第一子标识的原函数节点。
146.基于此,创建第一子标识对应的第一链表,将添加了第一子标识的调用函数类型对应的第一原函数节点存储至第一链表,通过遍历第一链表中存储的所有调用函数类型对应的第一原函数节点,在当前函数关系调用图中确定第一链表中存储的调用函数类型对应的第一原函数节点与关联函数节点之间的第一连接关系,后续即可根据第一连接关系,在关联函数节点中确定与第一链表中存储的函数节点关联的第一关联函数节点。
147.沿用上例,创建蓝色标识对应的蓝色链表,将添加了蓝色标识的a调用函数节点存储至蓝色链表,遍历蓝色链表,在函数关系调用图中确定a调用函数节点与关联函数节点之间的第一连接关系为a函数节点出边连接e函数节点,a函数节点出边连接f函数节点,后续根据第一连接关系,即可在关联函数节点中确定与a调用函数节点关联的函数节点e和f。
148.综上,通过创建与第一子标识对应的第一链表,使添加了第一子标识的调用函数节点存储至第一链表,避免了对添加第一子标识的调用函数节点的遗漏,使得后续生成的标识函数关系调用图准确率更高。
149.相应的,确定第一子连接关系的具体实现方式如下:
150.创建所述第二子标识对应的第二链表,将所述接口函数类型对应的第一原函数节点和所述第一关联函数节点存储至所述第二链表;
151.遍历所述第二链表,在所述当前函数关系调用图中确定所述第二链表存储的函数节点与所述第一剩余关联函数节点之间的第一子连接关系。
152.其中,接口函数类型对应的第一原函数节点和第一关联函数节点都是添加了第二子标识的函数节点。
153.基于此,创建第二子标识对应的第二链表,将添加了第二子标识的接口函数类型对应的第一原函数节点和第一关联函数节点存储至第二链表,通过遍历第二链表中存储的所有函数节点,在当前函数关系调用图中确定第一链表中存储的函数节点与第一剩余关联函数节点之间的第一子连接关系,后续即可根据第一子连接关系,在第一剩余关联函数节点中确定与第二链表中存储的函数节点关联的第一子关联函数节点。
154.沿用上例,创建绿色标识对应的绿色链表,将添加了绿色标识的b接口函数节点、c接口函数节点、第一关联函数节点e和f存储至绿色链表,遍历绿色链表,确定绿色链表中存储的函数节点与第一剩余关联函数节点之间的第一子连接关系为e函数节点出边连接g函数节点,b函数节点出边连接h函数节点,后续即可根据第一子连接关系确定与e函数节点关联的g函数节点,和与b函数节点关联的h函数节点。
155.综上,通过创建与第二子标识对应的第二链表,使添加了第二子标识的函数节点存储至第二链表,避免了对添加第二子标识的函数节点的遗漏,使得后续生成的标识函数关系调用图准确率更高。
156.相应的,确定第二子连接关系的具体实现方式如下:
157.创建所述第三子标识对应的第三链表,将所述开关函数类型对应的第一原函数节点和所述第一子关联函数节点存储至所述第三链表;
158.遍历所述第三链表,在所述当前函数关系调用图中确定所述第三链表存储的函数节点与所述关联函数节点之间的第二子连接关系。
159.其中,开关函数类型对应的第一原函数节点和第一子关联函数节点都为添加了第三子标识的函数节点。
160.基于此,创建第三子标识对应的第三链表,将添加了第三子标识的开关函数类型对应的第一原函数节点和第一子关联函数节点存储至第三链表,通过遍历第三链表中存储的所有函数节点,在当前函数关系调用图中确定第三链表中存储的函数节点与关联函数节点之间的第二子连接关系,后续即可根据第二子连接关系,在关联函数节点中确定与第三链表中存储的函数节点关联的第二子关联函数节点。
161.沿用上例,创建紫色标识对应的紫色链表,将添加了紫色标识的d开关函数节点、第一子关联函数节点g和h存储至紫色链表,遍历紫色链表,在当前函数关系调用图中确定紫色链表中存储的函数节点与关联函数节点之间的第二子连接关系为e函数节点出边连接g函数节点,b函数节点出边连接h函数节点,d函数节点出边连接i函数节点,后续即可根据第二子连接关系,在关联函数节点中确定与h函数节点关联的第二子关联函数节点为b函数节点,与d函数节点关联的第二子关联函数节点为i函数节点。
162.综上,通过创建与第三子标识对应的第三链表,使添加了第三子标识的函数节点存储至第三链表,避免了对添加第三子标识的函数节点的遗漏,使得后续生成的标识函数关系调用图准确率更高。
163.进一步的,为了准确生成标识函数关系调用图,避免遗漏函数节点未被标记,可以通过根据第二子关联函数节点的标识状态,在针对第二子关联函数节点添加第二关联标识,具体实现方式如下:
164.遍历所述第三链表,确定所述第二子关联函数节点的标识状态;
165.在所述第二子关联函数节点的标识状态为未标识状态的情况下,对所述第二子关联函数节点添加第二关联标识,将所述第二子关联函数节点存储至所述第三链表,在所述第三链表中确定与所述第二子关联函数节点关联的函数节点并删除;或者,在所述第二子关联函数节点的标识状态为已标识状态的情况下,在所述第三链表中确定与所述第二子关联函数节点关联的函数节点并删除;
166.在所述第三链表中不存在函数节点的情况下,执行根据添加结果生成标识函数关系调用图。
167.其中,未标识状态指的是函数节点未被添加标识,已标识状态指的是函数节点已被添加标识。
168.具体的,将第二子关联函数节点存储至第三链表时,可以将其存储至第三链表的尾部。对第三链表进行遍历时,可以从第三链表的首部开始遍历。
169.基于此,遍历第三链表,在当前函数调用关系图中确定第三链表中存储的函数节点与第一剩余关联函数节点之间的第二子连接关系,并根据第二子连接关系,确定与第三链表中存储的函数节点关联的第二子关联函数节点,确定第二子关联函数节点是否已经被添加标识。
170.在第二子关联函数节点没有被添加标识的情况下,对其添加第二关联标识,即对其添加第三子标识,并将该第二子关联函数节点存储至第三链表的,并在第三链表中确定
与该第二子关联函数节点关联的函数节点并将其删除,此时,第三链表中被删除了一个原本存储于第三链表的函数节点,同时被增加了一个第二子关联函数节点。或者,在第二子关联函数节点已经被添加标识的情况下,直接在第三链表中确定与该第二子关联函数节点关联的函数节点并将其删除,此时,第三链表中被删除了一个原本存储于第三链表的函数节点,没有新增函数节点、
171.在遍历结束之后,第三链表中存储的函数节点都被删除,此时第三链表中不存在函数节点,即可生成标识函数关系调用图。
172.沿用上例,紫色链表中存储的函数节点为d、g、h,从紫色链表的首部开始遍历,确定d函数节点关联的第三关联函数节点为i函数节点,i函数节点的标识状态为未标识状态,此时将i函数节点添加紫色标识,并将i函数节点存储至紫色链表尾部,同时从紫色链表中删除d函数节点,此时紫色链表中存储的函数节点为g、h、i,继续遍历,确定g函数节点关联的第三关联函数节点为e函数节点,e函数节点的标识状态为已标识状态,此时直接从紫色链表中删除g函数节点,此时紫色链表中存储的函数节点为h、i。遍历结束之后,紫色链表中的函数节点均被删除,紫色链表中不存在函数节点,此时即可生成标识函数关系调用图。
173.综上,通过对第三链表中存储的函数节点关联的第二子关联函数节点的标识状态进行判断,实现了对未被标识的函数节点的检查,防止遗漏未被标识的函数节点,提高生成的标识函数关系调用图的准确度。
174.进一步地,在第三链表中不存在函数节点之后,为了进一步检查是否存在被遗漏的函数节点,为后续确定判断函数的插入位置提供基础,可以再对第二链表进行遍历,具体实现方式如下:
175.遍历所述第二链表,在所述当前函数关系调用图中确定与所述第二链表中存储的函数节点具有入边连接关系的第二入边函数节点;
176.判断所述第二入边函数节点的标识是否为所述第一子标识;
177.若是,执行所述遍历所述第二链表步骤;
178.若否,在所述第二链表中存储的函数节点和所述第二入边函数节点之间添加新增函数节点,并针对所述新增函数节点添加所述第二关联标识,执行所述遍历所述第二链表步骤。
179.其中,入边连接关系指的是指向第二链表中存储的函数节点的连接关系。
180.基于此,遍历第二链表,在当前函数关系调用图中确定指向第二链表中存储的函数节点的第二入边函数节点,判断第二入边函数节点的标识是否为第一子标识,若是,则继续遍历。
181.若否,则在该第二入边函数节点和第二入边函数节点指向的第二链表中存储的函数节点之间添加新增函数节点,即,使第二入边函数节点指向新增函数节点,第二链表中存储的函数节点指向新增函数节点,实质上是将第二链表中存储的函数节点拆分成函数节点本身和新增函数节点,并针对新增函数节点添加第二关联标识,即添加第三子标识。
182.沿用上例,绿色链表中存储有函数节点b、c、e、f,遍历第二链表,确定指向e函数节点的第二入边函数节点为a函数节点,a函数节点的标识为第一子标识蓝色标识,继续遍历。当g函数节点出边连接b函数节点时,指向函数节点b的第二入边函数节点g的标识为紫色标识,此时在g函数节点和b函数节点之间添加q新增函数节点,使g函数节点指向q新增函数节
点,b函数节点指向q新增函数节点,并对q新增函数节点添加紫色标识。
183.综上,通过遍历第二链表,确定指向第二链表中存储的函数节点的第二入边函数节点是否被添加第一子标识,为后续确定判断函数的插入位置提供有利条件,在添加一个新增函数节点之后,判断函数的插入位置为第二链表中存储的函数节点处,在后续应用过程中,第二链表中存储的函数节点对应的函数调用新增函数节点对应的函数。
184.步骤108,根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。
185.具体的,通过以添加了第一类型标识的原函数节点为源头,根据原函数节点与关联函数节点之间的连接关系,对关联函数节点添加第二类型标识,生成标识函数关系调用图之后,可以根据标识函数关系调用图,确定目标程序的目标函数调用关系,在其原有的函数调用关系中插入判断函数,以使目标程序更新版本在应用过程中能够确定目标程序要调用原函数路径还是调用功能函数路径。
186.其中,函数调用关系指的是目标程序中的函数之间的调用关系。
187.基于此,根据标识函数关系调用图,更新目标程序中的函数之间的调用关系。
188.进一步的,为了提高目标程序在应用阶段的性能,并减少目标程序调用资源的开销,可以根据标识函数关系调用图,确定判断函数的插入位置,具体实现方式如下:
189.确定所述目标程序对应的函数集合;
190.根据所述标识函数关系调用图在所述函数集合中添加判断函数,根据添加结果生成目标函数集合;
191.根据所述标识函数关系调用图,确定所述目标函数集合对应的目标函数调用关系。
192.其中,所述判断函数用于判断所述目标函数调用关系中的目标函数的调用状态。
193.其中,目标程序对应的函数集合指的是实现目标程序的所有功能需要用到的所有函数的集合,目标函数集合指的是在函数集合中添加了判断函数之后得到的函数集合,目标集合对应的目标函数调用关系即为在函数中插入了判断函数之后的函数之间的调用关系。判断函数指的是用于判断当前调用的功能运行路径是原函数路径还是功能函数路径的函数。目标函数调用关系可以与目标程序实现的功能对应。
194.具体的,可以确定目标程序实现的所有功能对应的所有函数的集合,根据标识函数关系调用图,在该集合中添加判断函数,生成包含有判断函数的目标函数集合,根据标识函数关系调用图,确定该目标函数集合中包含的所有目标函数之间构成的目标函数调用关系。
195.基于此,根据标识函数关系调用图,确定函数节点的标识类型,在确定函数节点的标识类型为第二子标识的情况下,在该函数节点处确定插入位置,或者在标识类型为第一子标识的函数节点和标识类型为第二子标识的函数节点之间确定插入位置,在插入位置入插入判断函数,以此更新了目标程序更新版本的函数调用关系,得到了目标函数调用关系。
196.举例而言,目标程序原始版本对应的功能为“选择照片-发送照片”,该功能对应的函数调用关系为“a函数-b函数”,即原函数路径,目标程序更新版本对应的功能为“选择照片-编辑照片-发送照片”,该功能对应的函数调用关系为“a函数-c函数-b函数”,即功能函数路径,其中,“编辑照片”为目标程序更新的功能,a函数和b函数为添加第一子标识的原函
数节点,c函数为添加第二子标识的函数节点,在a函数和c函数之间添加判断函数,判断函数用于根据用户的请求判断当前调用路径为原函数路径还是功能函数路径。
197.实际应用中,判断函数可以基于跳转标签实现。
198.实际应用中,确定了目标程序的目标函数调用关系之后,可以根据目标函数调用关系,确定目标程序调用的函数调用路径,在目标程序不需要使用更新的功能时,目标函数调用关系可以基于判断函数,确定目标程序调用的函数调用路径为不调用与更新的功能对应的新增函数的路径,也即是说,确定目标程序调用原函数路径;在目标程序需要使用更新的功能时,目标函数调用关系可以基于判断函数,确定目标程序调用的函数调用路径为与更新的功能对应的新增函数的路径,也即是说,确定目标程序调用新增的函数路径。
199.沿用上例,在目标程序需要调用“编辑照片”的功能时,目标调用路径中的判断函数可以确定目标程序调用的路径为该更新的功能对应的函数调用路径,即“a函数-c函数-b函数”,在目标程序不需要调用“编辑照片”的功能,只需要调用“选择照片-发送照片”的功能时,标调用路径中的判断函数可以确定目标程序调用的路径为原函数路径,即“a函数-b函数”。
200.综上,通过根据标识函数关系调用图确定目标函数调用关系,进而确定判断函数的插入位置,以实现对目标程序更新版本的函数调用关系的更新,进而实现了目标程序能够基于判断函数判断当前所调用的函数路径,使得目标程序在不需要调用更新功能的情况下,也不需要调用该更新功能对应的函数,而是调用原函数路径,节省调用资源,提高目标程序性能。
201.并且,通过本说明书实施例提供的数据处理方法,对目标程序的更新版本只需要进行一次标识过程,确定判断函数的插入位置并插入判断函数,就可以在后续的应用阶段多次应用,不需要在每次应用之前都进行一次标识过程。
202.本说明书一个实施例提供的数据处理方法,在目标程序的当前函数关系调用图中,确定至少两个原函数节点;为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一;通过对当前函数关系调用图中的原函数节点添加第一类型标识,实现了对当前函数关系调用图中的原函数节点与关联函数节点之间的区分,使得根据添加结果能够确定当前函数关系调用图中剩余的关联函数节点,为后续对当前函数关系调用图中的所有函数节点添加标识提供了有利条件,进一步避免了遗漏当前函数关系调用图中的函数节点。
203.在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添加结果生成标识函数关系调用图;通过确定原函数节点与关联函数节点之间的连接关系,以已经添加第一类型标识的原函数节点作为源头,对与其关联的关联函数节点添加第二类型标识,实现了对当前函数关系调用图中的所有函数节点添加标识,保证了生成标识函数关系调用图的准确性,为后续根据标识函数关系调用图对确定目标函数调用关系提供了基础。
204.根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。实现了在原函数和新增函数之间
插入判断函数,以使目标程序在后续应用过程中,可以根据目标函数调用关系保证目标程序功能的运行,以达到节省调用资源的目的,进一步提高目标程序更新后的性能。
205.下述结合附图2,以本说明书提供的数据处理方法在添加标识过程的应用为例,对所述数据处理方法进行进一步说明。其中,图2示出了本说明书一个实施例提供的一种数据处理方法的处理过程示意图,具体包括以下步骤。
206.对于目标程序更新版本的函数关系调用图,参见图2,其中包含多个函数节点1、2、3、4、5

,在其中确定原函数节点1、2、3、4、5、6,针对原函数节点添加至少一种第一类型标识,其中,针对原函数节点1、2、3添加标识id_1,针对原函数节点4、5添加标识id_2,针对原函数节点6添加标识id_3,具体的,可以根据原函数节点对应的函数类型,确定针对原函数节点添加的标识。原函数节点1、2、3可以为调用函数节点,原函数节点4、5可以为接口函数节点,原函数节点6可以为开关函数节点。根据添加结果在函数关系调用图中确定关联函数节点7、8、9、10


207.创建标识id_1对应的id_1链表,将原函数节点1、2、3存储至id_1链表。遍历id_1链表,确定第一连接关系为函数节点1指向关联函数节点7,函数节点2指向关联函数节点8。根据第一连接关系,确定与函数节点1关联的函数节点7,与函数节点2关联的函数节点8,对函数节点7和8添加标识id_2。在函数关系调用图中确定第一剩余关联函数节点9、10、11。
208.创建id_2链表,将函数节点4、5、7、8存储至id_2链表,遍历id_2链表,确定第二连接关系为函数节点4指向函数节点9,函数节点7指向函数节点11,根据第二连接关系,确定与函数节点4关联的函数节点9,与函数节点7关联的函数节点11,对函数节点9和函数节点11添加标识id_3。创建id_3链表,将函数节点6、11存储至id_3链表。
209.遍历id_3链表,其中的函数节点6关联的函数节点10的标识状态为未标识状态,此时应当对函数节点10添加标识id_3,并将函数节点10存储至id_3链表,同时从id_3链表中删除函数节点6。其中的函数节点11关联的函数节点7处于已标识状态,此时,直接从id_3链表中删除函数节点11。直至id_3链表中的所有函数节点均被删除,id_3链表中不存在函数节点。
210.此时,对id_2链表进行遍历,id_2链表中存储了函数节点4、5、7、8,指向函数节点4的函数节点3的标识为id_1,指向函数节点7的函数节点1的标识为id_1,指向函数节点8的函数节点2的标识为id_1,并不存在指向函数节点5的函数节点,此时id_2链表中的所有函数节点的入边连接函数节点的标识均为id_1,结束遍历,完成对函数关系调用图的标识过程。
211.基于此,参见图2,已经生成了与函数关系调用图对应的标识函数关系调用图,标识函数关系调用图中的全部函数节点均已被标识。
212.本说明书实施例提供的上述数据处理方法,通过以添加了标识id_1的原函数节点为源头,依次确定原函数节点与关联函数节点之间的连接关系,进而根据连接关系对关联函数节点添加标识id_2和id_3,生成标识函数关系调用图,提高了生成的标识函数关系调用图的准确率,避免了遗漏,对于包含有复杂函数关系的函数关系调用图也能准确的确定判断函数的插入位置,为后续目标程序在应用阶段基于判断函数判断调用函数路径提供了有利条件,进一步节省了调用资源,提高了目标程序的性能。
213.下述结合附图3,以本说明书提供的数据处理方法在染色过程的应用为例,对所述
数据处理方法进行进一步说明。其中,图3示出了本说明书一个实施例提供的另一种数据处理方法应用于染色的处理过程流程图,具体包括以下步骤。
214.步骤302,在对应目标程序更新版本的有向图中,确定原函数节点。
215.在对应目标程序更新版本的有向图中,包含函数节点1、2、3、4、5、6,确定原函数节点1、2、3。
216.步骤304,对有向图中的原函数节点进行遍历,根据遍历结果确定原函数节点对应的调用函数类型、开关函数类型和接口函数类型。
217.根据遍历结果,确定原函数节点1对应调用函数类型,确定原函数节点2对应开关函数类型,确定原函数节点3对应接口函数类型。
218.步骤306,基于函数类型与第一类型标识之间的对应关系,确定调用函数类型对应的蓝色标识,接口函数类型对应的绿色标识,以及开关函数类型对应的紫色标识。
219.步骤308,针对调用函数节点添加蓝色标识,针对接口函数节点添加绿色标识,针对开关函数节点添加紫色标识。
220.将调用函数类型对应的调用函数节点1染成蓝色,将接口函数类型对应的接口函数节点3染成绿色,将开关函数类型对应的开关函数节点2染成紫色。
221.步骤310,根据添加结果在有向图中确定关联函数节点。
222.根据染色结果,在有向图中确定关联函数节点4、5、6。
223.步骤312,创建蓝色标识对应的蓝色链表,将调用函数节点存储至蓝色链表。
224.创建蓝色链表,将染成蓝色的函数节点1存储至蓝色链表。
225.步骤314,遍历蓝色链表,在有向图中确定调用函数节点与关联函数节点之间的第一连接关系。
226.遍历蓝色链表,确定第一连接关系为函数节点1指向关联函数节点4。
227.步骤316,根据第一连接关系在关联函数节点中确定与调用函数节点关联的第一关联函数节点。
228.根据第一连接关系,确定与函数节点1关联的第一关联函数节点4。
229.步骤318,针对第一关联函数节点添加绿色标识。
230.将第一关联函数节点4染成绿色。
231.步骤320,在有向图中确定第一剩余关联函数节点。
232.在有向图中确定第一剩余关联函数节点5、6。
233.步骤322,创建绿色标识对应的绿色链表,将接口函数节点和第一关联函数节点存储至绿色链表。
234.创建绿色链表,将接口函数节点3和第一关联函数节点4存储至绿色链表。
235.步骤324,遍历绿色链表,在有向图中确定第二链表存储的函数节点与第一剩余关联函数节点之间的第二连接关系。
236.遍历绿色链表,确定接口函数节点4与第一剩余关联函数节点5、6均不存在连接关系,确定第二连接关系为第一关联函数节点4指向第一剩余关联函数节点5。
237.步骤326,根据第二连接关系,在第一剩余关联函数节点中分别确定与第一关联函数节点和接口函数节点关联的第二关联函数节点。
238.根据第二连接关系,确定与第一关联函数节点4关联的第二关联函数节点5。
239.步骤328,针对第二关联函数节点添加紫色标识。
240.将第二关联函数节点5染成紫色。
241.步骤330,创建所述紫色标识对应的紫色链表,将开关函数节点和第二关联函数节点存储至紫色链表。
242.创建紫色链表,将开关函数节点2和第二关联函数节点5存储至紫色链表。
243.步骤332,遍历紫色链表,在有向图中确定紫色链表存储的函数节点与关联函数节点之间的第三连接关系。
244.遍历紫色链表,确定第三连接关系为开关函数节点2指向函数节点6,函数节点4指向第二关联函数节点5。
245.步骤334,根据第三连接关系,在关联函数节点中分别确定与第二关联函数节点和开关函数节点关联的第三关联函数节点。
246.根据第三连接关系,确定与开关函数节点2关联的第三关联函数节点6,与第二关联函数节点5关联的第三关联函数节点4。
247.步骤336,遍历紫色链表,确定第三关联函数节点的标识状态。
248.第三关联函数节点6的标识状态为未标识状态,第三关联函数节点4的标识状态为已标识状态。
249.步骤338,对第三关联函数节点添加紫色标识,将第三关联函数节点存储至紫色链表,在紫色链表中确定函数节点并删除;或者,在紫色链表中确定函数节点并删除。
250.其中,在第三关联函数节点的标识状态为未标识状态的情况下,对第三关联函数节点添加紫色标识,将所述第三关联函数节点存储至紫色链表,在紫色链表中确定与第三关联函数节点关联的函数节点并删除;或者,在第三关联函数节点的标识状态为已标识状态的情况下,在紫色链表中确定与第三关联函数节点关联的函数节点并删除。
251.将第三关联函数节点6染成紫色,并存储至紫色链表,在紫色链表中删除开关函数节点2和第二关联函数节点5。
252.步骤340,在紫色链表中不存在函数节点的情况下,遍历绿色链表,在有向图中确定与绿色链表中存储的函数节点具有入边连接关系的第二入边函数节点。
253.绿色链表中存储有函数节点3和函数节点4,函数节点1指向函数节点4,也即是说,函数节点4具有入边连接关系的第二入边函数节点为函数节点1,函数节点2指向函数节点3,也即是说,函数节点3具有入边连接关系的第二入边函数节点为函数节点2。
254.步骤342,判断第二入边函数节点的标识是否为蓝色标识,若是,执行所述遍历所述第二链表步骤。
255.函数节点1为蓝色,继续遍历。
256.步骤344,若否,在绿色链表中存储的函数节点和第二入边函数节点之间添加新增函数节点,并针对新增函数节点添加紫色标识。
257.函数节点2不为蓝色,在函数节点2和函数节点3之间添加新增函数节点7,并将新增函数节点7染成紫色。
258.步骤346,根据添加结果生成标识有向图。
259.步骤348,根据标识有向图,确定插入位置。
260.确定的插入位置为染成蓝色的函数节点1和染成绿色的函数节点3之间,以及染成
蓝色的函数节点1和染成绿色的函数节点4之间。
261.步骤350,在插入位置插入判断函数,对目标程序更新版本的函数调用关系进行更新。
262.本说明书实施例提供的上述数据处理方法,通过以添加了蓝色标识的原函数节点为源头,依次确定原函数节点与关联函数节点之间的连接关系,进而根据连接关系对关联函数节点添加绿色标识以及紫色标识,生成标识函数关系调用图,提高了生成的标识函数关系调用图的准确率,避免了遗漏,对于包含有复杂函数关系的函数关系调用图也能准确的确定判断函数的插入位置,为后续目标程序在应用阶段基于判断函数判断调用函数路径提供了有利条件,进一步节省了调用资源,提高了目标程序的性能。
263.与上述方法实施例相对应,本说明书还提供了数据处理装置实施例,图4示出了本说明书一个实施例提供的一种数据处理装置的结构示意图。如图4所示,该装置包括:
264.确定模块402,被配置为在目标程序的当前函数关系调用图中,确定至少两个原函数节点;
265.第一标识模块404,被配置为为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一;
266.第二标识模块406,被配置为在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添加结果生成标识函数关系调用图;
267.更新模块408,被配置为根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。
268.一个可选的实施例中,所述第一标识模块404,进一步被配置为:
269.对所述当前函数关系调用图中的至少两个原函数节点进行遍历,根据遍历结果确定所述第一原函数节点的函数类型;
270.基于预设的函数类型与第一类型标识之间的对应关系,确定所述函数类型对应的第一类型标识;
271.为所述第一原函数节点添加与所述函数类型对应的第一类型标识。
272.一个可选的实施例中,所述第一标识模块404,进一步被配置为:
273.在所述函数类型包括调用函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识;或者,
274.在所述函数类型包括调用函数类型和接口函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识,以及为对应所述接口函数类型的第一原函数节点添加第二子标识;或者,
275.在所述函数类型包括调用函数类型和开关函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识,以及为对应所述开关函数类型的第一原函数节点添加第三子标识;或者,
276.在所述函数类型包括调用函数类型、接口函数类型以及开关函数类型的情况下,为对应所述调用函数类型的第一原函数节点添加第一子标识,为对应所述接口函数类型的第一原函数节点添加第二子标识,以及为对应所述开关函数类型的第一原函数节点添加第
三子标识。
277.一个可选的实施例中,所述第二标识模块406,进一步被配置为:
278.遍历所述当前函数关系调用图,确定所述至少两个原函数节点与所述关联函数节点之间的第i连接关系,根据所述第i连接关系为所述关联函数节点添加第j标识,得到第j标识函数节点,其中i、j从1取值且i为正整数;
279.判断所述当前函数关系调用图是否存在剩余的关联函数节点;
280.若是,i、j自增1,并执行所述遍历所述当前函数关系调用图步骤;
281.若否,在所述当前函数关系调用图中确定与所述第j标识函数节点具有连接关系的第j标识关联函数节点的标识状态,在所述标识状态为未标识状态的情况下,针对所述第j标识关联函数节点添加第j+1标识,直至第j标识关联函数节点的标识状态都为已标识状态,执行根据添加结果生成标识函数关系调用图步骤。
282.一个可选的实施例中,所述第二标识模块406,进一步被配置为:
283.根据所述连接关系中的第一连接关系,在所述关联函数节点中确定与所述调用函数类型对应的第一原函数节点关联的第一关联函数节点;
284.为所述第一关联函数节点添加第一关联标识,在所述当前函数关系调用图中确定第一剩余关联函数节点;
285.根据所述连接关系中的第二连接关系,在所述第一剩余关联函数节点中确定第一子关联函数节点和第二子关联函数节点,为所述第一子关联函数节点和所述第二子关联函数节点添加第二关联标识。
286.一个可选的实施例中,所述第二标识模块406,进一步被配置为:
287.在所述第二子标识和所述第一关联标识相同的情况下,根据所述连接关系中的第一子连接关系,在所述第一剩余关联函数节点中分别确定与所述第一关联函数节点关联的第一子关联函数节点、以及与所述接口函数类型对应的第一原函数节点关联的第一子关联函数节点;
288.在所述第三子标识和所述第二关联标识相同的情况下,根据所述连接关系中的第二子连接关系,在所述第一剩余关联函数节点中分别确定与所述第一子关联函数节点关联的第二子关联函数节点、以及与所述开关函数类型对应的第一原函数节点关联的第二子关联函数节点。
289.一个可选的实施例中,所述第二标识模块406,进一步被配置为:
290.创建所述第一子标识对应的第一链表,将所述调用函数类型对应的第一原函数节点存储至所述第一链表;
291.遍历所述第一链表,在所述当前函数关系调用图中确定所述调用函数类型对应的第一原函数节点与所述关联函数节点之间的第一连接关系。
292.一个可选的实施例中,所述第二标识模块406,进一步被配置为:
293.创建所述第二子标识对应的第二链表,将所述接口函数类型对应的第一原函数节点和所述第一关联函数节点存储至所述第二链表;
294.遍历所述第二链表,在所述当前函数关系调用图中确定所述第二链表存储的函数节点与所述第一剩余关联函数节点之间的第一子连接关系。一个可选的实施例中,所述第二标识模块406,进一步被配置为:
295.创建所述第三子标识对应的第三链表,将所述开关函数类型对应的第一原函数节点和所述第一子关联函数节点存储至所述第三链表;
296.遍历所述第三链表,在所述当前函数关系调用图中确定所述第三链表存储的函数节点与所述第一剩余关联函数节点之间的第二子连接关系。
297.一个可选的实施例中,所述第二标识模块406,进一步被配置为:
298.遍历所述第三链表,确定所述第二子关联函数节点的标识状态;
299.在所述第二子关联函数节点的标识状态为未标识状态的情况下,对所述第二子关联函数节点添加第二关联标识,将所述第二子关联函数节点存储至所述第三链表,在所述第三链表中确定与所述第二子关联函数节点关联的函数节点并删除;或者,
300.在所述第二子关联函数节点的标识状态为已标识状态的情况下,在所述第三链表中确定与所述第二子关联函数节点关联的函数节点并删除;
301.在所述第三链表中不存在函数节点的情况下,执行根据添加结果生成标识函数关系调用图。
302.一个可选的实施例中,所述第二标识模块406,进一步被配置为:
303.遍历所述第二链表,在所述当前函数关系调用图中确定与所述第二链表中存储的函数节点具有入边连接关系的第二入边函数节点;
304.判断所述第二入边函数节点的标识是否为所述第一子标识;
305.若是,执行所述遍历所述第二链表步骤;
306.若否,在所述第二链表中存储的函数节点和所述第二入边函数节点之间添加新增函数节点,并针对所述新增函数节点添加所述第二关联标识,执行所述遍历所述第二链表步骤。
307.一个可选的实施例中,所述更新模块408,进一步被配置为:
308.确定所述目标程序对应的函数集合;
309.根据所述标识函数关系调用图在所述函数集合中添加判断函数,根据添加结果生成目标函数集合;
310.根据所述标识函数关系调用图,确定所述目标函数集合对应的目标函数调用关系。
311.其中,所述判断函数用于判断所述目标函数调用关系中的目标函数的调用状态。
312.本说明书一个实施例提供的数据处理装置,在目标程序的当前函数关系调用图中,确定至少两个原函数节点;为所述至少两个原函数节点中的第一原函数节点添加第一类型标识,根据添加结果在所述当前函数关系调用图中确定关联函数节点,其中,所述第一原函数节点为所述至少两个原函数节点之一;通过对当前函数关系调用图中的原函数节点添加第一类型标识,实现了对当前函数关系调用图中的原函数节点与关联函数节点之间的区分,使得根据添加结果能够确定当前函数关系调用图中剩余的关联函数节点,为后续对当前函数关系调用图中的所有函数节点添加标识提供了有利条件,进一步避免了遗漏当前函数关系调用图中的函数节点。
313.在所述当前函数关系调用图中确定所述至少两个原函数节点与所述关联函数节点之间的连接关系,并根据所述连接关系为所述关联函数节点添加第二类型标识,根据添加结果生成标识函数关系调用图;通过确定原函数节点与关联函数节点之间的连接关系,
以已经添加第一类型标识的原函数节点作为源头,对与其关联的关联函数节点添加第二类型标识,实现了对当前函数关系调用图中的所有函数节点添加标识,保证了生成标识函数关系调用图的准确性,为后续根据标识函数关系调用图对确定目标函数调用关系提供了基础。
314.根据所述标识函数关系调用图,确定所述目标程序的目标函数调用关系,其中,所述函数调用关系用于确定所述目标程序的函数调用路径。实现了在原函数和新增函数之间插入判断函数,以使目标程序在后续应用过程中,可以根据目标函数调用关系保证目标程序功能的运行,以达到节省调用资源的目的,进一步提高目标程序更新后的性能。上述为本实施例的一种数据处理装置的示意性方案。需要说明的是,该数据处理装置的技术方案与上述的数据处理方法的技术方案属于同一构思,数据处理装置的技术方案未详细描述的细节内容,均可以参见上述数据处理方法的技术方案的描述。
315.图5示出了根据本说明书一个实施例提供的一种计算设备500的结构框图。该计算设备500的部件包括但不限于存储器510和处理器520。处理器520与存储器510通过总线530相连接,数据库550用于保存数据。
316.计算设备500还包括接入设备540,接入设备540使得计算设备500能够经由一个或多个网络560通信。这些网络的示例包括公用交换电话网(pstn)、局域网(lan)、广域网(wan)、个域网(pan)或诸如因特网的通信网络的组合。接入设备540可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(nic))中的一个或多个,诸如ieee802.11无线局域网(wlan)无线接口、全球微波互联接入(wi-max)接口、以太网接口、通用串行总线(usb)接口、蜂窝网络接口、蓝牙接口、近场通信(nfc)接口,等等。
317.在本说明书的一个实施例中,计算设备500的上述部件以及图5中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图5所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
318.计算设备500可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或pc的静止计算设备。计算设备500还可以是移动式或静止式的服务器。
319.其中,处理器520用于执行如下计算机可执行指令,该计算机可执行指令被处理器执行时实现上述数据处理方法的步骤。
320.上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的数据处理方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述数据处理方法的技术方案的描述。
321.本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现上述数据处理方法的步骤。
322.上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的数据处理方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述数据处理方法的技术方案的描述。
323.本说明书一实施例还提供一种计算机程序,其中,当所述计算机程序在计算机中执行时,令计算机执行上述数据处理方法的步骤。
324.上述为本实施例的一种计算机程序的示意性方案。需要说明的是,该计算机程序的技术方案与上述的数据处理方法的技术方案属于同一构思,计算机程序的技术方案未详细描述的细节内容,均可以参见上述数据处理方法的技术方案的描述。
325.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
326.所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
327.需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书实施例并不受所描述的动作顺序的限制,因为依据本说明书实施例,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书实施例所必须的。
328.在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
329.以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书实施例的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书实施例的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1