数据的处理方法、装置、存储介质和电子装置与流程

文档序号:17260912发布日期:2019-03-30 09:39阅读:126来源:国知局
数据的处理方法、装置、存储介质和电子装置与流程

本发明涉及计算机领域,具体而言,涉及一种数据的处理方法、装置、存储介质和电子装置。



背景技术:

目前,在数据处理中,会修改函数功能,向函数注入目标代码,比如,通过面向对象编程语言(java)编译生成的二进制文件(class文件)在无源码的情况下,修改函数功能,会注入java字节码。

在向函数注入目标代码并且保存为class文件之后,与目标代码相对应的注入代码发射调用的函数,会一直在class文件中多次运行,这样增加了输出调用关系日志的次数,增大了日志分析量,从而加了对代码进行分析的成本。

针对上述对数据进行处理的成本大的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种数据的处理方法、装置、存储介质和电子装置,以至少解决相关技术中对数据进行处理的成本高的技术问题。

根据本发明实施例的一个方面,提供了一种数据的处理方法。该方法包括:在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态;在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。

根据本发明实施例的另一方面,还提供了一种数据的处理装置。该装置包括:第一获取单元,用于在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态;第一处理单元,用于在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;第二处理单元,用于在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,使第一目标函数中的目标代码未执行。

根据本发明实施例的另一方面,还提供了一种存储介质。该存储介质中存储有计算机程序,其中,计算机程序被设置为运行时执行本发明实施例中的数据的处理方法。

根据本发明实施例的另一方面,还提供了一种电子装置。该电子装置包括存储器和处理器,存储器中存储有计算机程序,处理器被设置为通过计算机程序执行本发明实施例中的数据的处理方法。

在本发明实施例中,在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态;在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。由于目标数组中的不同数组元素分别用于指示目标代码在不同目标函数中的执行状态,并以此作为判断条件,在目标代码在目标函数中处于未执行的状态的情况下,执行目标代码,在目标代码在目标函数中处于已执行的状态的情况下,不再执行目标代码,实现了在目标函数中仅执行一次目标代码,而不导致调用的目标代码仅在全局只执行一次的目的,从而实现了降低对数据进行处理的成本的技术效果,进而解决了相关技术中对数据进行处理的成本高的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的一种数据的处理方法的硬件环境的示意图;

图2是根据本发明实施例的一种数据的处理方法的流程图;

图3是根据本发明实施例的一种向被注入函数注入代码的方法的流程图;

图4是根据本发明实施例的一种函数调用的方法的流程图;

图5是根据本发明实施例的另一种向被注入函数注入代码的方法的流程图;

图6是根据本发明实施例的另一种函数调用的方法的流程图;

图7是根据本发明实施例的一种代码向被注入函数注入的方法的流程图;

图8是根据本发明实施例的一种调用函数运行的方法的流程图;

图9是根据本发明实施例的一种数据的处理装置的示意图;以及

图10是根据本发明实施例的一种电子装置的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

根据本发明实施例的一个方面,提供了一种数据的处理方法的实施例。

作为一种可选的实施方式,上述数据的处理方法可以但不限于应用于如图1所示的环境中。用户102可以与用户设备104之间可以进行数据交互,用户设备104中可以但不限于包括存储器106和处理器108。用户设备104获取目标代码,可以通过存储器106存储目标代码,并通过处理器执行步骤s102,通过网络110将上述目标代码发送给服务器112。服务器112中包含有数据库114和处理器116。服务器112在获取目标代码之后,在向数据库114存储的目标程序的第一目标函数注入目标代码时,通过处理器116获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态,在处理器116运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态,在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。服务器112通过步骤s104,通过网络110将目标代码在第一目标函数中执行一次的结果返回给用户设备104。

作为一种可选的示例,上述获取目标数组中的第一数组元素,在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态,在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行也可由用户设备104执行。

需要说明的是,在相关技术中,在数据处理中时,采用的方法通常是在向函数注入目标代码并且保存为class文件之后,与目标代码相对应的注入代码发射调用的函数,会一直在class文件中多次运行。然而,采用上述方法,增加了输出调用关系日志的次数,增大了日志分析量,从而加了对代码进行分析的成本。而本实施例中,目标数组中的不同数组元素分别用于指示目标代码在不同目标函数中的执行状态,并以此作为判断条件,在目标代码在目标函数中处于未执行的状态的情况下,执行目标代码,在目标代码在目标函数中处于已执行的状态的情况下,不再执行目标代码,实现了在目标函数中仅执行一次目标代码,而不导致调用的目标代码仅在全局只执行一次的目的,从而达到了降低对数据进行处理的成本的技术效果。

可选地,上述数据的处理方法可以但不限于应用于可以计算数据的终端上,例如手机、平板电脑、笔记本电脑、pc机等终端上,上述网络可以包括但不限于无线网络或有线网络。其中,该无线网络包括:wifi及其他实现无线通信的网络。上述有线网络可以包括但不限于:广域网、城域网、局域网。上述服务器可以包括但不限于任何可以进行计算的硬件设备。

图2是根据本发明实施例的一种数据的处理方法的流程图。如图2所示,该方法可以包括以下步骤:

步骤s202,在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素。

在本申请上述步骤s202提供的技术方案中,在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态。

在该实施例中,在对数据进行处理的过程中,在无源码的情况下,修改目标程序中的目标函数的功能逻辑,向目标函数注入目标代码。其中,目标程序为全局被注入目标代码的函数所在的程序,可以为java程序。可选地,对java程序进行编译生成的class文件在无源码的情况下,修改函数功能逻辑,注入java字节码,其中,class文件为java程序提供独立于底层主机平台的二进制形式的服务。

该实施例的目标程序可以包括多个不同的目标函数,每个目标函数都可以注入目标代码,也即,目标函数为被注入函数,向目标代码注入目标函数可以为动态注入,也可以为静态注入,其中,动态注入为在不修改源代码的前提下,向第三方的java程序里注入代码逻辑的,静态注入可以是向静态成员变量赋值,可选地,该实施例的目标代码可以向目标函数静态注入、动态运行。

在该实施例中,多个不同的目标函数包括第一目标函数,该第一目标函数为当前需要注入目标代码的函数,在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,该目标数组可以为静态全局条件变量dirty数组,也即,为执行状态静态全局数组,其中包括多个数组元素,每个数组元素可以用于指示目标代码在对应的目标函数中的执行状态,每个数组元素与对应的目标函数一一关联,比如,第一数组元素dirty[1]与第一目标函数相关联,第二数组元素dirty[2]与第二目标函数相关联。可选地,目标数组的下标为目标变量,该目标变量可以为注入次数计数uuid,以确保目标代码注入的目标函数的全局唯一性。

在该实施例中,第一数组元素可以用于指示目标代码在对应的第一目标函数中的执行状态,执行状态包括目标代码在对应的目标函数中为已执行的状态和目标代码在对应的目标函数中为未执行的状态。可选地,目标数组中的每个数组元素在默认状态下,都用于指示目标代码在对应的目标函数中为未执行的状态。

步骤s204,在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态。

在本申请上述步骤s204提供的技术方案中,在获取目标数组中的第一数组元素之后,在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态。

在该实施例中,第一数组元素为静态全局条件变量,在运行第一目标函数时,比如,在第一次运行第一目标函数时,也即,在第一次进入第一目标函数时,判断第一数组元素是否指示出目标代码在第一目标函数中处于未执行的状态,比如,判断第一目标函数中与目标代码对应的函数功能代码逻辑是否为未执行的状态,可以通过判断第一数组元素的逻辑值来确定目标代码在第一目标函数中所处的状态。如果判断出第一数组元素指示出目标代码在第一目标函数中处于未执行的状态,比如,如果判断出第一数组元素的逻辑值为逻辑假(false),则确定目标代码在第一目标函数中处于未执行的状态,则执行一次第一目标函数中的目标代码,比如,在第一目标函数中执行一次与目标代码对应的函数功能代码逻辑,可以为在第一目标函数中执行一次注入代码反射调用的函数,输出调用关系,其中,反射为java程序开发语言的特征之一,允许运行中的java程序获取自身的信息,并且可以操作类或对象的内部属性。

在执行一次第一目标函数中的目标代码结束时,对目标代码在第一目标函数中的执行状态已经改变,可以将第一数组元素的逻辑假修改为逻辑真(true),以指示将目标代码在第一目标函数中的未执行的状态更新为已执行的状态。

步骤s206,在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。

在本申请上述步骤s206提供的技术方案中,在获取目标数组中的第一数组元素之后,在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。

在该实施例中,在获取目标数组中的第一数组元素之后,如果判断出第一数组元素指示出目标代码在第一目标函数中处于已执行的状态,比如,如果判断出第一目标函数中与目标代码对应的函数功能代码逻辑为已执行的状态,则不再执行第一目标函数中的目标代码,此时第一目标函数可以直接返回,可以不运行后续函数功能代码逻辑。

可选地,在第一次运行第一目标函数,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态之后,在第二次运行第一目标函数时,第一数组元素已经指示目标代码在第一目标函数中处于已执行的状态,则不再执行第一目标函数中的目标代码,此时第一目标函数可以直接返回,可以不运行后续函数功能代码逻辑。第三次运行第一目标函数时的执行逻辑与第二次运行第一目标函数的执行逻辑相同,以此类推,从而达到注入代码反射调用的函数只执行一次、输出一次调用关系的目的,从而减少输出调用关系日志的次数,减少日志分析量,减少对代码运行效率的影响。

可选地,目标程序中的除第一目标函数之外的其它目标函数,在注入目标代码、且执行目标代码时的方法与第一目标函数的流程相同,其中,每个目标函数中的条件变量为与目标函数对应的数组元素,该条件变量用于指示目标代码在目标函数中的执行状态,从而保证了在注入目标代码的目标函数中,调用的目标代码只执行一次,而不会导致目标代码在全局只执行一次,比如,保证了在注入代码的位置所调用的函数功能代码逻辑只执行一次,而不会导致调用的函数功能代码逻辑在全局只执行一次。

举例而言,该实施例可以用于通过无源码分析java调用关系,在向java程序的第一目标函数注入java字节码时,获取dirty数组中的第一数组元素dirty[1];在第一运行第一目标函数时,在第一数组元素dirty[1]为假的情况下,确定java字节码在第一目标函数中处于未执行的状态,比如,确定与java字节码对应的函数功能代码逻辑处于未执行状态,则执行一次第一目标函数中的java字节码,比如,执行一次与java字节码对应的函数功能代码逻辑,输出一次调用关系,并将java字节码在第一目标函数中的未执行的状态更新为已执行的状态;在第二次运行第一目标函数时,在第一数组元素dirty[1]为逻辑真的情况下,确定java字节码在第一目标函数中处于已执行的状态,比如,确定与java字节码对应的函数功能代码逻辑处于已执行状态,则不在第一目标函数中执行java字节码,此时函数直接返回,不执行任何函数功能代码逻辑,从而达到获取的调用关系在第一目标函数中只输出一次,进而减少分析工作量,降低了对数据进行处理的成本。

可选地,java程序中的除第一目标函数之外的其它目标函数,在注入目标代码、且执行目标代码时的方法与第一目标函数相同的流程相同,其中,每个目标函数中的静态全局条件变量为与目标函数对应的dirty数组元素,比如,第二目标函数中的静态全局条件变量为dirty[2],第三目标函数中的静态全局条件变量为dirty[3],以此类推,其中,条件变量用于指示java字节码在对应的目标函数中的执行状态,从而保证了在注入的java字节码的位置所调用的函数功能代码逻辑只执行一次,而不会导致调用的函数功能代码逻辑在全局只执行一次。

在目标代码向第一目标函数注入完成之后,将其保存为class文件,以为目标程序提供独立于底层主机平台的二进制形式的服务。

通过上述步骤s202至步骤s206,在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态;在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。由于目标数组中的不同数组元素分别用于指示目标代码在不同目标函数中的执行状态,并以此作为判断条件,在目标代码在目标函数中处于未执行的状态的情况下,执行目标代码,在目标代码在目标函数中处于已执行的状态的情况下,不再执行目标代码,实现了在目标函数中仅执行一次目标代码,而不导致调用的目标代码仅在全局只执行一次的目的,从而实现了降低对数据进行处理的成本的技术效果,进而解决了相关技术中对数据进行处理的成本高的技术问题。

作为一种可选的实施方式,在步骤s204,执行一次第一目标函数中的目标代码之后,该方法还包括:在向目标程序的第二目标函数注入目标代码时,将第一数组元素的下标的第一值增加目标值,得到第二值,其中,目标数组中的不同数组元素的下标为目标变量的不同值;获取目标数组中的下标为第二值的第二数组元素;在运行第二目标函数时,在第二数组元素指示目标代码在第二目标函数中处于未执行的状态的情况下,执行一次第二目标函数中的目标代码,并将目标代码在第二目标函数中的未执行的状态更新为已执行的状态;在第二数组元素指示目标代码在第二目标函数中处于已执行的状态的情况下,第二目标函数中的目标代码未执行。

在该实施例中,目标程序包括多个目标函数,除了向目标程序的第一目标函数中注入目标代码之外,还可以向目标程序的第二目标函数注入相同的目标代码。

在该实施例中,目标数组中不同数组元素的下标为目标变量的不同值,可以将目标变量作为传入目标数组的参数,可以在每向目标程序中注入一次目标代码时,将已经确定的目标变量的值增加目标值,将下标为增加目标值后的目标变量的值的数组元素,确定为注入目标代码的目标函数的条件变量,比如,目标数组为dirty数组,已经确定的目标变量的值为a,目标值为a,在当前向目标函数b注入目标代码时,将数组元素dirty[a+a]确定为当前注入目标代码的目标函数b的条件变量,该条件变量用于判断目标代码在目标函数b中的执行状态,从而保证传入参数值的全局唯一性。可选地,该实施例中的目标变量的值可以为向目标程序注入目标代码的次数,也即,目标变量的值为注入次数计数uuid,每向目标程序中的目标函数注入一次目标代码,比如,每向目标程序中的目标函数注入一次java字节码,则注入次数计数值自增1。

在该实施例中,在向目标程序的第二目标函数注入目标代码时,将第一数组元素的下标的第一值增加目标值,得到第二值,将目标数组中下标为第二值的数组元素为第二数组元素,该第二数组元素为静态群安居条件变量,将第二数组元素作为判断目标代码在第二目标函数中的执行状态的静态全局条件变量。在运行第二目标函数时,比如,在第一次运行第二目标函数时,也即,在第一次进入第二目标函数时,判断第二数组元素是否指示出目标代码在第二目标函数中处于未执行的状态,比如,判断第二目标函数中与目标代码对应的函数功能代码逻辑是否为未执行的状态,可以通过判断第二数组元素的逻辑值来确定目标代码在第二目标函数中所处的状态。如果判断出第二数组元素指示出目标代码在第二目标函数中处于未执行的状态,比如,如果判断出第二数组元素的逻辑值为逻辑假,则确定目标代码在第二目标函数中处于未执行的状态,则执行一次第二目标函数中的目标代码,比如,在第二目标函数中执行一次与目标代码对应的函数功能代码逻辑,可以为在第二目标函数中执行一次注入代码反射调用的函数,输出调用关系。

在执行一次第二目标函数中的目标代码之后,对目标代码在第二目标函数中的执行状态已经改变,可以将第二数组元素的逻辑假修改为逻辑真,以指示将目标代码在第二目标函数中的未执行的状态更新为已执行的状态。

在获取目标数组中的第二数组元素之后,如果判断出第二数组元素指示出目标代码在第二目标函数中处于已执行的状态,比如,如果判断出第一目标函数中与目标代码对应的函数功能代码逻辑为已执行的状态,则不再执行第二目标函数中的目标代码,此时第二目标函数可以直接返回,可以不运行后续函数功能代码逻辑。

可选地,在第一次运行第二目标函数,执行一次第二目标函数中的目标代码,并将目标代码在第二目标函数中的未执行的状态更新为已执行的状态之后,在第二次运行第二目标函数时,第二数组元素已经指示目标代码在第二目标函数中处于已执行的状态,则不再执行第二目标函数中的目标代码,此时第二目标函数可以直接返回,可以不运行后续函数功能代码逻辑。第三次运行第二目标函数时的执行逻辑与第二次运行第二目标函数的执行逻辑相同,以此类推,从而达到注入代码反射调用的函数只执行一次、输出一次调用关系的目的,从而减少输出调用关系日志的次数,减少日志分析量,且保证了在注入代码的位置所调用的函数功能代码逻辑只执行一次,而不会导致调用的函数功能代码逻辑在全局只执行一次的效果。

作为一种可选的实施方式,将第一值增加目标值,得到第二值包括:将第一值增加1,得到第二值,其中,目标变量的值用于指示向目标程序注入目标代码的次数。

在该实施例中,目标值可以为1、2、3等数值,其中,在目标变量为注入次数计数uuid的情况下,目标值优选为1,进行注入次数累积,也即,每向目标程序中注入一次目标代码时,注入次数计数的值自增1,作为全局唯一性的注入次数计数能设置注入调用的函数基于注入位置执行一次。在目标值为1的情况下,可以使得目标数组的数组空间不浪费,而当目标值为除1之外的其它数值时,可以通过键-值(key-value)进行数组元素的索引和目标代码在对应的目标函数中的执行状态的映射,从而实现数组元素用于指示目标代码在对应的目标函数中的执行状态。

作为一种可选的实施方式,步骤s204,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态包括:在第一数组元素的值为第一逻辑值的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的第一逻辑值更新为第二逻辑值,其中,在第一数组元素的值为第一逻辑值的情况下,目标代码在第一目标函数中处于未执行的状态,在第一数组元素的值为第二逻辑值的情况下,目标代码在第一目标函数中处于已执行的状态;步骤s206,在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行包括:在第一数组元素的值为第二逻辑值的情况下,第一目标函数中的目标代码未执行。

在该实施例中,目标代码在第一目标函数中所处的状态,可以通过第一数组元素的值进行指示,该第一数组元素的值可以为逻辑值,该逻辑值可以包括第一逻辑值和与第一逻辑值相反的第二逻辑值。可选地,在第一数组元素的值为第一逻辑值的情况下,目标代码在第一目标函数中处于未执行的状态,而在第一数组元素的值为第二逻辑值的情况下,目标代码在第一目标函数中处于已执行的状态。在获取目标数组中的第一数组元素之后,确定第一数组元素的逻辑值,如果第一数组元素的值为第一逻辑值,则说明目标代码在第一目标函数中处于未执行的状态,此时执行一次第一目标函数中的目标代码,并将第一数组元素的第一逻辑值更新为第二逻辑值;如果第一数组元素的值为第二逻辑值,则说明目标代码在第一目标函数中处于已执行的状态,则不再执行第一目标函数中的目标代码,此时第一目标函数可以直接返回,可以不运行后续函数功能代码逻辑,从而达到目标代码在目标函数中只执行一次、输出一次调用关系的目的,进而减少输出调用关系日志的次数,减少日志分析量,降低了对数据进行处理的成本,也保证了在注入目标代码的目标函数中,调用的目标代码只执行一次,而不会导致目标代码在全局只执行一次。

作为一种可选的实施方式,在第一数组元素的值为第一逻辑值的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的第一逻辑值更新为第二逻辑值包括:在第一数组元素的值为逻辑假的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的逻辑假更新为逻辑真;在第一数组元素的值为第二逻辑值的情况下,第一目标函数中的目标代码未执行包括:在第一数组元素的值为逻辑真的情况下,第一目标函数中的目标代码未执行。

在该实施例中,第一逻辑值可以为逻辑假,第二逻辑值可以为逻辑真。可选地,在第一数组元素的值为逻辑假的情况下,目标代码在第一目标函数中处于未执行的状态,而在第一数组元素的值为逻辑真的情况下,目标代码在第一目标函数中处于已执行的状态。在获取目标数组中的第一数组元素之后,确定第一数组元素的逻辑值,如果第一数组元素的值为逻辑假,则说明目标代码在第一目标函数中处于未执行的状态,此时执行一次第一目标函数中的目标代码,并将第一数组元素的逻辑假更新为逻辑真;如果第一数组元素的值为逻辑真,则说明目标代码在第一目标函数中处于已执行的状态,则不再执行第一目标函数中的目标代码,此时第一目标函数可以直接返回,可以不运行后续函数功能代码逻辑,从而达到目标代码在目标函数中只执行一次、输出一次调用关系的目的,进而减少输出调用关系日志的次数,减少日志分析量,降低了对数据进行处理的成本,也保证了在注入目标代码的目标函数中,调用的目标代码只执行一次,而不会导致目标代码在全局只执行一次。

作为一种可选的实施方式,目标数组的数组元素的默认值为逻辑假。

在该实施例中,目标数组的数组元素用于指示目标代码在对应的目标函数中的执行状态。可选地,目标代码在对应的目标函数中的执行状态在一开始均为未执行的状态,将目标数组中的所有数组元素都初始化为用于指示目标代码在第一目标函数中处于未执行的状态,则可以设置目标数组的数组元素的默认值为逻辑假,也即,默认条件值为逻辑假,以指示目标代码在第一目标函数中处于未执行的状态,比如,标记函数功能代码逻辑为未执行的状态。

举例而言,第一次执行函数功能代码逻辑,以传入的目标变量uuid为下标的条件值dirty[uuid]为逻辑假,标记函数功能代码逻辑为未执行的状态,执行函数功能代码逻辑,输出调用关系,最后将条件值dirty[uuid]设置为逻辑真,标记函数功能代码逻辑为已执行的状态;在第二次执行函数功能代码逻辑时,条件值dirty[uuid]已设置为逻辑真,表示函数功能代码逻辑为已执行的状态,此时函数直接返回,不执行任何函数功能代码逻辑,达到注入代码反射调用的函数只执行一次的,且保证了每次在注入的代码位置调用的函数功能代码逻辑时,传入参数值的全局唯一性。

作为一种可选的实施方式,在第一数组元素的值为第一逻辑值的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的第一逻辑值更新为第二逻辑值包括:在第一数组元素的值为逻辑真的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的逻辑真更新为逻辑假;在第一数组元素的值为第二逻辑值的情况下,第一目标函数中的目标代码未执行包括:在第一数组元素的值为逻辑假的情况下,第一目标函数中的目标代码未执行。

在该实施例中,第一逻辑值可以为逻辑真,第二逻辑值可以为逻辑假。在第一数组元素的值为逻辑真的情况下,目标代码在第一目标函数中处于未执行的状态,而在第一数组元素的值为逻辑假的情况下,目标代码在第一目标函数中处于已执行的状态。在获取目标数组中的第一数组元素之后,确定第一数组元素的逻辑值,如果第一数组元素的值为逻辑真,则说明目标代码在第一目标函数中处于未执行的状态,此时执行一次第一目标函数中的目标代码,在执行一次第一目标函数中的目标代码结束时,将第一数组元素的逻辑真更新为逻辑假;如果第一数组元素的值为逻辑假,则说明目标代码在第一目标函数中处于已执行的状态,则不再执行第一目标函数中的目标代码,此时第一目标函数可以直接返回,可以不运行后续函数功能代码逻辑,从而达到目标代码在目标函数中只执行一次、输出一次调用关系的目的,进而减少输出调用关系日志的次数,减少日志分析量,降低了对数据进行处理的成本,也保证了在注入目标代码的目标函数中,调用的目标代码只执行一次,而不会导致目标代码在全局只执行一次。

作为一种可选的实施方式,目标数组的数组元素的默认值为逻辑真。

在该实施例中,目标代码在对应的目标函数中的执行状态在一开始均为未执行的状态,将目标数组中的所有数组元素都初始化为用于指示目标代码在第一目标函数中处于未执行的状态,则可以设置目标数组的数组元素的默认值为逻辑真,也即,默认条件值为逻辑真,以指示目标代码在第一目标函数中处于未执行的状态,比如,标记函数功能代码逻辑为未执行的状态。

举例而言,第一次执行函数功能代码逻辑,以传入的目标变量uuid为下标的条件值dirty[uuid]为逻辑真,标记函数功能代码逻辑为未执行的状态,执行函数功能代码逻辑,输出调用关系,最后将条件值dirty[uuid]设置为逻辑假,标记函数功能代码逻辑为已执行的状态;在第二次执行函数功能代码逻辑时,条件值dirty[uuid]已设置为逻辑假,表示函数功能代码逻辑为已执行的状态,此时函数直接返回,不执行任何函数功能代码逻辑,达到注入代码反射调用的函数只执行一次的,且保证了每次在注入的代码位置调用的函数功能代码逻辑时,传入参数值的全局唯一性。

作为一种可选的实施方式,步骤s204,在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态包括:在第一次运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;在将目标代码在第一目标函数中的未执行的状态更新为已执行的状态之后,该方法还包括:在第二次运行第一目标函数时,第一目标函数中的目标代码未执行。

在该实施例中,目标程序中的每个目标函数可以多次运行。在第一次运行第一目标函数时,比如,在第一次进入被注入的第一目标函数,如果第一数组元素指示目标代码在第一目标函数中处于未执行的状态,则可以执行一次第一目标函数中的目标代码。在执行一次第一目标函数中的目标代码结束时,将目标代码在第一目标函数中的未执行的状态更新为已执行的状态。在将目标代码在第一目标函数中的未执行的状态更新为已执行的状态之后,在第二次运行第一目标函数时,由于目标代码在第一目标函数中已执行过,因而,不再在第一目标函数中执行,此时第一函数直接返回,可以不执行任何函数功能代码逻辑,从而达到注入代码反射调用的函数只执行一次的目的,降低了对数据进行处理的成本。

作为一种可选的实施方式,在获取目标数组的第一数组元素之前,该方法还包括:声明目标数组的下标的目标变量和目标数组中的数组元素为全局静态变量。

在该实施例中,全局静态变量,也即,静态全局变量,只在源文件中可用。全局静态变量可以使得该变量成为定义该变量的源文件所独享。该实施例的目标数组的下标为目标变量,该目标变量可以为注入次数计数uuid,将其声明为上述全局静态变量,可以在目标变量前加一个关键字static,使该目标变量只在源文件中可用。该实施例还声明目标数组中的数组元素为全局静态变量,也即,声明执行状态静态全局数组,可以在目标数组前加一个关键字static,使得该目标数组只在源文件中可用。

在该实施例中,在无源码的情况下,修改目标函数的功能逻辑,注入目标代码。在向目标函数注入目标代码时,增加以目标变量的值为下标的目标数组、目标函数设置运行条件值的方法。该实施例将目标变量作为第一个参数传入目标函数,在第一次运行目标函数时,目标数组中以目标变量的值为下标的数组元素的第一逻辑值指示目标代码在目标函数中处于未执行的状态,执行一次目标函数中的目标代码,在执行一次目标函数中的目标代码结束时,设置目标数组中以目标变量的值为下标的数组元素的逻辑值为第二逻辑值,指示目标代码在目标函数中处于已执行的状态。在第二次运行目标函数时,传入的第一个参数仍然为之前的目标变量的值,此时以目标变量的值为下标的数组元素的逻辑值为第二逻辑值,指示目标代码在目标函数中处于已执行的状态,目标函数直接返回,不运行后续函数功能代码逻辑,可以达到目标代码在目标函数中只执行一次的目的,而不会导致目标代码在全局只执行一次,避免了在每个目标函数中都需要增加不同的条件变量,当调用的目标函数很多时,导致代码量和技术成本较高、且代码性能低的问题。

下面结合优选的实施例对本发明的技术方案进行说明,具体以目标程序为java程序,目标代码为java字节码进行举例说明。

在该实施例中,在无源码分析java调用关系时,期望获取的调用关系只输出一次,以减少分析工作量,从而解决注入代码反射调用的函数只运行一次。

在实现注入代码反射调用的函数只运行一次时,可以声明默认值为false的静态条件变量,表示函数功能代码逻辑为未执行的状态;在函数功能代码逻辑前添加对函数功能代码逻辑的执行状态的判断,在函数功能代码逻辑为未执行的状态时,执行函数功能代码逻辑;在函数功能代码逻辑为已执行状态时,判断函数直接返回,不再执行函数功能代码逻辑。

可选地,在第一次运行进入函数时,静态条件变量为函数功能代码逻辑为未执行状态,执行函数功能代码逻辑,最后将表示函数功能代码逻辑的执行的状态的条件变量设置为true,表示函数功能代码逻辑为已执行的状态;这样在第二次进入函数时,判断函数功能代码逻辑就为已执行的状态,直接返回,不再执行函数功能代码逻辑,从而达到注入代码反射调用的函数只运行一次的目的。

图3是根据本发明实施例的一种向被注入函数注入代码的方法的流程图。如图3所示,该方法包括以下步骤:

步骤s301,进入被注入函数onmethodenter。

步骤s302,向被注入函数注入代码反射调用的函数getinvokingstack的java字节码。

在该实施例中,在onmethodenter进入函数之后,注入代码反射调用的函数getinvokingstack的java字节码。

其中,上述方法的注入代码如下所示:

@override

protectedvoidonmethodenter(){

super.onmethodenter();

mv.visitmethodinsn(invokestatic,“com/ieg/inject/util”,

“getinvokingstack”,“()v”);

图4是根据本发明实施例的一种函数调用的方法的流程图。如图4所示,该方法包括以下步骤:

步骤s401,在第一次运行注入的进入函数getinvokingstack函数时,静态条件变量status为false。

在第一次运行注入的进入函数getinvokingstack函数时,静态条件变量status为false,指示函数功能代码逻辑未执行。

步骤s402,运行一次函数功能代码逻辑。

步骤s403,设置静态条件变量status为true。

设置静态条件变量status为true,表示函数功能代码逻辑为已经执行的状态。

步骤s404,当第二次运行进入函数getinvokingstack时,静态条件变量status为true,则函数直接返回。

当第二次运行进入函数getinvokingstack时,静态条件变量status为true,表示函数功能代码逻辑为已经执行的状态,则函数直接返回,不运行函数功能代码逻辑,达到注入的注入代码反射调用函数getinvokingstack只运行一次的目的。

其中,上述调用的函数代码如下所示:

上述方法虽然可以实现注入代码反射调用函数仅执行一次,但是上述方法要实现在全局的每个函数中都执行一次java字节码,就需要在每个被注入的函数添加不同的条件变量。这样当调用的函数很多时,代码量和技术成本较高,从而降低了代码性能。另外,如果不在每个被注入的函数添加不同的条件变量,而是添加相同的条件变量,则在整个java运行时,函数功能代码逻辑在全局就只运行一次,而没有实现每个函数中函数功能代码逻辑只执行一次的目的。比如,在两处函数注入相同的代码反射调用的函数,期望是每处注入的代码反射调用的函数只执行一次,也即,有两处注入代码反射调用的函数,期望的是代码反射调用的函数执行两次,而不是一次。

下面对该实施例的上述方法进行进一步改进。

在该实施例中,在无源码的情况下,修改被注入函数的功能逻辑,注入java字节码。在向java注入java字节码时,增加以注入次数计数uuid为下标的条件值数组dirty[uuid],为被调函数设置运行的条件。

图5是根据本发明实施例的另一种向被注入函数注入代码的方法的流程图。如图5所示,该方法包括以下步骤:

步骤s501,声明注入次数计数uuid为全局静态变量。

声明注入次数计数uuid为全局静态变量,并且在每次注入java字节码时,达到针对注入位置的全局唯一性。

步骤s502,向被注入函数注入代码反射调用的函数getinvokingstackonce的java字节码。

注入代码反射调用函数为getinvokingstackonce,并将uuid作为第一个参数传入调用的getinvokingstackonce函数中。

其中,上述增加计数的注入代码如下所示:

图6是根据本发明实施例的另一种函数调用的方法的流程图。如图6所示,该方法包括以下步骤:

步骤s601,声明静态全局条件变量dirty数组。

声明静态全局条件变量dirty数组,设置默认条件值为假,指示函数功能代码逻辑为未执行的状态。

步骤s602,在第一次执行函数功能代码逻辑时,以传入的uuid为下标的条件值dirty[uuid]为假,执行函数功能代码逻辑,输出调用关系。

在第一次执行函数功能代码逻辑时,以传入的uuid为下标的条件值dirty[uuid]为假,指示函数功能代码逻辑为未执行的状态,执行函数功能代码逻辑,输出调用关系。

步骤s603,将以传入的uuid为下标的条件值dirty[uuid]设置为逻辑真,指示函数功能代码逻辑为已执行的状态。

步骤s604,在第二次执行函数代码逻辑时,以之前传入的uuid为下标的条件值dirty[uuid]为逻辑真,函数直接返回。

在第二次执行函数代码逻辑时,以之前传入的uuid为下标的条件值dirty[uuid]为逻辑真,表示函数功能代码逻辑为已执行的状态,此时函数直接返回,不再执行任何函数功能代码逻辑,从而达到注入代码反射调用的函数只执行一次的目的。

其中,上述调用的函数代码如下所示:

在该实施例中,java编译生成的class文件在无源码的情况下,修改函数功能逻辑,进行注入java字节码。在注入java字节码代码时,可以增加变量注入次数计数uuid、默认值为假的条件值数组dirty[uuid]、被调用函数设置运行条件值的方法。

下面对本发明实施例的代码向函数注入流程进行介绍。

图7是根据本发明实施例的一种代码向被注入函数注入的方法的流程图。如图7所示,该方法包括以下步骤:

步骤s701,声明注入次数计数变量为全局静态变量。

在代码向被注入函数注入时,增加注入次数计数变量uuid,声明注入次数计数变量为全局静态变量。

步骤s702,获取注入次数计数变量当前的值。

步骤s703,在代码向被注入函数注入完成之后,注入次数计数变量当前的值都自增。

每向java程序注入一次代码,注入次数计数都自增,将其标记为调用的函数注入代码的位置,从而保证每次注入的代码执行函数的注入位置的唯一性。

步骤s704,进入注入代码反射调用的函数。

步骤s705,向注入代码反射调用的函数传入注入次数计数自增后的值。

注入次数计数变量作为注入代码反射调用的函数的第一个参数,向注入代码反射调用的函数传入注入次数计数自增后的值,该注入次数计数值作为执行状态静态全局数组的下标。

步骤s706,保存class文件打包。

在代码向被注入函数注入完成之后,将修改后的class文件进行保存,从而完成代码注入流程。

该实施例通过声明注入次数计数变量为全局静态变量,获取注入次数计数变量当前的值,注入次数计数变量当前的值自增,进入注入代码反射调用的函数,向注入代码反射调用的函数传入注入次数计数自增后的值,将修改后的class文件保存,从而实现了代码向被注入函数注入的目的。

在完成代码向被注入函数注入之后,开始设计函数运行流程,该实施例以注入次数计数变量uuid作为函数运行中执行状态静态全局数组dirty的下标。

图8是根据本发明实施例的一种调用函数运行的方法的流程图。如图8所示,该方法包括以下步骤:

步骤s801,声明执行状态静态全局数组。

声明执行状态静态全局数组dirty(目标数组)。

步骤s802,执行状态静态全局数组中的所有数组元素都默认为未执行状态。

执行状态静态全局数组中的所有数组元素都初始化为用于指示函数功能代码逻辑为未执行状态。

步骤s803,获取数组元素对应的函数功能代码逻辑的执行状态。

该实施例的函数功能代码逻辑的执行状态是和注入次数计数值相关,作为全局唯一性的注入次数计数值能够使得注入调用的函数基于注入位置仅执行一次。

获取在代码注入时传入的参数uuid,判断dirty[uuid]对应的函数功能代码逻辑的执行状态。

步骤s804,判断函数功能代码逻辑的执行状态是否为已执行的状态。

在获取数组元素对应的函数功能代码逻辑的执行状态之后,判断函数功能代码逻辑的执行状态是否为已执行的状态。如果判断出函数功能代码逻辑的执行状态为已执行的状态,执行步骤s807;如果判断出函数功能代码逻辑的执行状态为未执行的状态,执行步骤s805。

步骤s805,执行一次函数功能代码逻辑。

在判断函数功能代码逻辑的执行状态是否为已执行的状态之后,如果判断出函数功能代码逻辑的执行状态为未执行的状态,执行一次函数功能代码逻辑。

步骤s806,设置已执行的状态。

执行一次函数功能代码逻辑之后,执行一次函数功能代码逻辑。

步骤s807,函数返回。

在判断函数功能代码逻辑的执行状态是否为已执行的状态之后,如果判断出函数功能代码逻辑的执行状态为已执行的状态,则调用的函数直接返回,不执行函数功能代码逻辑。

该实施例的注入代码反射调用的函数增加参数,并传入注入次数计数值uuid,注入次数计数值作为函数第一个参数传入;增加根据注入次数计数累积的静态全局条件值数组dirty[uuid],默认条件值为假(用于指示反射调用的函数功能代码逻辑未执行);在运行反射调用的函数功能代码逻辑结束时,设置以传入的注入次数计数值为下标的条件值数组元素的值为逻辑真(于指示反射调用的函数功能代码逻辑已执行);到第二次运行反射调用的函数时,传入的第一个参数仍然为之前的注入次数计数值,此时对应dirty[uuid]的值为逻辑真,函数直接返回,不运行后续函数功能代码逻辑,达到注入反射调用的函数只执行一次的目的。

在该实施例中,注入次数计数全局变量uuid作为默认值为假(用于指示反射调用的函数功能代码逻辑未执行)的静态全局条件变量dirty数组的下标,保证每次在注入的代码位置调用的函数功能代码逻辑时,传入参数值的全局唯一性,在此基础上保证在注入的代码位置调用的函数功能代码逻辑基于注入位置只执行一次,而不会导致调用的函数功能代码逻辑在全局只执行一次,减少了注入调用的函数执行次数,从而减少对被注入代码运行效率的影响。

需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

根据本发明实施例的另一方面,还提供了一种用于实施上述数据的处理方法的数据的处理装置。图9是根据本发明实施例的一种数据的处理装置的示意图。如图9所示,该数据的处理装置900可以包括:第一获取单元10、第一处理单元20和第二处理单元30。

第一获取单元10,用于在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态。

第一处理单元20,用于在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态。

第二处理单元30,用于在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,使第一目标函数中的目标代码未执行。

可选地,该装置还包括:增加单元、第二获取单元、第三处理单元和第四处理单元。其中,增加单元,用于在执行一次第一目标函数中的目标代码之后,在向目标程序的第二目标函数注入目标代码时,将第一数组元素的下标的第一值增加目标值,得到第二值,其中,目标数组中的不同数组元素的下标为目标变量的不同值;第二获取单元,用于获取目标数组中的下标为第二值的第二数组元素;第三处理单元,用于在运行第二目标函数时,在第二数组元素指示目标代码在第二目标函数中处于未执行的状态的情况下,执行一次第二目标函数中的目标代码,并将目标代码在第二目标函数中的未执行的状态更新为已执行的状态;第四处理单元,用于在第二数组元素指示目标代码在第二目标函数中处于已执行的状态的情况下,使第二目标函数中的目标代码未执行。

可选地,增加单元包括:增加模块,用于将第一值增加1,得到第二值,其中,目标变量的值用于指示向目标程序注入目标代码的次数。

可选地,第一处理单元20包括:第一处理模块,用于在第一数组元素的值为第一逻辑值的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的第一逻辑值更新为第二逻辑值,其中,在第一数组元素的值为第一逻辑值的情况下,目标代码在第一目标函数中处于未执行的状态,在第一数组元素的值为第二逻辑值的情况下,目标代码在第一目标函数中处于已执行的状态;第二处理单元30包括:第二处理模块,用于在第一数组元素的值为第二逻辑值的情况下,使第一目标函数中的目标代码未执行。

可选地,第一处理模块包括:第一处理子模块,用于在第一数组元素的值为逻辑假的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的逻辑假更新为逻辑真;第二处理模块包括:第二处理子模块,用于在第一数组元素的值为逻辑真的情况下,第一目标函数中的目标代码未执行。

可选地,上述目标数组的数组元素的默认值为逻辑假。

可选地,第一处理模块包括:第三处理子模块,用于在第一数组元素的值为逻辑真的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的逻辑真更新为逻辑假;第四处理子模块,用于在第一数组元素的值为逻辑假的情况下,第一目标函数中的目标代码未执行。

可选地,上述目标数组的数组元素的默认值为逻辑真。

可选地,第一处理单元20包括:第三处理模块,用于在第一次运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态。

可选地,该实施例的数据处理的装置还包括:第三处理单元,用于在将目标代码在第一目标函数中的未执行的状态更新为已执行的状态之后,在第二次运行第一目标函数时,第一目标函数中的目标代码未执行。

可选地,该实施例的数据处理的装置还包括:声明单元,用于在获取目标数组的第一数组元素之前,声明目标数组的下标的目标变量和目标数组中的数组元素为全局静态变量。

需要说明的是,该实施例中的第一获取单元10可以用于执行本申请实施例中的步骤s202,该实施例中的第一处理单元20可以用于执行本申请实施例中的步骤s204,该实施例中的第二处理单元30可以用于执行本申请实施例中的步骤s206。

此处需要说明的是,上述单元和模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。需要说明的是,上述模块作为装置的一部分可以运行在如图1所示的硬件环境中,可以通过软件实现,也可以通过硬件实现,其中,硬件环境包括网络环境。

在该实施例中,通过第一获取单元10在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态;通过第一处理单元20在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;通过第二处理单元30在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,使第一目标函数中的目标代码未执行。由于目标数组中的不同数组元素分别用于指示目标代码在不同目标函数中的执行状态,并以此作为判断条件,在目标代码在目标函数中处于未执行的状态的情况下,执行目标代码,在目标代码在目标函数中处于已执行的状态的情况下,不再执行目标代码,实现了在目标函数中仅执行一次目标代码,而不导致调用的目标代码仅在全局只执行一次的目的,从而实现了降低对数据进行处理的成本的技术效果,进而解决了相关技术中对数据进行处理的成本高的技术问题。

根据本发明实施例的又一个方面,还提供了一种用于实施上述数据的处理方法的电子装置,如图10所示,该电子装置包括存储器1002和处理器1004,该存储器中存储有计算机程序,该处理器被设置为通过计算机程序执行上述任一项方法实施例中的步骤。

可选地,在本实施例中,上述电子装置可以位于计算机网络的多个网络设备中的至少一个网络设备。

可选地,在本实施例中,上述处理器可以被设置为通过计算机程序执行以下步骤:

s1,在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态;

s2,在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;

s3,在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。

可选地,本领域普通技术人员可以理解,图10所示的结构仅为示意,电子装置也可以是智能手机(如android手机、ios手机等)、平板电脑、掌上电脑以及移动互联网设备(mobileinternetdevices,mid)、pad等终端设备。图10其并不对上述电子装置的结构造成限定。例如,电子装置还可包括比图10中所示更多或者更少的组件(如网络接口等),或者具有与图10所示不同的配置。

其中,存储器1002可用于存储软件程序以及模块,如本发明实施例中的数据的处理方法和装置对应的程序指令/模块,处理器1004通过运行存储在存储器1002内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现上述的数据的处理方法。存储器1002可包括高速随机存储器,还可以包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器1002可进一步包括相对于处理器1004远程设置的存储器,这些远程存储器可以通过网络连接至终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。其中,存储器1002具体可以但不限于用于存储提取的脸部特征与姿势特征等信息。作为一种示例,如图10所示,上述存储器1002中可以但不限于包括上述数据的处理装置900中的第一获取单元10、第一处理单元20和第二处理单元30。此外,还可以包括但不限于上述数据的处理装置中的其他模块单元,本示例中不再赘述。

上述的传输装置1006用于经由一个网络接收或者发送数据。上述的网络具体实例可包括有线网络及无线网络。在一个实例中,传输装置1006包括一个网络适配器(networkinterfacecontroller,nic),其可通过网线与其他网络设备与路由器相连从而可与互联网或局域网进行通讯。在一个实例中,传输装置1006为射频(radiofrequency,rf)模块,其用于通过无线方式与互联网进行通讯。

此外,上述电子装置还包括:显示器1008,用于显示上述目标代码在第一目标函数中的执行状态;连接总线1010,用于连接上述电子装置中的各个模块部件。

根据本发明的实施例的又一方面,还提供了一种存储介质,该存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,在向目标程序的第一目标函数注入目标代码时,获取目标数组中的第一数组元素,其中,目标代码将被注入目标程序中的不同目标函数,目标数组中的数组元素用于指示目标代码在对应的目标函数中的执行状态;

s2,在运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;

s3,在第一数组元素指示目标代码在第一目标函数中处于已执行的状态的情况下,第一目标函数中的目标代码未执行。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,在执行一次第一目标函数中的目标代码之后,在向目标程序的第二目标函数注入目标代码时,将第一数组元素的下标的第一值增加目标值,得到第二值,其中,目标数组中的不同数组元素的下标为目标变量的不同值;获取目标数组中的下标为第二值的第二数组元素;

s2,在运行第二目标函数时,在第二数组元素指示目标代码在第二目标函数中处于未执行的状态的情况下,执行一次第二目标函数中的目标代码,并将目标代码在第二目标函数中的未执行的状态更新为已执行的状态;

s3,在第二数组元素指示目标代码在第二目标函数中处于已执行的状态的情况下,第二目标函数中的目标代码未执行。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

将第一值增加1,得到第二值,其中,目标变量的值用于指示向目标程序注入目标代码的次数。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,在第一数组元素的值为第一逻辑值的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的第一逻辑值更新为第二逻辑值,其中,在第一数组元素的值为第一逻辑值的情况下,目标代码在第一目标函数中处于未执行的状态,在第一数组元素的值为第二逻辑值的情况下,目标代码在第一目标函数中处于已执行的状态;

s2,在第一数组元素的值为第二逻辑值的情况下,第一目标函数中的目标代码未执行。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,在第一数组元素的值为逻辑假的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的逻辑假更新为逻辑真;

s2,在第一数组元素的值为逻辑真的情况下,第一目标函数中的目标代码未执行。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,在第一数组元素的值为逻辑真的情况下,执行一次第一目标函数中的目标代码,并将第一数组元素的逻辑真更新为逻辑假;

s2,在第一数组元素的值为逻辑假的情况下,第一目标函数中的目标代码未执行。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

s1,在第一次运行第一目标函数时,在第一数组元素指示目标代码在第一目标函数中处于未执行的状态的情况下,执行一次第一目标函数中的目标代码,并将目标代码在第一目标函数中的未执行的状态更新为已执行的状态;

s2,在将目标代码在第一目标函数中的未执行的状态更新为已执行的状态之后,在第二次运行第一目标函数时,第一目标函数中的目标代码未执行。

可选地,在本实施例中,上述存储介质可以被设置为存储用于执行以下步骤的计算机程序:

在获取目标数组的第一数组元素之前,声明目标数组的下标的目标变量和目标数组中的数组元素为全局静态变量。

可选地,在本实施例中,本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令终端设备相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:闪存盘、只读存储器(read-onlymemory,rom)、随机存取器(randomaccessmemory,ram)、磁盘或光盘等。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

上述实施例中的集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在上述计算机可读取的存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在存储介质中,包括若干指令用以使得一台或多台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的客户端,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1