一种基于高阶函数的轻量级上下文敏感指针分析方法

文档序号:31637328发布日期:2022-09-24 05:07阅读:55来源:国知局
一种基于高阶函数的轻量级上下文敏感指针分析方法

1.本发明涉及函数式编程和程序分析的技术领域,尤其涉及一种基于高阶函数的轻量级上下文敏感指针分析方法。


背景技术:

2.近年来,指针分析是程序分析领域中的一个重要技术,通过指针分析可以确定程序中指针变量所指向的地址。指针分析的结果可以应用在其他程序分析的技术上,并且能直接影响这些技术的分析结果的准确性。指针分析可以根据不同的维度进行分类,选取程序中的调用点作为上下文信息,此外在面向对象的程序中可以选取函数的接收对象作为上下文信息,或是以函数的接受对象的类型作为上下文信息等。
3.传统的上下文敏感的指针分析方法需要为函数体内外的变量建立一张映射表,不仅需要记录实参x和形参a的对应关系,还需要引入辅助变量表示*x、**x,根据x中存放的变量地址,间接引用其他变量,并记录*x、**x与其间接引用的变量的对应关系,在被调用函数分析结束后,再根据映射表的对应关系进行反映射;而利用高阶函数进行分析,只需代入实参本身,而通过实参进行间接引用的值,即实参的指向集,可以通过函数的形式从被调用函数体内带回调用点处,在调用点处计算具体的指向。
4.高阶函数是函数式编程的一种特性,可以将函数作为参数和返回值,因此在指针分析过程中,可以将不确定的指向集以函数形式带回调用点处,在调用点处根据实际的指向再将指向信息具体化。


技术实现要素:

5.本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本技术的说明书摘要和发明名称中可能会做些简化或省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。
6.鉴于上述现有存在的问题,提出了本发明。
7.为解决上述技术问题,本发明提供如下技术方案,包括:确定函数分析顺序;根据函数分析顺序收集上下文不敏感的指向约束;收集上下文敏感的指向约束;求解上下文不敏感的指向约束和上下文敏感的指向约束得到被调用函数的指向信息分析结果,并以高阶函数形式保存;判断函数是否全部分析完毕,若未分析完毕,则继续收集上下文不敏感的指向约束;否则,则输出指针分析结果。
8.作为本发明所提出的基于高阶函数的轻量级上下文敏感指针分析方法的一种优选方案,其中:提出确定函数分析顺序包括:生成待分析程序的函数调用图,并根据函数调用图将待分析程序中的函数进行逆拓扑排序。
9.作为本发明所提出的基于高阶函数的轻量级上下文敏感指针分析方法的一种优选方案,其中:收集上下文不敏感的指向约束包括:按函数分析顺序取出一个待分析函数,生成该函数的控制流图,并根据源代码中变量的类型分别进行指针信息初始化;遍历控制
流图中每个节点,即语句,分析其中与指针信息相关的语句,并将语句中的指针信息以约束形式添加到约束表中。
10.作为本发明所提出的基于高阶函数的轻量级上下文敏感指针分析方法的一种优选方案,其中,包括:指针信息相关的语句指不涉及函数调用的且会改变指针指向的四类语句,分别为pointer语句、copy语句、load语句、store语句;利用基于集合包含的指针分析算法对四类语句进行分析,并将语句中的指针信息以约束形式添加到约束表中。
11.作为本发明所提出的基于高阶函数的轻量级上下文敏感指针分析方法的一种优选方案,其中:收集上下文敏感的指向约束包括:针对函数调用语句,根据不同的调用类型,将调用点处实参指针、全局指针的指向信息代入被调用函数的指向信息摘要中;根据形参和实参的对应关系将实例化后的指向信息传递回调用点,并收集实例化后的指向信息;其中不同的调用类型包括:外部函数调用、直接调用和间接调用。
12.作为本发明所提出的基于高阶函数的轻量级上下文敏感指针分析方法的一种优选方案,其中:收集上下文敏感的指向约束的工作过程包括:当调用类型为直接调用时,获取调用点处全局指针的指向信息和实参指针的指向信息,并代入被调用函数摘要的对应参数处,实例化指向信息摘要;将实例化后的指向信息摘要传递回调用点处,并根据摘要中的指向信息生成约束;当调用类型为间接调用时,获取调用点处函数指针、全局指针、实参指针的指向信息,根据函数指针的指向结果,将函数指针、全局指针、实参指针的指向信息分别代入;当程序中出现条件语句,当x》0时函数指针f指向a函数的地址,当x《0时函数指针f指向b函数的地址;在后续分析时,会将f指向a和f指向b的情况都考虑进去,被调用函数的摘要中对应的参数处进行实例化;将多个函数摘要中的指向信息汇总,传递回调用点处,并根据摘要中的指向信息生成约束。
13.作为本发明所提出的基于高阶函数的轻量级上下文敏感指针分析方法的一种优选方案,其中:实例化对应的参数包括:间接调用时,需要根据函数指针f的指向来判断具体调用函数;若程序执行到该点时,函数指针的指向集包含两个函数a和b的地址;需要分别实例化a的摘要和b的摘要,实例化a摘要的时候只能将f

a代入,实例化b摘要的时候只能将f

b代入;将函数指针f的当前值代入被调用函数中的函数指针参数处:将函数指针f的当前值代入被调用函数中的函数指针参数处:若函数指针f在调用点处可能指向a函数和b函数的地址,即pts(f)={a,b},其中,pts(f)表示f的指向集,则分别实例化a函数和b函数的摘要,在实例化a的函数摘要时,将pts(f)={a}代入对应的摘要中;实例化b函数摘要时,将pts(f)={b}代入对应的摘要中;将当前程序点处的全局指针和实参指针代入被调用函数摘要的对应参数处。
14.作为本发明所提出的基于高阶函数的轻量级上下文敏感指针分析方法的一种优选方案,其中:求解上下文不敏感的指向约束和上下文敏感的指向约束包括:按照集合包含的约束求解规则对上下文不敏感的指向约束和上下文敏感的指向约束进行求解,计算每个指针的指向集的内容;利用函数与变量地位相等特性,将含有参数的指向集以函数形式保存;将被调用函数的指向信息分析结果以λ函数形式保存。
15.本发明的有益效果:利用高阶函数的性质进行分析可以避免上下文敏感分析时为解决指针间接调用引入辅助变量,以及映射和反映射操作;利用高阶函数进行分析,只需代入实参本身,而通过实参进行间接引用的值,即实参的指向集,可以通过函数的形式从被调
用函数体内带回调用点处,在调用点处计算具体的指向。
附图说明
16.为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。其中:
17.图1为本发明第一个实施例所述的基于高阶函数的轻量级上下文敏感指针分析方法的上下文敏感的指向信息收集流程图。
具体实施方式
18.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书附图对本发明的具体实施方式做详细的说明,显然所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的保护的范围。
19.在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
20.其次,此处所称的“一个实施例”或“实施例”是指可包含于本发明至少一个实现方式中的特定特征、结构或特性。在本说明书中不同地方出现的“在一个实施例中”并非均指同一个实施例,也不是单独的或选择性的与其他实施例互相排斥的实施例。
21.本发明结合示意图进行详细描述,在详述本发明实施例时,为便于说明,表示器件结构的剖面图会不依一般比例作局部放大,而且示意图只是示例,其在此不应限制本发明保护的范围。此外,在实际制作中应包含长度、宽度及深度的三维空间尺寸。
22.同时在本发明的描述中,需要说明的是,术语中的“上、下、内和外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一、第二或第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。
23.本发明中除非另有明确的规定和限定,术语“安装、相连、连接”应做广义理解,例如:可以是固定连接、可拆卸连接或一体式连接;同样可以是机械连接、电连接或直接连接,也可以通过中间媒介间接相连,也可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
24.实施例1
25.参照图1,为本发明的第一个实施例,该实施例提供了一种基于高阶函数的轻量级上下文敏感指针分析方法,包括:
26.s1:确定函数分析顺序。
27.生成待分析程序的函数调用图,并根据函数调用图将待分析程序中的函数进行逆拓扑排序。
28.应说明的是,函数指的是可获取的任一一段程序代码,获取来源可为互联网等任一公开资源。
29.s2:根据函数分析顺序收集上下文不敏感的指向约束。
30.(1)按函数分析顺序取出一个待分析函数,生成该函数的控制流图,并根据源代码中变量的类型分别进行指针信息初始化;
31.(2)遍历控制流图中每个节点,即语句,分析其中与指针信息相关的语句,并将语句中的指针信息以约束形式添加到约束表中。
32.指针信息相关的语句指不涉及函数调用的且会改变指针指向的四类语句;
33.针对pointer语句a=&b,添加约束loc(b)∈pts(a)(其中loc(b)表示b的内存地址);
34.针对copy语句a=b,添加约束
35.针对load语句a=*b,对添加约束
36.针对store语句*a=b,对添加约束
37.在分析load语句和store语句时,如果遇到含参数的指向集,无需对其指向集中的每一个变量单独添加约束,而是借助函数与变量地位相等这一高阶函数特性,将该指向集保存为一个函数,直接添加约束;
38.若对a=*b,其中b为形参,对应的参数为β,原本应该按照约束规则:对添加约束但此处β是不确定的变量,要根据调用点处的实参才能确定其指向集,因此直接添加约束实参才能确定其指向集,因此直接添加约束在实例化摘要后根据具体的实参分析其指向信息;
39.s3:收集上下文敏感的指向约束。
40.(1)针对函数调用语句,根据不同的调用类型(外部函数调用、直接调用和间接调用),将调用点处实参指针、全局指针的指向信息代入被调用函数的指向信息摘要中;
41.调用点相对于调用语句粒度更细一点,在系统依赖图上,一条调用语句可以表示为好几种点;
42.具体的,外部函数调用:调用其他源文件中定义的函数,由于无法获取其他源文件中的函数体,本发明对常用的外部函数,有相应的指向信息摘要,并会根据摘要添加指向信息;其他不常用的外部函数则默认不对分析产生影响;
43.直接调用:对当前源文件中的函数进行直接调用;
44.间接调用:通过函数指针对当前源文件中的函数进行间接调用;
45.(2)根据形参和实参的对应关系将实例化后的指向信息传递回调用点,并收集实例化后的指向信息。
46.具体的,当调用类型为直接调用时,获取调用点处全局指针的指向信息和实参指针的指向信息,并代入被调用函数摘要的对应参数处,实例化指向信息摘要;将实例化后的指向信息摘要传递回调用点处,并根据摘要中的指向信息生成约束;
47.如函数调用语句为call fun(a,t),首先获取全局指针t和实参指针a的指向信息,即pts(t)和pts(a),然后根据变量a、t和参数α、β之间的对应关系,将这两个指向集代入fun
函数的摘要λα.λβ.fun(α,β)中,得到实例化后的指向信息,即fun(a,t),再传递回调用点处生成约束。
48.当调用类型为间接调用时,获取调用点处函数指针、全局指针、实参指针的指向信息,根据函数指针的指向结果,将函数指针、全局指针、实参指针的指向信息分别代入
49.当程序中出现条件语句,当x》0时函数指针f指向a函数的地址,当x《0时函数指针f指向b函数的地址;
50.在后续分析时,会将f指向a和f指向b的情况都考虑进去,被调用函数的摘要中对应的参数处进行实例化;将多个函数摘要中的指向信息汇总,传递回调用点处,并根据摘要中的指向信息生成约束。
51.如函数调用语句为call*fp(a),首先获取函数指针fp、全局指针t、实参指针a的指向信息pts(fp)、pts(t)和pts(a),然后根据函数指针的指向信息(如图1,pts(fp)={p,q}),分别实例化p的函数摘要和q的函数摘要:实例化函数p的摘要时,根据a、t、fp和参数α、β、γ的对应关系,将pts(t)、pts(a)和pts(fp)=p代入p函数摘要λα.λβ.λγ.p(α,β,γ)中,得到实例化后的指向信息p(a,t,p);同样地,实例化函数q的摘要,得到指向信息q(a,t,q);然后将这两份指向信息汇总p(a,t,p)∪q(a,t,q),传递回调用点处生成约束。
52.s4:求解上下文不敏感的指向约束和上下文敏感的指向约束,得到被调用函数的指向信息分析结果,并以高阶函数形式保存。
53.(1)按照集合包含的约束求解规则对收集的指向约束进行求解,计算每个指针的指向集的内容(变量或含参数的指向集)。借助函数与变量地位相等这一高阶函数特性,将含有参数的指向集以函数形式保存,无需直接计算其具体指向结果。
54.(2)将约束求解的结果以λ函数形式保存,如λα.λβ.p(α,β),其中p(α,β)为含函数参数的指向分析结果。
55.s5:判断函数是否全部分析完毕,若未分析完毕,则转s2继续收集其他函数的指向约束;否则,则输出指针分析结果。
56.实施例2
57.本实施例中选取的程序代码如表1所示。
58.第一步,确定函数分析顺序,对应实施例1的步骤s1。
59.本实施例中,函数的分析顺序为foo

main。
60.表1示例代码
[0061][0062][0063]
第二步,收集foo函数的上下文不敏感约束,对应步骤s2。
[0064]
(1)对函数中的形参进行初始化,用希腊字母α和β分别代表形参指针p和q,变量obj虽然是全局变量,但不是指针变量,因此不需要用符号代替。
[0065]
(2)根据函数foo中四条语句,我们可以得到如下约束,
[0066][0067]
由于foo函数中没有函数调用语句,因此可以跳过步骤s3。
[0068]
第三步,求解foo函数的指向约束,生成foo函数的函数摘要,对应步骤s4。
[0069]
本实施例中,foo函数的摘要为λα,β.{pts(pts(α))={pts(pts(β))},pts(pts(β))={obj}}。
[0070]
第四步,判断函数是否分析完毕。前三步只分析了foo函数,还有main函数未分析,因此需要继续收集main函数的指向信息,对应步骤s5。
[0071]
第五步,收集main函数的上下文不敏感约束,对应步骤s2。
[0072]
根据main函数中指针相关的语句,可以得到第11行的约束loc(a)∈pts(x),loc(b)∈pts(y),第15行的约束loc(c)∈pts(x),loc(e)∈pts(y),第17行的约束loc(d)∈pts(x),loc(d)∈pts(y),第19行的约束loc(t)∈pts(c)。
[0073]
第六步,收集main函数的上下文敏感约束,对应步骤s3。
[0074]
本实施例中,分析到12行的调用语句时,根据被调用函数类型判断,此处为直接调用:
[0075]
(1)获取实参指针的指向信息pts(x)={a},pts(y)={b};将指向信息代入foo函数的摘要中:根据对应关系(x对应参数α,y对应参数β),得到pts(a)={pts(b)},pts(b)={obj}};
[0076]
(2)将实例化后的摘要带回调用点处,并根据摘要中的指向信息生成约束。根据当前调用点处a的指向集得到得到pts(b)=loc(obj),然后将其改写为约束obj∈pts(b)放入约束表中。
[0077]
相似地,本实施例中,分析到20行的调用语句时,获取当前调用点的指向信息pts(x)={c,d},pts(y)={d,e},将其代入到foo函数摘要中,得到pts(c,d)={pts(d,e)},pts(d,e)=loc(obj),再分别将其改写为约束,放入约束表中。
[0078]
第七步,求解main函数的指向约束,生成main函数的函数摘要,对应步骤s4。
[0079]
本实施例中,main函数的摘要为:pts(b)=loc(obj),pts(c)=loc(t),pts(d)=loc(obj),pts(e)=loc(obj),pts(x)=loc(a),pts(y)=loc(b)。
[0080]
此时main函数中已经没有未知的参数了,因此函数摘要不是λ函数的形式。
[0081]
第八步,判断函数是否分析完毕。本实施例中两个函数已经分析完毕,此时将完整的指向分析结果输出,对应步骤s5。
[0082]
应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
[0083]
此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
[0084]
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、ram、rom等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不
同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
[0085]
如在本技术所使用的,术语“组件”、“模块”、“系统”等等旨在指代计算机相关实体,该计算机相关实体可以是硬件、固件、硬件和软件的结合、软件或者运行中的软件。例如,组件可以是,但不限于是:在处理器上运行的处理、处理器、对象、可执行文件、执行中的线程、程序和/或计算机。作为示例,在计算设备上运行的应用和该计算设备都可以是组件。一个或多个组件可以存在于执行中的过程和/或线程中,并且组件可以位于一个计算机中以及/或者分布在两个或更多个计算机之间。此外,这些组件能够从在其上具有各种数据结构的各种计算机可读介质中执行。这些组件可以通过诸如根据具有一个或多个数据分组(例如,来自一个组件的数据,该组件与本地系统、分布式系统中的另一个组件进行交互和/或以信号的方式通过诸如互联网之类的网络与其它系统进行交互)的信号,以本地和/或远程过程的方式进行通信。
[0086]
应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1