本发明涉及图可达性索引方法,属于计算机程序分析技术领域。
背景技术:
按需程序分析是在用户给定分析目标后,只计算分析与目标相关信息,而不计算全局信息的一种分析策略。如何快速确定程序控制流图(controlflowgraph,cfg)中与分析目标相关联范围的图可达性查询是决定按需分析效率的关键。但是,当前图可达性算法主要针对稀疏有向无环图,缺少对程序控制流图中非生成树边和循环体内有向环子图的优化与处理,处理效率低。
按需的程序分析对可达性查询的预处理时间和查询时间都比较敏感。双标签法具有常数时间复杂度的可达性查询特点,可以很好的满足程序按需分析的要求。但是,由于命令式语言结构化编程对应的控制流图是典型的稀疏图,而结构化编程中的循环结构和分支结构都包含非树边,同时双标签法建立标签的时空复杂度受非树边的影响较大,因而,双标签法在构建可达性索引的时空效率受到控制流图中常见的分支、循环结构的限制。另外双标签法研究对象是一般有向图,缺少针对程序流程图特点的处理,所以时空开销较大。
技术实现要素:
本发明为解决现有控制流图图可达性索引技术时空开销较大的问题,提供了按需的可约程序控制流图图可达性索引方法。
本发明所述按需的可约程序控制流图图可达性索引方法,通过以下技术方案实现:
利用深度优先策略遍历程序控制流图中所有节点;以区域层次深度作为度量权重,通过加权工作列表存储待编码节点;该加权工作列表是由堆数据结构实现,插入列表的节点根据区域层次深度排序,保证顶端节点的层次最深,弹出列表的节点是按区域层次深度优先策略排序的节点;具体为:
步骤一、初始化工作列表;
步骤二、根据节点区域层次深度排序,遍历工作列表进行编码;返回当前工作列表内区域层次深度最大的节点进行编码处理;
步骤三、根据步骤二中返回的节点出度继续处理:
当只有一个后续节点且未进行编码时,在同层内延续编码,并以当前区域层次深度作为权重加入到工作列表中;
当有多个后续节点时,先检验该节点有没有编码,然后根据区域层次深度差异进行编码:若后续节点所处区域层次深度小于当前区域层次深度,则该后续节点是当前区域的出口节点,该出口节点编码同层延续其支配节点编码;若后续节点区域层次深度大于或等于当前区域层次深度,该后续节点是当前节点的分支节点,其编码追加层次获得。
本发明最为突出的特点和显著的有益效果是:
本发明所涉及的按需的可约程序控制流图图可达性索引方法,利用控制流图中区域结构所隐含的层次顺序关系,建立表达多重从属关系的可达性索引,将非树边和循环体的影响限制在临近区域内,不仅避免计算有向图非生成树边的可达性传递闭包,而且整合了程序控制流图中有向环子图的编码与图可达性判断。本发明在保证查询复杂度增加可接受复杂度的条件下,着重处理非树边作用下的可达性信息存储方式以提升整体可达性信息索引和查询效率,时空复杂度与控制流图的规模呈线性关系,相比现有方法,平均时空开销降低约20%。
附图说明
图1为实施例中测试程序的控制流图;
图2为实施例中测试程序对应的支配树结构;
图3为实施例中测试程序对应的区域结构图;
图4为实施例中测试程序对应的区域结构树;
图5为实施例中测试程序的控制流图层次线性化编码图。
具体实施方式
具体实施方式一:本实施方式给出的按需的可约程序控制流图图可达性索引方法,具体包括以下步骤:
利用深度优先策略遍历程序控制流图中所有节点;以区域层次深度作为度量权重,通过加权工作列表(worklist)存储待编码节点;该加权工作列表是由堆数据结构实现,插入列表的节点根据区域层次深度排序(如下文层次线性化编码算法代码的第②行、第
步骤一、初始化工作列表,如第①~②行;
步骤二、然后根据节点区域层次深度排序,遍历工作列表进行编码;第④行返回当前工作列表内区域层次深度最大的节点进行编码处理;
步骤三、根据步骤二中返回的节点出度继续处理:
当只有一个后续节点且未进行编码时,在同层内延续编码,并以当前区域层次深度作为权重加入到工作列表中,如第⑤~
当有多个后续节点时,先检验该节点有没有编码,如第
以下是层次线性化编码(hierarchicallinearizationcoding,hlc)算法(输入:入口节点entry,区域信息region,支配树信息dt;
输出:控制流图中各节点的hlc编码):
具体实施方式二:本实施方式与具体实施方式一不同的是,所述进行编码过程对应的层次线性化编码域具体为:
hlcdomain={g,dt,rt,st,hlc,≤r}
该域是六元组。其中,hlcdomain表示层次线性化编码域,其包括层次线性化编码结构、其上的从属关系以及构造该结构所依赖的信息;g是程序控制流图,是有向图,g=(v,e);|v|=n,n为节点;|e|=m,m表示节点所处区域层次深度(边的数目);dt是程序控制流图对应的支配树;rt是程序控制流图对应的区域结构树,st=(v,est)是根据区域层次深度优先遍历g产生的生成树,对应的非树边enst=e-est;hlc是根据生成树设置的节点编码;≤r是定义在该编码上的偏序关系,以反映节点在生成树上的从属关系。
层次线性化编码利用了区域结构所隐含的层次顺序关系,将回边和交叉边的局部层次特点蕴含其中,统一表达控制流图的顺序关系和非树边作用下的层次关系。层次关系分为层次内顺序关系和层次间从属关系。根据区域结构,按区域层次深度优先遍历程序控制流图,产生对应的生成树st。在遍历过程中,根据编码结构和编码规则,为控制流节点赋予层次线性化编码。
其他步骤及参数与具体实施方式一相同。
具体实施方式三:本实施方式与具体实施方式二不同的是,所述层次线性化编码结构具体为:
hlcm=(hlcparent,lcm)=(lc0m,lc1m,…,lcm-1m,lcm)=(lc(0,m-1)m,lcm)=lc(0,m)m
其中,hlcm为节点m的层次线性化编码;m表示节点m所处区域层次深度;lc0m,lc1m,…,lcim分别为hlcm从有向流图根节点到当前节点经历的区域头节点层内顺序编码,i∈[0,m];lcm=lcmm是节点m所在最底层区域内顺序编码;hlcparent为父节点的层次线性化编码。
其他步骤及参数与具体实施方式一或二相同。
具体实施方式四:本实施方式与具体实施方式三不同的是,所述节点m所在最底层区域内顺序编码的构成为:
lcm=branchnumm,×seqnumm
其中,branchnumm表示节点m所在分支序号,seqnumm表示节点m所在分支内序号。
其他步骤及参数与具体实施方式一、二或三相同。
具体实施方式五:本实施方式与具体实施方式三或四不同的是,所述hlcparent具体为:
hlcparent:=φ|hierarchicallinearizationcoding
其中,“:=”表示赋值;“|”表示或者;φ为终结符号,表示为空;例如,根节点的父节点编码hlcparent为空。
层次线性化编码由递归方式定义,具体由两部分组成:父层区域入口节点的层次线性化编码hierarchicallinearizationcoding和当前区域内顺序编码lcm构成,父层区域入口节点的层次线性化编码hierarchicallinearizationcoding具体为:
hierachicallinearizationcoding:=hlcparent×lcm
hierachicallinearizationcoding∈lcm+
其中,上标“+”表示多个。
其他步骤及参数与具体实施方式一、二、三或四相同。
实施例
采用以下实施例验证本发明的有益效果:
层次线性化编码方法主要针对程序流程图中语句的图可达性问题,因此,采用面向共享内存模型的parsec程序测试集合中若干程序和开源程序(bind-9.0.6-p1,mysql-5.0.26)的控制流图作为测试对象,测试程序包括:named、checkzone、checkconf、mysqld、x264。实验过程是:首先,采用gcc-llvm编译该测试集生成llvm字节码;然后通过llvm中优化分析程序获取测试程序的控制流图。测试环境为intelb980型号cpu(2.4ghz主频)、2gb内存和ubuntu12.04(64b)操作系统,
首先在获取的控制流图上应用本发明提出的层次线性化编码方法:
如图1是实例程序(named)的控制流图,图2是对应的支配树结构,图3是对应的区域结构图,其中region-1至region-5分别表示不同区域,图4是对应的区域结构树,图5中,入口节点a无非回边前驱,所以lcparent为空,编码为第0分支第1序号节点,即lca=01,hlca=hlcparent,lca=lca=(0,1)。节点b有唯一非回边前驱a;且a为非分支节点,所以同层直接延续节点a编码,即第0分支第2序号节点;同理,hlcb=(0,2);节点c唯一非回边前驱b为分支节点,为了分别排序各分支顺序,需要扩张节点c编码,所以hlcparent=hlcb,作为节点b的第0分支第1节点,lcc=(0,1);hlcc=hlcb;lcc=0201;节点d与节点c相似,作为分支节点c的第0分支第1节点需要扩:hlcparent=hlcc,hlcd=hlcc,lcd=(0,2)(0,1)(0,1);
节点e所处区域层次深度低于父节点,即为汇聚节点,应该约简父节点d编码而延续临近节点c的分支继续编码。节点g与节点d都是节点e的父节点,但由于节点d是节点e的直接支配节点,所以与节点g不同,具体对应的控制结构为if-then结构。节点e与临近分支节点d属于同一层次,所以其hlcparent=hlcc;作为节点c第0分支第2节点,lce=(0,2);hlce=(0,2)(0,1)(0,2);节点f与唯一非回边前驱非分直接点e同区域,因此同层直接延续结e编码,hlcf=(0,2)(0,1)(0,3);节点h是区域入口节点,与节点c、节点d相同;节点m、节点i和节点k属同汇聚节点。
然后在获取的控制流图上应用重新实现的双标签法。本发明方法(hlc)与双标签法(dl)运行的时空开销运行结果如表1所示:
表1运行结果表
构建时空复杂度与控制流图的规模关系,本发明方法(hlc)与双标签法(dl)运行的时空复杂度对比如下表2:
表2时空复杂度对比
由表1、表2可以看出,本发明方法能够提升整体可达性信息索引和查询效率,时空复杂度与控制流图的规模呈线性关系;相比双标签法,平均时空开销降低约20%。
本发明还可有其它多种实施例,在不背离本发明精神及其实质的情况下,本领域技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。