掌桥专利:专业的专利平台
掌桥专利
首页

一种代码分析方法、装置、电子设备及存储介质

文献发布时间:2023-06-19 18:37:28


一种代码分析方法、装置、电子设备及存储介质

技术领域

本说明书涉及计算机技术领域,尤其涉及一种代码分析方法、装置、电子设备及存储介质。

背景技术

代码,是程序员使用开发工具所支持的语言写出来的源文件,是一组有序的数字或字母的排列,是代表客观实体及其属性的符号。程序员通过编写代码,可以实现相应的功能,比如通过编写代码执行数据统计任务。

然而,由于代码需要以规定的语法编写才能正常运行,如果出现语法错误,将导致代码无法执行,也就无法实现相应的功能。并且,由于代码通常多而复杂,代码在执行过程中很可能存在无法预知的漏洞,很可能带来非常严重的后果,比如目前大家对自己的隐私数据越来越关注,一旦因为代码漏洞导致用户隐私数据泄露,不仅影响了用户的隐私安全,更会对公司造成无法挽回的负面影响。

因此,为了确保代码的稳定性和可靠性,降低代码错误导致的风险,在编写出代码之后,还需要进行代码分析,对代码进行各种检测。

发明内容

有鉴于此,本说明书一个或多个实施例提供一种代码分析方法、装置、电子设备及存储介质,以解决相关技术中存在的问题。

为实现上述目的,本说明书一个或多个实施例提供技术方案如下:

根据本说明书实施例的第一方面,提供一种代码分析方法,所述方法包括:

获取待分析代码的历史运行数据;其中,所述历史运行数据包括所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系;

基于待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,生成函数调用图;

对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

根据本说明书实施例的第二方面,提供一种代码分析装置,所述装置包括:

获取模块,获取待分析代码的历史运行数据;其中,所述历史运行数据包括所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系;

生成模块,基于待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,生成函数调用图;

分析模块,对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

根据本说明书实施例的第三方面,提供一种电子设备,包括通信接口、处理器、存储器和总线,所述通信接口、所述处理器和所述存储器之间通过总线相互连接;

所述存储器中存储机器可读指令,所述处理器通过调用所述机器可读指令,执行上述方法。

根据本说明书实施例的第四方面,提供一种机器可读存储介质,所述机器可读存储介质存储有机器可读指令,所述机器可读指令在被处理器调用和执行时,实现上述方法。

本说明书的实施例提供的技术方案可以包括以下有益效果:

在上述过程中,可以根据待分析代码在运行过程中所调用的函数,以及函数之间的调用关系,生成函数调用图,并在对待分析代码进行静态分析过程中,在待分析的目标函数存在多个可调用的函数时查询函数调用图,以确定与待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对目标函数的静态分析。通过以上技术方案,一方面,通过基于容易获取到的函数及其调用关系来生成函数调用图,使得本方案易于实现,容易部署;另一方面,通过在静态分析过程中查询函数调用图,可以针对存在多个可调用的函数的待分析的目标函数确定与之对应的存在调用关系的函数,从而提升静态分析时的准确度。

附图说明

图1为本说明书一示例性实施例提供的一种代码分析方法的流程图;

图2为本说明书一示例性实施例提供的一种生成函数调用图的示意图;

图3为本说明书一示例性实施例提供的一种静态分析过程的示意图;

图4为本说明书一示例性实施例提供的一种代码分析装置所在电子设备的结构示意图;

图5为本说明书一示例性实施例提供的一种代码分析装置的框图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。

需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。

目前,可以通过对代码进行静态分析以实现对代码的检测。静态分析是指在不实际运行代码的情况下,对代码语义和行为进行分析,检查代码是否符合编码标准,并找出代码中的漏洞,比如由于错误的编码导致异常的代码语义,或者未定义的行为。通过静态分析,可以无需构建运行环境,编写测试用例,在代码编写的早期阶段就能发现代码中的各种问题,提高开发效率和软件质量。

举例来说,在Java中,对于应用的JAR文件,可以通过静态分析工具进行静态分析,自动提取软件知识得到应用的程序脉络,以帮助理解应用程序,比如,应用程序有没有空指针异常,某个中间变量能不能传到数据库,某个输入字段有没有被用作重要的分支判断条件,某几个字段有没有可能的资金计算关系等。

值得说明的是,在进行静态分析时,上述程序脉络可以划分为数据脉络、控制脉络和逻辑脉络三种。

其中,数据脉络关注数据通过直接赋值或参与计算后赋值传递关系,比如当b=a+3时,那么可以认为b受到了a的数据影响;

控制脉络关注数据作为判断条件的一部分对应用程序的影响,比如当if(a>0){b=3}时,那么可以认为b受到了a的控制影响;

逻辑脉络关注数据间的逻辑关系,比如z=x+y中体现的逻辑关系。

程序脉络不同于常规的程序分析,常规的程序分析大多为函数内的行为分析,而基于程序脉络可以追踪每个变量在一个应用范围内的传播关系,比如,即使某个变量穿越了100层函数,也可以基于程序脉络进行追踪,因此,通过程序脉络可以加深对应用程序的理解,有助于进行软件风险挖掘。

然而,随着软件系统规模越来越大,系统复杂度越来越高,代码的体量不容小觑,代码内部的关联关系也错综复杂,因此,如果想要提高代码的可靠性,需要提高提升静态测试覆盖度。但测试覆盖度并非越高越好,它会加大开发者的工作量,需要考虑投入产出比。另外,由于静态分析并不实际运行程序,无法得到代码实际运行时的真实状态信息,因此静态分析的准确度有限。

有鉴于此,本说明书提供一种根据待分析代码在运行过程中所调用的函数,以及函数之间的调用关系,生成函数调用图,并在对待分析代码进行静态分析过程中,查询函数调用图,以确定与当前分析的函数存在调用关系的函数,从而提升静态分析时的准确度的技术方案。

在实现时,可以先获取待分析代码的历史运行数据。

例如,可以通过运行植入在所述待分析代码中的插桩代码,收集所述待分析代码的历史运行数据。

然后,可以基于所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,生成函数调用图。

例如,可以基于所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,确定所述待分析代码中在运行过程中所调用函数对应的调用路径,并对经过相同调用路径的函数进行聚合,生成所述函数调用图。

接着,可以对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

例如,可以对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数为预设函数,并且所述预设函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

在上述过程中,可以根据待分析代码在运行过程中所调用的函数,以及函数之间的调用关系,生成函数调用图,并在对待分析代码进行静态分析过程中,在待分析的目标函数存在多个可调用的函数时查询函数调用图,以确定与待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对目标函数的静态分析。通过以上技术方案,一方面,通过基于容易获取到的函数及其调用关系来生成函数调用图,使得本方案易于实现,容易部署;另一方面,通过在静态分析过程中查询函数调用图,可以针对存在多个可调用的函数的待分析的目标函数确定与之对应的存在调用关系的函数,从而提升静态分析时的准确度。

下面结合附图对本说明书的代码分析方法进行详细说明。

请参见图1,图1为本说明书一示例性实施例提供的一种代码分析方法的流程图,如图1所示,所述方法包括如下的执行步骤:

步骤101,获取待分析代码的历史运行数据;其中,所述历史运行数据包括所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系;

步骤102,基于待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,生成函数调用图;

步骤103,对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

在本实施例中,可以获取待分析代码的历史运行数据。

其中,所述历史运行数据包括所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系。

上述函数是指一段可以直接被另一段程序或代码引用的程序或代码,也叫做子程序或方法。在许多程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,所以,函数也可以说是许多代码的集合,这就是程序中的函数。同一个函数可以被一个或多个函数调用任意多次。

例如,可以获取待分析代码的历史运行数据,并根据历史运行数据确定待分析代码在运行过程中所调用的函数,以及函数之间的调用关系。

在示出的一种实施方式中,在基于待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,生成函数调用图之前,可以运行植入在所述待分析代码中的插桩代码,收集所述待分析代码的历史运行数据。

上述插桩代码,是指通过代码插桩技术实现覆盖测试。由于在实现覆盖测试的过程中,往往需要知道某些信息,比如:程序中可执行语句被执行的情况,程序执行的路径,变量的引用、定义等。如果基于人工的方法跟踪被测程序的执行过程,不仅效率低下而且枯燥乏味,所以可以采用在被测程序中插入完成相应工作的代码,实现在被测程序执行的过程中自动记录,即代码插桩技术。

例如,可以在待分析代码中预先植入插桩代码,通过运行插桩代码,自动记录待分析代码被执行的情况,来收集到待分析代码的历史运行数据。

由于插入过多的插桩代码将会导致过大的代码膨胀率,加重程序运行时的负担,但插桩代码过少又会导致测试覆盖度不足。

因此,可以在收集待分析代码运行过程中产生的上下文信息时,只记录轻量化的运行信息,包括待分析代码在运行过程中所调用的函数,以及函数之间的调用关系,从而在兼顾测试覆盖度的情况下,减轻代码插桩后程序的运行负担。

并且,上述轻量化的运行信息也容易获取,在实际应用中更容易进行针对获取轻量化的运行信息的部署。

例如,可以通过代码插桩技术,在待分析代码中插入预设的插桩代码,通过预设的插桩代码收集在待分析代码运行过程中产生的待分析代码在运行过程中所调用的函数,以及函数之间的调用关系。

在本实施例中,可以基于待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,生成函数调用图。

例如,在待分析代码在运行过程中,可以根据调用的函数在函数调用图中生成对应的节点,并根据函数之间的调用关系,将函数调用图中生成的节点按调用顺序连接起来。

在示出的一种实施方式中,所述历史运行数据包括所述待分析代码在历史运行过程中产生的上下文数据。

上述上下文数据是指维持一段程序正常运行的所需要的外部变量的值的集合,也就是说上下文数据记录了代码语句执行的前序状态。例如,为了使具有很多外部变量的程序能够独立完整的运行,需要给所有的外部变量写一些值进去,这些值的集合就叫上下文数据。

例如,上述上下文数据可以是程序经过不同函数时的不同前序路径。

值得说明的是,由于函数调用另一个函数需要特定的前序调用条件,即上游的调用路径,故在进行函数调用图时,既可以对经过相同调用路径的函数进行聚合,也可以对同一函数由于上游调用路径不同导致的下游调用函数的不同进行区分,从而生成具有上述上下文敏感的函数调用图。

在示出的一种实施方式中,可以基于所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,确定所述待分析代码中在运行过程中所调用函数对应的调用路径,并对经过相同调用路径的函数进行聚合,生成所述函数调用图。

需要说明的是,由前述可知,随着软件系统规模越来越大,系统复杂度越来越高,代码的体量不容小觑,代码内部的关联关系也错综复杂,因此,对于静态分析来说,想要自上而下的遍历每一条调用路径几乎是不可能完成的任务。

并且,由于代码中可能存在函数的反复调用,因此获取到的待分析代码在运行过程中所调用的函数,以及函数之间的调用关系,也可能存在很多重复的调用路径,需要进行去重,从而通过去冗余降低数据量。

在一个例子中,可以采用自下而上的方法,先根据历史运行数据确定被调用的函数,基于被调用的函数生成调用图中对应的节点,同时为了避免准确度下降的问题,需要根据函数之间的调用关系引入上下文敏感,通过函数和函数之间的调用关系,确定被调用的函数对应的调用路径,根据路径生成调用图中的边,并对经过相同调用路径的函数进行聚合,从而最终确定出函数调用图。

在示出的一种实施方式中,所述函数调用图包括所述待分析代码在运行过程中所调用的函数对应的节点,以及用于指示所述函数调用图中的节点对应的函数之间的调用关系的有向边;其中,被不同函数所调用的相同函数分别对应不同的节点。

例如,为了使生成的函数调用图更加精确,可以进一步利用引入的上下文敏感性,函数调用图中的节点对应的函数之间的调用与被调用的关系,生成有向边。并且,对于同一个函数,如果被不同函数所调用,可以在函数调用图中生成与该函数分别对应的两个不同的节点。

请参见图2,图2为本说明书一示例性实施例提供的一种生成函数调用图的示意图。如图2所示,待分析代码在运行过程中有三条轨迹,分别为Trace1、Trace2和Trace3。

以图2为例,待分析代码在运行过程中,可以基于预设的插桩代码收集待分析代码在运行过程中所调用的函数,以及函数之间的调用关系,可以得到Trace1的入口为Entry_A时,执行了函数A、B、C、D、E和F,其中函数B调用C,C继续调用E和F,而函数A调用D;Trace2的入口为Entry_A时,执行了函数A、C、D、E、G和H,其中函数A调用D,D继续调用G,而函数C调用E,E继续调用H;Trace3的入口为Entry_B时,执行了函数B、D和G,其中函数B调用D,D继续调用G。

由前述可知,可以确定待分析代码中函数的调用路径,并对经过相同调用路径的函数进行聚合,那么可以将具有相同入口Entry_A的路径进行聚合,合并重复的执行函数A的路径,以及函数A调用D的路径,生成函数调用图。

值得说明的是,以图2中的函数D为例,生成的函数调用图中的节点D1和D2实际上属于同一个函数,但由于不同的调用者传递的信息不同,导致函数D接下来会调用不同的函数,比如图2中比如A调用D1,D1调用G1,而B2调用D2,D2调用G2。因此,为了体现上下文敏感,使函数调用图更加准确,在实际应用中,D1和D2会根据上游调用路径的不同,即上下文信息进行区分,故而在函数调用图中可以用不同的节点来代表不同调用者下的D函数,从而区分不同的调用路径,使得生成的函数调用图具有上下文敏感性。对于图2中的其他函数,也可以进行相同的处理,在此不做赘述。

在本实施例中,可以对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

需要说明的是,在待分析的目标函数存在多个可调用的函数时,此时为静态分析不确定状态,需要确定目标函数调用的函数,从而增加分析的准确性。

例如,以前述图2为例,可以对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数存在多个可调用的函数时,比如当待分析的目标函数为C时,C可以调用E,也可以调用F,那么可以查询函数调用图,确定与待分析的目标函数C存在调用关系的函数,假设待分析的目标函数C被B调用,那么可以确定出目标函数C要调用的函数是E和F,并基于确定出的函数E和F进一步完成针对目标函数的静态分析。

在示出的一种实施方式中,可以在所述静态分析过程中,如果待分析的目标函数为预设函数,并且所述预设函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

例如,假设预设函数为虚拟函数时,那么在静态分析过程中,如果待分析的目标函数为虚拟函数,并且该虚拟函数存在多个可调用的函数时,可以查询函数调用图,确定与待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对该目标函数的静态分析。

在示出的一种实施方式中,所述待分析代码为java代码;所述预设函数包括以下示出的任一或者多个的组合:

虚拟函数、接口函数、循环内部的函数、不同分支的函数。

请参见图3,图3为本说明书一示例性实施例提供的一种静态分析过程的示意图。如图3所示,以Java语言中的一段代码为例:

c l ass A{

pub l ic void m_a(){…}

}

c l ass B extends A{

pub l ic void m_b(){…}

}

c l ass C extends A{

pub l ic void m_c(){…}

}

值得说明的是,由于Java中的方法类似于其他的语言的函数,是一段用来完成特定功能的代码片段,因此下文在以Java为例对本说明书中的函数进行举例时,使用Java中常用的方法的描述。

上述代码表示定义了一个父类A,以及继承父类A的子类B和子类C,对于父类A,可以访问的方法是m_a,而子类B可以访问的方法是m_b,子类C可以访问的方法是m_c。而A a=new A()代表实例化了一个对象a,这个对象a属于A类;a.m()表示对象a调用了方法m。

在图3中,方法x、方法y和方法z都可以调用方法f,当方法x调用方法f时,可以通过new A()对象去调用,相应的,方法f需要调用的方法就是父类A可以访问的方法m_a。在进行静态分析时,为了确定方法f调用的方法,可以根据当前分析的方法f所在的路径,假设此时调用方法f的方法为y时,则可以确定方法f调用的方法为m_b。

在上述过程中,可以根据待分析代码在运行过程中所调用的函数,以及函数之间的调用关系,生成函数调用图,并在对待分析代码进行静态分析过程中,在待分析的目标函数存在多个可调用的函数时查询函数调用图,以确定与待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对目标函数的静态分析。通过以上技术方案,一方面,通过基于容易获取到的函数及其调用关系来生成函数调用图,使得本方案易于实现,容易部署;另一方面,通过在静态分析过程中查询函数调用图,可以针对存在多个可调用的函数的待分析的目标函数确定与之对应的存在调用关系的函数,从而提升静态分析时的准确度。

在本说明书的示例性实施例中,还提供了一种能够实现上述方法的设备。

图4是一示例性实施例提供的一种设备的示意结构图。请参考图4,在硬件层面,该设备包括处理器402、内部总线404、网络接口406、内存408以及非易失性存储器410,当然还可能包括其他业务所需要的硬件。本说明书一个或多个实施例可以基于软件方式来实现,比如由处理器402从非易失性存储器410中读取对应的计算机程序到内存409中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。

请参考图5,在一软件实施方式中,提供了一种代码分析装置500,如图5所示,所述装置500包括:

获取模块501,获取待分析代码的历史运行数据;其中,所述历史运行数据包括所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系;

生成模块502,基于待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,生成函数调用图;

分析模块503,对所述待分析代码进行静态分析,并在所述静态分析过程中,如果待分析的目标函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

可选的,所述装置500还包括:

收集模块504(图中未示出),运行植入在所述待分析代码中的插桩代码,收集所述待分析代码的历史运行数据。

可选的,所述历史运行数据包括所述待分析代码在历史运行过程中产生的上下文数据。

可选的,所述生成模块502,进一步:

基于所述待分析代码在运行过程中所调用的函数,以及所述函数之间的调用关系,确定所述待分析代码中在运行过程中所调用函数对应的调用路径,并对经过相同调用路径的函数进行聚合,生成所述函数调用图。

可选的,所述分析模块503,进一步:

在所述静态分析过程中,如果待分析的目标函数为预设函数,并且所述预设函数存在多个可调用的函数时,查询所述函数调用图,确定与所述待分析的目标函数存在调用关系的函数,并基于查询的结果进一步完成针对所述目标函数的静态分析。

可选的,所述待分析代码为java代码;所述预设函数包括以下示出的任一或者多个的组合:

虚拟函数、接口函数、循环内部的函数、不同分支的函数。

可选的,所述函数调用图包括所述待分析代码在运行过程中所调用的函数对应的节点,以及用于指示所述函数调用图中的节点对应的函数之间的调用关系的有向边;其中,被不同函数所调用的相同函数分别对应不同的节点。

上述装置500中各个模块的功能和作用的实现过程具体详见上述代码分析方法中对应步骤的实现过程,相关之处参见方法实施方式的部分说明即可,在此不再赘述。

以上所描述的装置实施方式仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部单元或模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。

在一个典型的配置中,计算机包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(f l ash RAM)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(trans itory media),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

在本说明书一个或多个实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。

技术分类

06120115631885