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

一种针对泛型编程的类型敏感指针分析方法及装置

文献发布时间:2023-06-19 18:27:32


一种针对泛型编程的类型敏感指针分析方法及装置

技术领域

本申请涉及软件测试技术领域,具体涉及一种针对泛型编程的类型敏感指针分析方法及装置。

背景技术

程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。

指针分析是程序静态分析中的一种,回答了程序中的指针指向哪个内存的问题。一方面,以Java语言为例,Java语言中的指针分析指的是一个指针指向程序中的哪个对象(Object)的问题,通常指针分析是一个可能性分析,分析的结果通常是一个指针可能指向哪些对象。而另一方面,泛型编程被广泛采纳入现代编程方式中,使用泛型可以使用类型变量作为参数来定义类和方法,然后通过赋予它们特定的实际类型来实例化这些类或者方法。

而现有技术中并未有针对泛型编程的指针分析方法,导致常规的指针分析方式对泛型编程得到的代码的分析效果较差。

发明内容

本申请提供了一种针对泛型编程的类型敏感指针分析方法及装置,提高了对泛型编程的上下文敏感指针分析的准确性,该技术方案如下。

一方面,提供了一种针对泛型编程的类型敏感指针分析方法,所述方法包括:

获取待分析的目标程序代码;

将所述目标程序代码中的泛型编程语句中的类型变量,映射至所述类型变量的实际类型,并将所述类型变量与所述实际类型的映射放入所述泛型编程语句的上下文;

基于所述泛型编程语句的上下文,对所述目标程序代码进行上下文敏感指针分析,以获得所述目标程序代码中各个指针之间的指向关系。

又一方面,提供了一种针对泛型编程的类型敏感指针分析装置,所述装置包括:

程序代码获取模块,用于获取待分析的目标程序代码;

类型映射模块,用于将所述目标程序代码中的泛型编程语句中的类型变量,映射至所述类型变量的实际类型,并将所述类型变量与所述实际类型的映射放入所述泛型编程语句的上下文;

指针分析模块,用于基于所述泛型编程语句的上下文,对所述目标程序代码进行上下文敏感指针分析,以获得所述目标程序代码中各个指针之间的指向关系。

在一种可能的实现方式中,所述类型映射模块,用于根据所述泛型编程语句的类型,将所述目标程序代码中的泛型编程语句中的类型变量,映射至所述类型变量的实际类型。

在一种可能的实现方式中,所述类型映射模块,包括:

第一类型映射单元,用于当所述泛型编程语句类型为NEW语句时,根据类型更新函数,对所述目标程序代码中的泛型编程语句中的类型变量进行处理,以将所述类型变量映射至所述实际类型;

所述类型更新函数用于根据所述NEW语句中的实例化类型,对所述类型变量进行映射,以确定所述类型变量的实际类型。

在一种可能的实现方式中,所述类型映射单元,还用于当检测到NEW 语句中以类型变量将对象实例化时,查找所述类型变量的映射的初始化点,并将所述初始化点处的类型参数确定为所述实际类型。

在一种可能的实现方式中,所述类型映射模块,还包括:

第二类型映射单元,用于当所述泛型编程语句类型为CALL语句时,根据类型追加函数,对所述目标程序代码中的泛型编程语句中的类型变量进行处理,以将所述类型变量映射至所述实际类型;

所述类型追加函数用于根据所述CALL语句中的调用类型,对所述类型变量进行映射,以确定所述类型变量的实际类型。

在一种可能的实现方式中,所述第二类型映射模块,还用于,当所述 CALL语句中的调用类型为具体类型的泛型调用时,将所述类型变量与 CALL语句中的类型实际参数的映射关系,确定为所述类型变量与所述实际类型的映射关系。

在一种可能的实现方式中,所述第二类型映射单元,还用于,当所述CALL语句中的调用类型为类型变量的泛型调用时,将所述类型变量与实际实例化站点的具体类型的映射关系,确定为所述类型变量与所述实际类型的映射关系;

所述实际实例化类型包括所述CALL语句中目标方法的接收对象的类型,以及所述目标方法的方法调用器的类型。

再一方面,提供了一种计算机设备,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条指令,所述至少一条指令由所述处理器加载并执行以实现上述的针对泛型编程的类型敏感指针分析方法。

又一方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令,所述至少一条指令由处理器加载并执行以实现上述的针对泛型编程的类型敏感指针分析方法。

再一方面,提供了一种计算机程序产品或计算机程序,所述计算机程序产品或计算机程序包括计算机指令,所述计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质中读取所述计算机指令,处理器执行所述计算机指令,使得所述计算机设备执行上述针对泛型编程的类型敏感指针分析方法。

本申请提供的技术方案可以包括以下有益效果:

在对泛型编程得到的目标程序代码进行指针分析时,可以先获取到目标程序代码中的泛型编程语句中的类型变量,从而确定出类型变量对应的实例化类型,再将类型变量与实例化类型之间的映射关系放入泛型编程语句所对应的上下文,再进行上下文敏感指针分析,从而得到目标程序代码中各个指针之间的指向关系。上述方案在泛型编程得到的目标程序代码中,先通过对泛型编程语句中的类型变量进行分析,得到泛型实例化类型,且使用具体类型实例化,泛型的类型是关键的上下文元素,因此将泛型实例化的具体类型与类型变量之间的映射关系放入上下文中进行上下文敏感指针分析从而得到各个指针之间的指向关系,提高了针对泛型编程的上下文敏感指针分析的准确性。

附图说明

为了更清楚地说明本申请具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是根据一示例性实施例示出的一种软件分析系统的结构示意图。

图2示出了一种软件程序代码示意图。

图3示出了一种泛型编程代码示意图。

图4是根据一示例性实施例示出的一种针对泛型编程的类型敏感指针分析方法的流程图。

图5是根据一示例性实施例示出的一种针对泛型编程的类型敏感指针分析方法的流程图。

图6示出了一种显式类型与缺失类型实例化示意图。

图7示出了五个类型的标记语句示意图。

图8是根据一示例性实施例示出的一种针对泛型编程的类型敏感指针分析装置的结构方框图。

图9示出了本申请一示例性实施例示出的计算机设备的结构框图。

具体实施方式

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

应理解,在本申请的实施例中提到的“指示”可以是直接指示,也可以是间接指示,还可以是表示具有关联关系。举例说明,A指示B,可以表示A 直接指示B,例如B可以通过A获取;也可以表示A间接指示B,例如A 指示C,B可以通过C获取;还可以表示A和B之间具有关联关系。

在本申请实施例的描述中,术语“对应”可表示两者之间具有直接对应或间接对应的关系,也可以表示两者之间具有关联关系,也可以是指示与被指示、配置与被配置等关系。

本申请实施例中,“预定义”可以通过在设备(例如,包括终端设备和网络设备)中预先保存相应的代码、表格或其他可用于指示相关信息的方式来实现,本申请对于其具体的实现方式不做限定。

为了便于理解本申请,在对本申请所示的各个实施例进行说明之前,首先对本申请涉及到的几个概念进行介绍。

1)程序静态分析(Program Static Analysis)

程序静态分析是指在不运行代码的方式下,通过词法分析、语法分析、控制流、数据流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。静态分析技术向模拟执行的技术发展以能够发现更多传统意义上动态测试才能发现的缺陷,例如符号执行、抽象解释、值依赖分析等等并采用数学约束求解工具进行路径约减或者可达性分析以减少误报增加效率。

2)指针分析

指针分析是静态分析中的一个难点,对于任何一个指针/引用,能否在编译阶段就知道它会指向内存那块位置(位置在这里并不是0xFFFF这样的具体位置,而是说指向哪个stack/heap上local/object)呢?但指针问题是不可决定的,也就是不能对任何指针都准确的分析出它会确切指向哪。但这不妨碍求出近似解,从而在某些情况下能进行优化。因此指针分析即为静态地计算程序中指针变量的可能指向的运行时值(抽象内存地址)。

上下文敏感指针分析在不同的调用上下文下指针变量的指向的值不同,从而有效减少不可行的过程间控制流路径引入的误报,大幅提高精度。一般而言,一个上下文由k个上下文元素的序列表示,其中上下文元素可以是调用点(k-调用点敏感(k-call-site-sensitive))、接收对象的初始化点(k- 对象敏感(k-object-sensitive))或接收对象的类型(k-类型敏感 (k-type-sensitive))。对于面向对象程序,在实践中的精度和效率方面,对象敏感被认为优于调用点敏感,并且类型敏感被视为对象敏感的更有效率但欠准确的替代方案。

3)泛型编程

泛型编程指在多种数据类型上皆可操作。和面向对象编程不同,它并不要求额外的间接层来调用函数,而是使用完全一般化并可重复使用的算法,算法效率与针对某特定数据类型而设计的算法相同。泛型编程并已被广泛采纳并被应用于现代编程语言中,包括C++、Java、C#等。

图1是根据一示例性实施例示出的一种软件分析系统的结构示意图。如图1所示,该软件分析系统中包含计算机设备110以及服务器120,该计算机设备以及服务器120可以通过有线或无线网络进行通信连接。

可选的,该计算机设备110可以为终端设备,即开发人员可以在计算机设备110中输入对应的软件程序代码,计算机设备110可以将软件程序代码发送至服务器120中,以便服务器120对该软件程序代码进行上下文敏感指针分析。

可选的,上述软件程序代码为泛型编程的软件程序代码。

或者,在该计算机设备110中预先存储有泛型编程的各个软件程序,当开发人员需要对上述各个软件程序中的任一个进行指针分析时,计算机设备可以将该软件程序发送至服务器120中,以便服务器120对该软件程序中的任一个进行基于泛型编程的上下文敏感指针分析。

可选的,上述服务器可以是由多个物理服务器构成的服务器集群或者是分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等技术云计算服务的云服务器。

可选的,该系统还可以包括管理设备,该管理设备用于对该系统进行管理(如管理各个模块与服务器之间的连接状态等),该管理设备与服务器之间通过通信网络相连。可选的,该通信网络是有线网络或无线网络。

可选的,上述的无线网络或有线网络使用标准通信技术和/或协议。网络通常为因特网,但也可以是其他任何网络,包括但不限于局域网、城域网、广域网、移动、有限或无线网络、专用网络或者虚拟专用网络的任何组合。在一些实施例中,使用包括超文本标记语言、可扩展标记语言等的技术和/或格式来代表通过网络交换的数据。此外还可以使用诸如安全套接字层、传输层安全、虚拟专用网络、网际协议安全等常规加密技术来加密所有或者一些链路。在另一些实施例中,还可以使用定制和/或专用数据通信技术取代或者补充上述数据通信技术。

指针分析计算程序变量的指向集,即可以由变量v指向的抽象地址集 (表示为pts(v)。通常,抽象地址表示为初始化点(初始化对象的指令,例如,Java中的new),表示在运行时由指令初始化的所有动态对象实例。在上下文敏感分析中,变量v和抽象地址o都具有上下文限定,从而有效地区分它们不同的动态实例。因此,不同于上下文不敏感分析中那样计算是否 o∈pts(v),上下文敏感分析则是计算关系(co,o)∈pts(cv,v),其中co和 cv分别是抽象地址o和变量v的上下文。

调用点敏感、对象敏感和类型敏感是上下文敏感的三个主要变体,其中调用点、接收对象的初始化点和接收对象的类型分别被视为上下文元素。为了确保终止,应用k-limiting将上下文元素的数量限制为k。在实践中,为了可扩展性,k通常设置为小于2。

在上述3个变体中,对象敏感和类型敏感(作为一种成本较低的替代方案)被认为更适合分析面向对象程序。在k类型敏感中,对象o

请参考图2,其示出了一种软件程序代码示意图。如图2所示,示例使用泛型类java.util.HashMap。此后,我们只讨论面向对象程序的两种主流上下文敏感变体:对象敏感和类型敏感,并且在本申请中,我们重点对泛型编程下的类型敏感机进行讨论。

在main方法中,有两个HashMap对象:O

在第13-38行中给出HashMap的简化代码片段。HashMap将数据存储在table中,即Node对象的数组(第15行)。put方法创建Node对象并将其存储在table中(第16-19行)。get方法从table中检索相应的Node对象,然后通过getValue接口返回其值(第20-23行)。要注意,Node类(第 24-38行)是作为内部泛型类实现的,并且在创建Node对象时使用其外部类HashMap的类型变量(即,K和V)进行实例化。

k-type-sensitive。在1-type-sensitive分析(缩写为1-type)中,第3/4行和第8/9行调用put/get方法的接收对象的类型都是HashMap。因此,使用上下文[HashMap]是无法区分不同调用点对put/get方法的调用。从而导致第 5行和第10行的cast-may-fail误报。

请参考图3,其示出了一种泛型编程代码示意图。如图3所示,对于泛型,确保精度的关键是作为上下文的一部分保留实例化位置,即,利用具体类型将泛型类型参数实例化的位置。因此,可以有效地识别不同的指针值流入/流出泛型方法和泛型对象。在图2的示例中,第2行和第7行用实际类型将泛型类HashMap实例化。这些实际类型作为HashMap的类型变量传递,以在第17行实例化Node。因此,相应的实际类型(A和B)应该被视为分析Node类方法时的上下文。因此,对于1-type,我们能够计算更准确结果:pts(A,key)={“A”},pts(B,key)={“B”},pts(A,value)={OA},以及pts(B,value)={O

步骤401,获取待分析的目标程序代码。

当需要对计算机程序进行指针分析时,计算机设备可以获取到计算机程序所对应的目标程序代码,且在本申请实施例中,该计算机程序是通过泛型编程得到的,也就是说目标程序代码是通过泛型编程得到的程序代码。

步骤402,将该目标程序代码中的泛型编程语句中的类型变量,映射至该类型变量的实际类型,并将该类型变量与该实际类型的映射放入该泛型编程语句的上下文。

由于目标程序代码是由泛型编程得到的,因此目标程序代码中存在各种类型的泛型编程语句,且由于泛型编程在泛型编程语句中,直接使用类型变量作为参数来定义类和方法,因此在对泛型编程语句进行上下文敏感指针分析时,实例化泛型的具体类型也应该是关键的上下文元素,此时将类型变量与具体类型的映射关系放入对应的泛型编程语句的上下文元素,增光了上下文信息,提高了上下文信息的完备性。

步骤403,基于该泛型编程语句的上下文,对该目标程序代码进行上下文敏感指针分析,以获得该目标程序代码中各个指针之间的指向关系。

当在泛型编程语句对应的上下文中,增加了类型变量与实际类型的映射关系,则可以通过上下文敏感指针分析的方式,通过泛型编程语句的上下文,获得目标程序代码中各个指针之间的指向关系,从而得到静态地计算程序中指针变量的可能指向的运行时值。

综上所述,在对泛型编程得到的目标程序代码进行指针分析时,可以先获取到目标程序代码中的泛型编程语句中的类型变量,从而确定出类型变量对应的实例化位置,再将类型变量与实际类型之间的映射关系放入泛型编程语句所对应的上下文,再进行上下文敏感指针分析,从而得到目标程序代码中各个指针之间的指向关系。上述方案在泛型编程得到的目标程序代码中,先通过对泛型编程语句中的类型变量进行分析,得到实际类型,且使用实例化泛型的具体类型是关键的上下文元素,因此将泛型实例化的具体类型与类型变量之间的映射关系放入上下文中进行上下文敏感指针分析从而得到各个指针之间的指向关系,提高了针对泛型编程的上下文敏感指针分析的准确性。

图5是根据一示例性实施例示出的一种针对泛型编程的类型敏感指针分析方法的流程图。该方法由计算机设备执行,该计算机设备可以是如图1 中所示的软件分析系统中的服务器。如图5所示,该针对泛型编程的类型敏感指针分析方法可以包括如下步骤:

步骤501,获取待分析的目标程序代码。

在传统的上下文敏感指针分析中,上下文c被扩展为一个元组,其中G记录了所有可用类型变量的实例化点。对于非泛型相关的方法,G是θ。G的大小受限于可用类型变量的数量。

在Java中,开发人员可以使用显式类型(图6(a))或不提供任何实际类型参数以将泛型类实例化。在后一种情况下,缺失为使用类型Object 将泛型类实例化。例如,在图6(b)中,s在第3行以类型HashSet 创建的。在第5行,首先创建类型为A的对象并隐式强制转换为Object,然后再将其放入s中。

步骤502,根据该泛型编程语句的类型,将该目标程序代码中的泛型编程语句中的类型变量,映射至该类型变量的实际类型,并将该类型变量与该实际类型的映射放入该泛型编程语句的上下文。

在本申请实施例中,需要对类型参数(也就是类型变量)进行推断,在本申请实施例的目标程序代码中,如果以类型形式参数T实例化泛型类的泛型对象O没有脱离其作用域,且其对T的所有使用可以解析为类型C,可以安全地将C视为实例化T的类型实际参数。

如在图6(b)中,如果未返回s(即没有脱离其声明的范围foo),则我们可以推断s以类型A将HashSet实例化,即s具有类型HashSet

最后,如果无法解析将泛型类实例化的类型实际参数,我们将实例化位置用作伪类型。在示例图6(b)中,引入一个伪类型T3来实例化s,即,在我们的分析中,第3行的语句被视为Sets=new HashSet()。因此,我们在分析泛型时将每个实例化位置都被视为不同的类型。

不失一般性,我们考虑简化的Java子集,在图7中有五个类型的标记语句。我们编写“x=newC”用于对象分配。如果C是一个泛型类,则T是它的类型形式参数,而A是实例化T的类型实际参数。否则,T和A 都是Nil。类似地,泛型方法调用“x=v0.m′(v1)”以类型实际参数A实例化其类型形式参数T。对于非泛型方法调用,T和A都是Nil。为简明起见,我们的形式化仅考虑只有一个类型参数的NEW和CALL语句。具有多个参数的NEW和CALL语句的一般形式可以相同的方式进行分析。

Java中的语句“x=new C(...)”被建模为“x=new C;x.(...)”,其中 ()是调用的相应构造函数。控制流语句对于上下文敏感流不敏感分析并不重要,因此被跳过。对数组元素的访问是通过将所有元素折叠到数组的一个特殊字段中来建模。此外,假设每个方法都通过变量ret返回。由于我们只用一个实参形式化方法调用,因此每个方法也只有一个形式参数p。

在一种可能的实现方式中,当该泛型编程语句类型为NEW语句时,根据类型更新函数,对该目标程序代码中的泛型编程语句中的类型变量进行处理,以将该类型变量映射至该实际类型;

该类型更新函数用于根据该NEW语句中的实例化类型,对该类型变量进行映射,以确定该类型变量的实际类型。

进一步的,当计算机设备检测到NEW语句中以类型变量将对象实例化时,查找该类型变量的映射的初始化点,并将该初始化点处的类型参数确定为该实际类型。

假定一个程序,令M、F、H、V、L、T分别是它的方法、域、初始化点、局部变量、语句标签和类型的集合。我们使用符号C来表示上下文。

我们的规则中使用了以下辅助函数:

·methodOf:

·methodCtx:

·dispatch:

·pts:

·typeOf:

其中methodOf给出了语句的包含方法,methodCtx维护用于分析方法的上下文,dispatch解析对目标方法的调用,pts记录变量或字段的上下文敏感指向信息,以及typeOf返回所声明类型的变量。

假定上下文元素c=[e1,...,en]的列表以及上下文元素e,我们使用符号 e++c表示[e,e1,...,en]和ck表示[e1,...,ek],其中k<n。

在本申请实施例所示出的类型敏感方案中,令

其中函数G(A)查找类型变量A的映射的初始化点。

而当该泛型编程语句类型为NEW类型时,可以采用如下规则对泛型编程语句进行类型敏感分析:

l:x=newCm=methodOf(l)

ctx=∈methodCtx(m)

在NEW语句中,给定方法上下文ctx=,堆上下文ctx被构造为 <[c]k-1,G′>,[c]

如果类型形式参数T是Nil,则将G′设置为

如果以具体类型,即

最后,如果以类型变量,即T≠Nil∧A∈G,将对象实例化,则我们通过查找l包含方法的上下文来确定A的实际实例化位置。G′被更新为

在一种可能的实现方式中,当该泛型编程语句类型为CALL语句时,根据类型追加函数,对该目标程序代码中的泛型编程语句中的类型变量进行处理,以将该类型变量映射至该实际类型;

该类型追加函数用于根据该CALL语句中的调用类型,对该类型变量进行映射,以确定该类型变量的实际类型。

在本申请实施例中,该对象追加函数可以如下所示:

在Append函数中,如果f是非泛型调用,即T≡Nil,则G保持不变。

如果f以具体类型,即,

如果f是以类型变量,即

在一种可能的实现方式中,当该CALL语句中的调用类型为具体类型的泛型调用时,将该类型变量与CALL语句中的类型实际参数的映射关系,确定为该类型变量与该实际类型的映射关系。

在一种可能的实现方式中,当该CALL语句中的调用类型为类型变量的泛型调用时,将该类型变量与实际实例化站点的具体类型的映射关系,确定为该类型变量与该实际类型的映射关系;

该实际实例化类型包括该CALL语句中目标方法的接收对象的类型,以及该目标方法的方法调用器的类型。

因此当该泛型编程语句类型为CALL类型时,可以采用如下规则对泛型编程语句进行类型敏感分析:

l:x=a

ctx=

(O

hctx=G′=Append(G,G

在[CALL]中,对实例方法x=a0.f的调用进行分析。令m′为目标方法,我们对于“this”变量参数编写tis

再次研究图3中的示例。在第2行利用实际类型A将泛型对象O

步骤503,基于该泛型编程语句的上下文,对该目标程序代码进行上下文敏感指针分析,以获得该目标程序代码中各个指针之间的指向关系。

在通过NEW语句以及CALL语句所对应的上下文敏感指针分析规则,对NEW语句以及CALL语句中的类型变量进行映射后,可以将分别得到的映射关系加入泛型编程语句(也就是NEW语句以及CALL语句)的上下文中。并且通过NEW语句以及CALL语句所对应的上下文敏感指针分析规则,还可以基于更新后的上下文,对指针之间的指向关系进行分析。

而如图6所示,在JAVA泛型编程中,除了NEW语句以及CALL语句外,还可以通过如下规则,对ASSIGN语句、LOAD语句以及STORE语句进行上下文敏感指针分析:

而由于上述语句的上下文敏感指针分析,与现有的类型敏感指针分析的分析方法类似,此处不再赘述。

也就是说,在本申请实施例所示方案中,通过对泛型编程中,涉及到类型变量的泛型编程语句(也就是CALL语句以及NEW语句),设置特定的上下文敏感指针分析的规则,将CALL语句以及NEW语句中的类型变量与实例化类型之间的对应关系,对CALL语句以及NEW语句进行上下文增广,从而提高了对泛型编程的分析准确性。

综上所述,在对泛型编程得到的目标程序代码进行指针分析时,可以先获取到目标程序代码中的泛型编程语句中的类型变量,从而确定出类型变量对应的实例化位置,再将类型变量与实际类型之间的映射关系放入泛型编程语句所对应的上下文,再进行上下文敏感指针分析,从而得到目标程序代码中各个指针之间的指向关系。上述方案在泛型编程得到的目标程序代码中,先通过对泛型编程语句中的类型变量进行分析,得到实际类型,且使用实例化泛型的具体类型是关键的上下文元素,因此将泛型实例化的具体类型与类型变量之间的映射关系放入上下文中进行上下文敏感指针分析从而得到各个指针之间的指向关系,提高了针对泛型编程的上下文敏感指针分析的准确性。

图8是根据一示例性实施例示出的一种针对泛型编程的类型敏感指针分析装置的结构方框图。该装置包括:

程序代码获取模块801,用于获取待分析的目标程序代码;

类型映射模块802,用于将所述目标程序代码中的泛型编程语句中的类型变量,映射至所述类型变量的实际类型,并将所述类型变量与所述实际类型的映射放入所述泛型编程语句的上下文;

指针分析模块803,用于基于所述泛型编程语句的上下文,对所述目标程序代码进行上下文敏感指针分析,以获得所述目标程序代码中各个指针之间的指向关系。

在一种可能的实现方式中,所述类型映射模块,用于根据所述泛型编程语句的类型,将所述目标程序代码中的泛型编程语句中的类型变量,映射至所述类型变量的实际类型。

在一种可能的实现方式中,所述类型映射模块,包括:

第一类型映射单元,用于当所述泛型编程语句类型为NEW语句时,根据类型更新函数,对所述目标程序代码中的泛型编程语句中的类型变量进行处理,以将所述类型变量映射至所述实际类型;

所述类型更新函数用于根据所述NEW语句中的实例化类型,对所述类型变量进行映射,以确定所述类型变量的实际类型。

在一种可能的实现方式中,所述类型映射单元,还用于当检测到NEW 语句中以类型变量将对象实例化时,查找所述类型变量的映射的初始化点,并将所述初始化点处的类型参数确定为所述实际类型。

在一种可能的实现方式中,所述类型映射模块,还包括:

第二类型映射单元,用于当所述泛型编程语句类型为CALL语句时,根据类型追加函数,对所述目标程序代码中的泛型编程语句中的类型变量进行处理,以将所述类型变量映射至所述实际类型;

所述类型追加函数用于根据所述CALL语句中的调用类型,对所述类型变量进行映射,以确定所述类型变量的实际类型。

在一种可能的实现方式中,所述第二类型映射模块,还用于,当所述 CALL语句中的调用类型为具体类型的泛型调用时,将所述类型变量与 CALL语句中的类型实际参数的映射关系,确定为所述类型变量与所述实际类型的映射关系。

在一种可能的实现方式中,所述第二类型映射单元,还用于,当所述 CALL语句中的调用类型为类型变量的泛型调用时,将所述类型变量与实际实例化站点的具体类型的映射关系,确定为所述类型变量与所述实际类型的映射关系;

所述实际实例化类型包括所述CALL语句中目标方法的接收对象的类型,以及所述目标方法的方法调用器的类型。

综上所述,在对泛型编程得到的目标程序代码进行指针分析时,可以先获取到目标程序代码中的泛型编程语句中的类型变量,从而确定出类型变量对应的实例化类型,再将类型变量与实例化类型之间的映射关系放入泛型编程语句所对应的上下文,再进行上下文敏感指针分析,从而得到目标程序代码中各个指针之间的指向关系。上述方案在泛型编程得到的目标程序代码中,先通过对泛型编程语句中的类型变量进行分析,得到泛型实例化类型,且使用具体类型实例化,泛型的类型是关键的上下文元素,因此将泛型实例化的具体类型与类型变量之间的映射关系放入上下文中进行上下文敏感指针分析从而得到各个指针之间的指向关系,提高了针对泛型编程的上下文敏感指针分析的准确性。

图9示出了本申请一示例性实施例示出的计算机设备900的结构框图。该计算机设备可以实现为本申请上述方案中的服务器。所述计算机设备900 包括中央处理单元(Central Processing Unit,CPU)901、包括随机存取存储器(Random Access Memory,RAM)902和只读存储器(Read-Only Memory, ROM)903的系统存储器904,以及连接系统存储器904和中央处理单元 901的系统总线905。所述计算机设备900还包括用于存储操作系统909、应用程序910和其他程序模块911的大容量存储设备906。

所述大容量存储设备906通过连接到系统总线905的大容量存储控制器(未示出)连接到中央处理单元901。所述大容量存储设备906及其相关联的计算机可读介质为计算机设备900提供非易失性存储。也就是说,所述大容量存储设备906可以包括诸如硬盘或者只读光盘(Compact Disc Read-Only Memory,CD-ROM)驱动器之类的计算机可读介质(未示出)。

不失一般性,所述计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括以用于存储诸如计算机可读指令、数据结构、程序模块或其他数据等信息的任何方法或技术实现的易失性和非易失性、可移动和不可移动介质。计算机存储介质包括RAM、ROM、可擦除可编程只读寄存器(Erasable Programmable Read Only Memory,EPROM)、电子抹除式可复写只读存储器(Electrically-Erasable Programmable Read-OnlyMemory, EEPROM)闪存或其他固态存储其技术,CD-ROM、数字多功能光盘(DigitalVersatile Disc,DVD)或其他光学存储、磁带盒、磁带、磁盘存储或其他磁性存储设备。当然,本领域技术人员可知所述计算机存储介质不局限于上述几种。上述的系统存储器904和大容量存储设备906可以统称为存储器。

根据本公开的各种实施例,所述计算机设备900还可以通过诸如因特网等网络连接到网络上的远程计算机运行。也即计算机设备900可以通过连接在所述系统总线905上的网络接口单元907连接到网络908,或者说,也可以使用网络接口单元907来连接到其他类型的网络或远程计算机系统 (未示出)。

所述存储器还包括至少一条计算机程序,所述至少一条计算机程序存储于存储器中,中央处理单元901通过执行该至少一条计算机程序来实现上述各个实施例所示的方法中的全部或部分步骤。

在一示例性实施例中,还提供了一种计算机可读存储介质,用于存储有至少一条计算机程序,所述至少一条计算机程序由处理器加载并执行以实现上述方法中的全部或部分步骤。例如,该计算机可读存储介质可以是只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、只读光盘(Compact Disc Read-Only Memory,CD-ROM)、磁带、软盘和光数据存储设备等。

在一示例性实施例中,还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述图2 或图3任一实施例所示方法的全部或部分步骤。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本申请未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。

应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制。

相关技术
  • 一种针对泛型编程的对象敏感指针分析方法及装置
  • 一种C语言的指针类型分析方法
技术分类

06120115572635