一种基于高阶函数的动态程序依赖簇检测方法

文档序号:33474737发布日期:2023-03-15 09:48阅读:34来源:国知局
一种基于高阶函数的动态程序依赖簇检测方法

1.本发明涉及程序分析领域,尤其涉及一种基于高阶函数的动态程序依赖簇检测方法。


背景技术:

2.依赖簇是相互依赖的程序组件的最大集合,目前主要的依赖簇检测方法有基于单调切片尺寸图msg (monotonic slice-size graph)的检测方法和形式概念分析的方法。
3.基于msg的检测方法通过切片技术,将依赖簇定义为具有相同切片的最大集合。该方法通过计算所有被测程序系统依赖图中程序节点的切片,检查其切片的尺寸是否相同,来近似判断程序组件组成的集合是否为依赖簇。
4.形式概念分析(fca)是一种精确的细粒度数学分析方法,目前在软件工程、数据挖掘、信息检索、本体研究等领域有着广泛应用。fca方法沿用了msg中的切片算法,并针对msg检测依赖簇时在准确度方面的不足,可以将从源代码中获取的依赖关系抽象和整理成形式背景,应用fca方法生成概念格,并在概念格中定义大型概念,通过大型概念来检测依赖簇。
5.无论是fca还是msg的依赖簇检测方法,其依赖关系计算过程均需构建系统依赖图(sdg)然后在此基础上进行相关的图可达性遍历算法。sdg是软件程序间控制依赖关系和数据依赖关系的图形表示,其中边表示依赖关系,节点的唯一标识表示依赖集合的一个元素,具体检测时,通过图的可达性遍历算法对每个节点进行依赖关系的收集,最终将所有节点的依赖性分析结果进行整合,得到相互依赖的节点集合,从而检测出程序中的一个依赖簇。
6.然而,sdg图反映的是静态的依赖关系,在进行依赖关系计算时忽略了程序执行过程中的控制流和语句的可达性定义,使其在进行动态检测时,不能根据具体的执行历史动态计算依赖关系,导致精度较低。本发明利用高阶函数形式的摘要,避免构建复杂的系统依赖图,能够精确地检测给定输入条件下程序中的依赖簇,并且能够提高依赖簇检测的效率。


技术实现要素:

7.本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本技术的说明书摘要和发明名称中可能会做些简化或省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。
8.鉴于上述存在的问题,本发明提供如下技术方案:一种基于高阶函数的动态程序依赖簇检测方法,包括:作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:利用符号执行工具获取程序在给定输入条件下的语句执行历史和函数调用关系,根据实际的调用关系构建简化的函数调用图;构建每个过程高阶函数形式的函数摘要,获取过程间由于过程调用和参数传递产生的依赖簇信息;将计算得到的依赖簇信息进行汇总,获取给定输入条件下相互依赖的程序语句,
从而检测动态程序依赖簇。
9.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:所述符号执行当中将源程序进行编译得到中间代码,其次对中间码进行优化,约简程序中的select,switch语句分别转换为phi语句和有条件跳转语句;符号执行器接收经过优化的中间代码,在给定的用户输入参数下进行符号执行。
10.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:所述有条件跳转语句是用0和1记录跳转的基本块,0表示条件为否时跳转的基本块,1表示条件为是时跳转的基本块。
11.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:所述函数调用图中记录被调用的函数名称为ncallee,对每个函数调用点,记录实际过程调用和被调用的函数名称,构成二元组;通过函数调用关系的二元组构建具体输入条件下的调用图再通过逆拓扑排序的顺序简化函数调用图确定子过程的分析顺序;自设定一个高阶函数,参数有实参的数据依赖、全局变量的数据依赖以及指令索引。
12.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:所述高阶函数的数据依赖参数初始化过程p的变量依赖集s,初始化语句依赖集l,依赖簇信息集c为空,获取过程p的入口基本块b
entry
;计算b
entry
中每条语句i的控制依赖关系即cd
i,
根据得到的语句执行历史和指令索引i计算当前指令的动态引用集ref(i,i),得到指令依赖l'(i)。
13.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:所述指令依赖的应用规则为,当前指令为phi指令时,根据得到的语句执行历史,和指令索引i计算phi指令的动态引用集,即当e(i)=n时,取phi指令的第n个选项为引用变量,其它指令,与它们的静态引用集保持一致,,其中e(i) = n 是通过当前指令索引i查找执行历史e中的对应值n;frml(p) 是过程p的形式参数集合;glob是程序的全局变量集合;alloca(p)是过程p的局部变量集合;inst(p)是过程p的指令集合;i’,j对应了当前指令i的引用节点和控制节点属于inst(p),λ为匿名函数,参数为f,g,i;f集合是上层函数的实参对应的依赖集合,即f
x
为第一个实参的依赖集合,fy为第二个实参的依赖集合;以此类推,g集合是上层函数进行调用时,当前全局变量对应的依赖集合,即g
x
为第一个全局变量的依赖集合,gy为第二个全局变量的依赖集合;以此类推,i为上层函数进行调用时的指令索引;f,g,i在调用点处由具体的数据进行代入,r是控制依赖和数据依赖对应的集合,是关于r的函数,r的参数中使用了λ表达式中的变量f,g;所有i的控制节点对应的依赖集合的合并,j对应了i的其中一个控制节点;所有变量类型的动态引用集对应的数据依赖的合并,x
对应了当前指令i引用的某一变量x;所有指令类型的动态引用集对应的数据依赖的合并,i’对应了当前指令i引用的某一指令i'。
14.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:根据访问的语句类型和指令依赖,更新指令索引i,语句依赖集l,变量依赖集s和依赖簇信息集c,针对赋值语句或内存修改语句i,更新该语句i中所定义变量x的变量依赖集s(x)为l'(i),更新依赖簇信息集c(ij,x) =s(x),针对赋值语句或内存修改语句以外的语句,更新该语句i语句的依赖集l(i)为l'(i),更新依赖簇信息集c(ij,i)= l(i),针对有条件跳转语句,函数调用语句,和phi语句,当前指令索引i 加1,其它语句的指令索引保持不变,针对有条件跳转语句,根据e(i)=0或1,获取下一个分析的基本块,0表示条件为否时跳转的基本块,1表示条件为真时跳转的基本块,针对无条件跳转语句,获取其跳转地址,针对return语句,此过程p结束,针对unreachable语句,此分析结束,退出。
15.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:根据过程语句依赖集l,变量依赖集s和依赖簇信息集c以及更新后的指令索引i,生成高阶函数形式的函数摘要,,其中frml(p) 是过程p的形式参数集合;glob是程序的全局变量集合,alloca(p)是过程p的局部变量集合,inst(p)是过程p的指令集合,λ为匿名函数,参数为f,g,i;f集合是上层函数的实参对应的依赖集合,即f
x
为第一个实参的依赖集合,fy为第二个实参的依赖集合;以此类推,g集合是上层函数进行调用时,当前全局变量对应的依赖集合,即g
x
为第一个全局变量的依赖集合,gy为第二个全局变量的依赖集合;以此类推,i为上层函数进行调用时的指令索引;f,g,i在调用点处由具体的数据进行代入;将指令索引,变量依赖集s和依赖簇信息集c更新过程视作为函数t,r, r’,返回值为更新后的指令索引,变量依赖集s和依赖簇信息集c。
16.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:通过高阶函数摘要中的执行历史和当前指令索引,可获得被调用函数q的过程内依赖分析结果,其包含调用结束后指令索引i’过程q的语句依赖集lq,变量依赖集sq和依赖簇信息集cq;如果sq中的依赖信息中不仅包含参数本身,还包括过程内的依赖信息值,则说明该变量是按结果调用类型,否则为按值调用类型,将全局变量视为按结果调用;针对按值调用的形参类型,对形参依赖关系信息中的参数值,只需代入调用点处
的控制依赖,即可获取形参的完整依赖关系;针对按结果调用形参类型,使用实参的依赖关系来对形参依赖关系信息中的参数值进行代入,并与调用点处的控制依赖进行合并,从而获取形参的完整依赖关系;针对按值调用的全局变量,使用空集替换全局变量依赖关系信息中的参数值;针对按结果调用的全局变量,使用调用过程p当前全局变量的依赖关系来对过程q全局变量依赖关系信息中的参数值进行代入,获取形参的完整依赖关系;对于过程q中的依赖簇信息集cq,其内部参数值均视为按结果调用,调用过程p中的相应实参,全局变量进行替换并与调用点处的控制依赖进行合并;如果过程q存在返回值,则将返回值变量对应的依赖信息添加到s
p
中;针对按结果调用形参类型,使用形参的依赖关系将s
p
中对应实参依赖关系信息中进行更新;针对按结果调用的全局变量,当过程q的全局变量依赖关系不为空集时,对s
p
中全局变量依赖关系信息中进行更新;更新i
p
为i’,依赖簇信息集更新方式为。
17.作为本发明所述的一种基于高阶函数的动态程序依赖簇检测方法的一种优选方案,其中:将得到的程序执行历史e,和初始指令索引i,定义i=0,代入该程序入口函数main函数的高阶函数形式的摘要,最终获取最终依赖簇信息集c。
18.本发明的有益效果:本发明提供的一种基于高阶函数的动态程序依赖簇检测方法利用函数式编程中的高阶函数特性,用参数化的形式保存函数摘要,能够根据执行历史动态计算每个调用过程的依赖关系,提高依赖簇检测的精度。
附图说明
19.为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
20.图1为本发明一个实施例提供的一种基于高阶函数的动态程序依赖簇检测方法的结构图。
21.图2为本发明第一个实施例提供的一种基于高阶函数的动态程序依赖簇检测方法流程图。
22.图3a为本发明第一个实施例提供的一种基于高阶函数的动态程序依赖簇检测方法中main函数,调用cluster函数前的语句和变量依赖关系集计算过程图;图3b为本发明第一个实施例提供的一种基于高阶函数的动态程序依赖簇检测方法中进入cluster函数后,语句和变量依赖关系集计算过程图;图3c为本发明第一个实施例提供的一种基于高阶函数的动态程序依赖簇检测方法中调用cluster函数结束,继续main函数语句和变量依赖关系集计算过程图。
23.图4为本发明第二个实施例提供的一种基于高阶函数的动态程序依赖簇检测方法中含有循环结构的源程序。
24.图5为本发明第二个实施例提供的一种基于高阶函数的动态程序依赖簇检测方法
中源程序中间语言表示。
具体实施方式
25.为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书附图对本发明的具体实施方式做详细的说明,显然所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明的保护的范围。
26.在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
27.实施例1
28.参照图1与图2,为本发明的一个实施例,提供了一种基于高阶函数的动态程序依赖簇检测方法,包括:步骤1:程序预处理具体包括步骤1.1:利用符号执行获取程序在给定输入条件下的语句执行历史和函数调用关系。
29.将源程序进行编译得到中间代码,其次对中间码进行优化,约简程序中的select,switch语句,分别转换为phi语句和有条件跳转语句。
30.符号执行器接收经过优化的中间代码,在给定的用户输入参数下进行符号执行。可使用klee作为符号执行工具。
31.作为本发明的进一步改进,语句执行历史包含以下部分:针对有条件跳转语句,用0,1记录跳转的基本块,0表示条件为否时跳转的基本块,1表示条件为真时跳转的基本块;针对函数调用点,记录被调用的函数名称 n
callee
;针对phi语句,用0,1..n,记录流入基本块的信息

其中n表示phi语句的基本块列表中,序号为n的基本块。
32.作为本发明的进一步改进,函数调用关系包含:对每个函数调用点,记录实际过程调用和被调用的函数名称,构成二元组 (n
caller
,n
callee
)。
33.步骤1.2:根据步骤1.1获取的函数调用关系构建简化的函数调用图;改进通过步骤1.1的函数调用关系二元组,构建具体输入条件下的调用图,从而约简了实际执行过程中没有被调用的函数。
34.步骤2获取各子过程的语句/变量依赖关系具体包括:步骤2.1:按照逆拓扑排序的顺序遍历步骤1.2构建的简化的函数调用图,确定子过程的分析顺序;步骤2.2:定义一个高阶函数,参数为:实参的数据依赖,全局变量的数据依赖,以及指令索引。
35.步骤2.3:用步骤2.2中高阶函数的数据依赖参数初始化过程p的变量依赖集s,初始化语句依赖集l,依赖簇信息集c为空,获取过程p的入口基本块b
entry

36.将所述语句依赖集和依赖簇信息集将初始化为空,变量依赖集将根据变量的类型分别初始化:针对全局变量或实参,分别将其变量依赖集初始化为函数参数变量gm或fn,其中参数gm对应第m个定义的全局变量,fn对应该过程的第n个形参,针对局部变量,将变量依赖集初始化为空。
37.步骤2.4:计算b
entry
中每条语句i的控制依赖关系即cd
i,
根据步骤1得到的语句执行历史,和指令索引i计算当前指令的动态引用集ref(i,i),得到指令依赖l'(i),所述当前指令动态引用集应用规则为:当前指令为phi指令时,根据步骤1得到的语句执行历史,和指令索引i计算phi指令的动态引用集,即当e(i)=n时,取phi指令的第n个选项为引用变量。其它指令,与它们的静态引用集保持一致。
38.指令依赖l(i)的计算方法为:,步骤2.5:根据当前访问的语句类型及步骤2.3的指令依赖l'(i),更新指令索引i,语句依赖集l,变量依赖集s和依赖簇信息集c。
39.设ij为指令i的第j次执行:针对赋值语句或内存修改语句i,更新该语句i中所定义变量x的变量依赖集s(x)为l'(i),更新依赖簇信息集c(ij,x) =s(x)。
40.针对赋值语句或内存修改语句以外的语句,更新该语句i语句的依赖集l(i)为l'(i),更新依赖簇信息集c(ij,i) = l(i)。
[0041] 针对有条件跳转语句,函数调用语句,和phi语句,当前指令索引i 加1,其它语句的指令索引保持不变。
[0042]
步骤2.6:待当前基本块分析结束。根据传入的语句执行历史,获取下一个需要基本块b
next

[0043]
针对有条件跳转语句,根据e(i)=0,1获取下一个分析的基本块,0表示条件为否时跳转的基本块,1表示条件为真时跳转的基本块。
[0044]
针对无条件跳转语句,获取其跳转地址。
[0045]
针对return语句,此过程p结束。
[0046]
针对unreachable语句,此分析结束,退出。
[0047]
步骤2.7:重复步骤2.2到步骤2.6,更新过程p中每个语句和变量的依赖关系,直至该过程结束,将完整的过程内语句间和变量间依赖集的计算过程和指令索引的更新过程作为步骤2.2中高阶函数的函数体,返回值为该过程语句依赖集l,变量依赖集s和依赖簇信息集c以及更新后的指令索引i,生成高阶函数形式的函数摘要。
[0048]

实参的数据依赖,全局变量的数据依赖,指令索引作为该高阶函数形式的摘要的参数,将步骤2.2-2.6的指令索引,变量依赖集s和依赖簇信息集c更新过程视作为函数t,r, r’,返回值为更新后的指令索引,变量依赖集s和依赖簇信息集。
[0049]
步骤3获取过程间由于过程调用和参数传递产生的依赖关系的具体包括:步骤3.1:按照步骤2.3所述方法,获取函数调用点处的控制依赖关系。
[0050]
步骤3.2:将步骤2.6生成的高阶函数式函数摘要中的执行历史e,当前指令索引i进行相应代入,可获取被调用函数q的过程内依赖分析结果。
[0051]
函数q的过程内依赖分析结果包含调用结束后指令索引i’,过程q的语句依赖集lq,变量依赖集sq和依赖簇信息集c
q。
[0052]
步骤3.3:分别按照调用类型获取参数传递和全局变量引起的数据依赖关系,根据形参和实参的对应关系,将步骤3.2获取的函数q的变量依赖集sq,和依赖簇信息集cq中的数据依赖参数进行相应代入。
[0053]
如果sq中的依赖信息中不仅包含参数本身,还包括过程内的依赖信息值,则说明该变量是按结果调用类型,否则为按值调用类型,将全局变量视为按结果调用。
[0054]
针对按值调用的形参类型,对形参依赖关系信息中的参数值,只需代入调用点处的控制依赖,即可获取形参的完整依赖关系。
[0055]
针对按结果调用形参类型,使用实参的依赖关系来对形参依赖关系信息中的参数值进行代入,并与调用点处的控制依赖进行合并,从而获取形参的完整依赖关系。
[0056]
针对按值调用的全局变量,使用空集替换全局变量依赖关系信息中的参数值。
[0057]
针对按结果调用的全局变量,使用调用过程p当前全局变量的依赖关系来对过程q全局变量依赖关系信息中的参数值进行代入,获取形参的完整依赖关系。
[0058]
对于过程q中的依赖簇信息集c
q,
其内部参数值均视为按结果调用,调用过程p中的相应实参,全局变量进行替换并与调用点处的控制依赖进行合并。
[0059]
步骤3.4:根据步骤3.3获取的代入后函数q的过程内依赖分析结果,更新当前调用过程p的指令索引i
p
,变量依赖集s
p
和依赖簇信息集c
p

[0060]
如果过程q存在返回值,则将返回值变量对应的依赖信息添加到s
p
中。
[0061]
针对按结果调用形参类型,使用形参的依赖关系将s
p
中对应实参依赖关系信息中进行更新。
[0062]
针对按结果调用的全局变量,当过程q的全局变量依赖关系不为空集时,对s
p
中全局变量依赖关系信息中进行更新。
[0063]
更新i
p
为 步骤3.2获取的i’。
[0064]
依赖簇信息集更新方式为。
[0065]
步骤3.5:根据步骤3.1和步骤3.4更新程序中每个语句和变量的依赖关系集,直至遍历程序退出。
[0066]
步骤4将计算得到依赖信息进行汇总,获取给定输入条件下相互依赖的程序语句,从而检测动态程序依赖簇具体包括:步骤4.1按照步骤3所述方法,获取最终的依赖簇信息集c。
[0067]
根据步骤3得到该程序入口函数如(main)函数的高阶函数形式的摘要,代入步骤1得到的程序执行历史e,和初始指令索引i,定义i=0,获取最终依赖簇信息集c。
[0068]
步骤4.2按照形式概念方法获取依赖簇信息集c中具有相同依赖(属性)的语句(对象)集合。
[0069]
作为本发明的进一步改进,将c(ij,v) 中 ij的集合作为fca方法的对象集,将c(ij,v)结果作为属性集,以此构造形式概念格,概念格中每一对概念concept=(o,a),表示具有相同依赖(属性)的语句(对象)集合。
[0070]
步骤4.3:根据步骤3.2中具有相同依赖(属性)的语句(对象)集合集合取交集,从而检测出给定输入条件下的程序依赖簇。
[0071]
对象集中的ij与属性集中的i进行交集时,满足关系即不区分i的某次执行。
[0072]
实施例2
[0073]
参照图3a、图3b、图3c、图4及图5,为本发明的第二个实施例,提供了一种基于高阶函数的动态程序依赖簇检测方法,为了验证本发明的有益效果,通过经济效益计算和仿真实验进行科学论证。
[0074]
步骤1:程序预处理——利用符号执行工具获取程序在给定输入条件下的语句执行历史和函数调用关系,根据实际的调用关系构建简化的函数调用图。
[0075]
步骤2:获取各个被调用子过程内的语句间和变量间的依赖关系,为每个过程生成高阶函数形式的函数摘要。
[0076]
步骤3:利用步骤2中生成的高阶函数形式的函数摘要,在过程调用点处对函数摘要的函数参数进行相应代入,获取过程间由于过程调用和参数传递产生的依赖关系。
[0077]
步骤4:将步骤3得到依赖信息进行汇总,获取给定输入条件下相互依赖的程序语句,从而检测动态程序依赖簇。
[0078]
本实施例中选取的程序代码为参照图4。
[0079]
所述步骤1具体包括:步骤1.1:利用符号执行获取程序在给定输入条件下的语句执行历史和函数调用关系。
[0080]
本实施例中,给定输入条件为8。
[0081]
将源程序进行编译得到中间代码,本实施例中选用llvm作为编译框架,生成的llvm中间表示如下,并使用klee作为符号执行工具。
[0082]
在图5中访问的指令序列为[11,12,13,14,1,2,3,4,5,6,7,8,9,42,52,62,10,15,16],忽略llvm.dbg语句。
[0083]
本实施例中,执行历史和函数调用记录过程如下:在语句15处记录被调用的函数名称为cluster,记录函数调用关系为(main,cluster);在语句4处记录phi语句引用索引为1;在语句6处br语句记录基本块跳转为1;在语句62处br语句记录基本块跳转为0;在语句42处记录phi语句引用索引为0;最终获得执行历史e = [“cluster”,“1”,“1”,“0”,“0”],函数调用关系为(main,cluster)。
[0084]
步骤1.2:根据步骤1.1获取的函数调用关系构建简化的函数调用图;所述步骤2具体包括:步骤2.1:按照逆拓扑排序的顺序遍历步骤1.2构建的简化的函数调用图,确定子过程的分析顺序;本实施例中,子过程的分析顺序为cluster-》main。
[0085]
步骤2.2:定义一个高阶函数,参数为:实参的数据依赖,全局变量的数据依赖,以及指令索引。
[0086]
步骤2.3:用步骤2.2中高阶函数的数据依赖参数初始化过程p的变量依赖集s,初始化语句依赖集l,依赖簇信息集c为空,获取过程p的入口基本块b
entry

[0087]
本实施例中,先对过程cluster获取依赖关系,语句依赖集和依赖簇信息集将初始化为空,针对形参x,可以判断出x是cluster过程的第1个参数,则将形参的变量依赖集初始化为参数f
x

[0088]
步骤2.4:计算b
entry
中每条语句i的控制依赖关系即cd
i,
根据步骤1得到的语句执行历史,和指令索引i计算当前指令的动态引用集ref(i,i),得到指令依赖l'(i)。
[0089]
针对llvm ir 中的phi语句,根据步骤1得到的语句执行历史,和指令索引i计算phi指令的动态引用集,即当e(i)=n时,取phi指令的第n个选项为引用变量。
[0090]
步骤2.5:根据当前访问的语句类型及步骤2.3的数据依赖和控制依赖结果,更新指令索引i,语句依赖集l,变量依赖集s和依赖簇信息集c。
[0091]
本实施例中,设ij为指令i的第j次执行:针对例中store语句,更新该语句i中所定义变量x的变量依赖集s(x),更新依赖簇信息集c(ij,x) =s(x),本实施例中赋值语句为store语句。
[0092]
针对例中store语句以外的语句,更新该语句i语句的依赖集l(i),更新依赖簇信息集c(ij,i) = l(i)。
[0093] 针对有条件跳转br语句,call语句,phi语句,当前指令索引i 加1,其它语句的指令索引保持不变。
[0094]
步骤2.6:待当前基本块分析结束。根据传入的语句执行历史,获取下一个需要基本块b
next

[0095]
针对例中有条件跳转br语句,根据e(i)=0,1获取下一个分析的基本块,0表示条件为否时跳转的基本块,1表示条件为真时跳转的基本块。
[0096]
针对例中无条件跳转br语句,获取其跳转基本块。
[0097]
针对例中return语句,过程结束。
[0098]
步骤2.7:重复步骤2.2到步骤2.6,更新过程p中每个语句和变量的依赖关系,直至该过程结束,将完整的过程内语句间和变量间依赖集的计算过程和指令索引的更新过程作为步骤2.2中高阶函数的函数体,返回值为该过程变量依赖集s和依赖簇信息集c以及更新后的指令索引i,生成高阶函数形式的函数摘要。
[0099]
本实施例中,可用以下公式定义过程cluster高阶函数形式的摘要,
,其中f
x
为过程cluster的对应实参数据依赖。
[0100]
本实施例中,可用以下公式定义过程main高阶函数形式的摘要,。
[0101]
由于该过程无实参,在生成的高阶函数形式的摘要中便没有实参的数据依赖作为参数,仅需初始的指令索引。
[0102]
步骤3获取过程间由于过程调用和参数传递产生的依赖关系的具体包括:步骤3.1:按照步骤2.3所述方法,获取调用点处的控制依赖关系。
[0103]
步骤3.2:将步骤2.6生成的高阶函数式函数摘要中的执行历史e,当前指令索引i进行相应代入,可获取被调用函数q的过程内依赖分析结果。
[0104]
本实施例中,在main函数中call语句处代入i=1获取过程cluster的依赖分析结果,且这种结果是根据输入的执行历史动态生成的。过程cluster的依赖分析结果包含调用结束后指令索引i’,变量依赖集s
cluster
和依赖簇信息集c
cluster

[0105]
步骤3.3:分别按照调用类型获取参数传递和全局变量引起的数据依赖关系,根据形参和实参的对应关系,将步骤3.2获取的函数q的变量依赖集sq,和依赖簇信息集cq中的数据依赖参数进行相应代入。
[0106]
本实施例中cluster函数的形参%0为按值调用。
[0107]
因此,对s
cluster
的形参%0,只需代入调用点处的控制依赖,获取形参的完整依赖关系。
[0108]
对于过程cluster中的依赖簇信息集c
cluster,fx
视为按结果调用,直接使用调用过程main中的相应实参,全局变量的数据依赖进行替换并与调用点处的控制依赖进行合并。
[0109]
步骤3.4:根据步骤3.3获取的代入后函数q的过程内依赖分析结果,更新当前调用过程p的指令索引i
p
,变量依赖集s
p
和依赖簇信息集c
p

[0110]
本实施例中,过程cluster存在返回值,则将返回值变量对应的依赖信息添加到s
main
中。
[0111]
针对cluster中按结果调用形参类型,使用形参的依赖关系将s
main
中对应实参依赖关系信息中进行更新。
[0112]
更新i
main
为 步骤3.2获取的i’。
[0113]
依赖簇信息集更新方式为。
[0114]
步骤3.5:重复步骤3.1至步骤3.4更新程序中每个语句和变量的依赖关系集,直至对函数调用图遍历完毕。
[0115]
本实施例中,对每条指令的分析过程可见图3a、图3b及图3c,由于调用cluster的
实参为常量8,则fx为空集。
[0116]
步骤4将计算得到依赖信息进行汇总,获取给定输入条件下相互依赖的程序语句,从而检测动态程序依赖簇具体包括:步骤4.1:按照步骤3所述方法,获取最终的依赖簇信息集c。
[0117]
本实施例中,根据步骤3得到该程序入口函数main函数的高阶函数形式的摘要,代入初始指令索引i=0(此时实参和全局变量的数据依赖为空),从而获取最终依赖簇信息集c。
[0118]
步骤4.2:按照形式概念方法获取依赖簇信息集c中具有相同依赖(属性)的语句(对象)集合。
[0119]
本实施例中,将c(ij,v) 中 ij的集合作为fca方法的对象集,将c(ij,v)结果作为属性集,以此构造形式概念格,概念格中每一对概念concept=(o,a);表示具有相同依赖(属性)的语句(对象)集合;步骤4.3:根据步骤3.2中具有相同依赖(属性)的语句(对象)集合;集合取交集,从而检测出给定输入条件下的程序依赖簇。
[0120]
本实施例中,由依赖簇信息集:c(7,7)={2,4,5,6,7,14};c(42,4)={2,4,5,6,7,14};c(52,5)={2,4,5,6,7,14};c(62,6)={2,4,5,6,7,14};可获得概念concept=(o,a);其中 o={42,52,62,7};a ={2,4,5,6,7,14};oa ={4,5,6,7};可知节点{4,5,6,7}构成此程序在输入为8依赖簇。
[0121]
应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1