更全的杂志信息网

基于抽象解释理论的循环边界计算方法

更新时间:2009-03-28

在安全关键领域有许多硬实时的系统需求。例如航空发动机的控制系统,汽车的防抱死系统,一旦程序未能在有限的时间范围内完成既定的功能,就可能带来严重的后果。因此,对于诸如此的安全关键软件进行执行时间尤其是最坏执行时间的分析是十分有必要的[1]。为此在一些特定领域出现了许多对程序进行执行时间分析的工具。例如空客公司使用的程序分析工具OTAWA等[2]。但是在程序的执行时间分析过程中需要用户标注程序的循环边界。

沥青路面的施工材料主要包括沥青、碎石、集料、燃烧油等,施工材料的质量主要由原材料自身的规格和特性决定,因此,材料负责人及质检人员要对这2项内容进行严格的控制和检测。首先,购买沥青原材料前,要检查材料是否具有质量合格证,然后由质检人员进行抽样送检。施工过程中,要禁止出现偷工减料的情况,及时制定健全的质量管理制度,提高质量安全管理水平,减少事故的发生,从而减少施工企业的质量安全成本。

对程序循环边界的分析是对程序的循环迭代次数的近似(approximate)。程序的循环边界用一个二元组(l,u)表示(l表示下界 lower bounds,u 表示上界upper bounds)。为了获取程序的循环的迭代次数目前主流的方法有两种。一种是程序编译阶段动态记录程序循环的迭代次数[3]。虽然使用这种动态方法得到的是程序的实际循环次数,但是显然这种方法不能考虑程序在所有情况下的循环迭代次数,并且无法实现跨平台的分析。另一种方法是对程序进行静态分析,估算程序在运行过程中循环的迭代次数[4]。本文提出的基于抽象解释的程序循环边界分析方法属于静态分析的方法。相比之前的循环边界分析方法,结合程序中的控制依赖关系和数据依赖关系对程序进行切片,通过这种方法可以获取循环变量取值的约束关系因此能够对依据变量取值范围进行循环边界计算的过程进行了改进。

1 相关工作

1.1 程序切片

程序切片技术[5]是一种通过对程序进行分解,只保留与待分析特性相关的程序片段来对程序进行分析的技术。由Mark Weiser在80年代提出,最初程序切片技术主要被用于程序的调试工作[6]。Susan Horwitz等人在文章[7]对程序切片技术的定义为:“对程序的切片得到的程序,一般是由程序中的部分语句和部分判定表达式组成的”。其中的部分语句和表达式是指那些对程序上的某个点p所使用的变量v产生影响的语句和表达式。其中将(p,v)定义为程序的切片准则。

选取具有代表性的16家商业银行自2008—2017年的统计数据.其中包括5家大型国有商业银行,8家股份制商业银行和3家城市商业银行.城市商业银行分别是宁波银行、南京银行和北京银行.

1.2 抽象解释

在对程序进行静态分析时为了构造和逼近程序的不动点理论,Patrick Cousot和Radhia Cousot在1977年提出了基于格的抽象解释理论[8]用于对程序的语义进行可靠近似。程序具体的对象域上的计算称为程序的操作语义或者指称语义,描述了对象域上的计算过程[9]。对程序的抽象解释过程可以描述为通过对待分析程序在抽象域上的计算,使得抽象域上的计算结果尽可能地逼近程序在具体域上的计算结果过程。通过程序在抽象域上的计算结果来获取真实程序计算结果的某些信息。抽象解释实际上是通过损失一部分的计算结果的精确程度来取得较高的计算速度。是在计算结果的精度损失和计算时间效率之间的一种平衡。

1.2.1 抽象域

抽象域[10]是指通过一组由计算机可以表示的元素命名为域元素以及基于该元素定义的一系列的操作,称为域操作,来对具体的程序所进行的抽象刻画。在抽象解释的理论基础上的分析验证过程都是在程序的抽象域中展开的。作为抽象解释的理论中的一个核心概念,抽象域的描述要从抽象域的表示(即域元素的描述)和抽象域中的操作,两方面来考虑。

(1)抽象域的表示:程序的抽象域是一种指对程序的具体域的抽象刻画。常见的抽象域的表示形式的不同进行分类。例如有使用多项式约束的八边形抽象域以及使用区间表示的区间抽象域等。

根据本文的定义程序的控制依赖关系和数据依赖关系均使用G(V,E)表示。那么可以将程序的控制依赖关系和数据依赖关系在同一个有向图中表示出来。其中,为了对控制依赖和数据依赖关系进行区分,仍然使用实线表示控制依赖关系,虚线表示数据依赖关系。得到程序的依赖关系图如图4所示:

1.2.2 抽象执行

数据依赖是对程序的数据由于程序结构的关系引用已经被程序处理过的数据而产生的数据之间的关联关系的抽象。程序变量之间的数据依赖[12]关系可以用程序的数据依赖图(Data Dependence Graph,DDG)来体现。数据依赖图也是由节点和有向边描述的有向图。数据依赖关系有三种:

(6)与家长产生陌生感。由于寄宿原因,学生和家长交流更少,导致许多学生和自己父母之间的共同语言日渐减少,产生代沟。

抽象执行的本质是在抽象域将程序变量的抽象表示形式作为程序变量本身带入程序进行计算。首先要对程序的变量和程序中的函数操作进行抽象表示,然后抽象域中执行程序的运行过程。

人口规模对财政教育支出有明显的影响.人口数量的增减直接影响到教育资源的数量,进而影响到财政对教育支出的数量.优化教育结构,加大财政教育支出,提高适龄受教育群体的受教育水平,不仅能加快教育事业的发展,而且有利于全面提高全国人力资源的整体素质.

2 边界分析框架

2.1 程序依赖指导切片

2.1.2 数据依赖

园林景观建筑设计更加强调整体性,所以一些主题园林便应运而生,将传统文化穿插到园林的角角落落,随处可见。比如有一处太极主题园林景观,整座园林景观的俯瞰图形似八卦太极,分阴阳两面,十分用心。在园林当中还设有天地玄黄等主题凉亭,将太极文化应用地出神入化。

2.1.1 控制依赖

程序的控制依赖关系在程序的控制流程图(Control Flow Graph,CFG)中体现。程序的控制流程图是对程序或者一个过程的抽象描述。CFG被描述为一个有向图G(V,E)。在程序中的每条语句都可以与控制流程图中的一个节点对应。CFG通过使用节点和边之间的关系来描述程序执行过程中所有后可能的执行路径以及每条执行路径所对应的语句和判定表达式。因而,绘制程序的控制流程图的依据是程序的逻辑行之间的控制关系。

高等学校的实验室是师生进行试验教学、从事科学研究、提高实践能力的重要基地.最近几年,随着高校招生数量和办学规模的不断扩大,实验室的规模也在随之扩大,来往实验室的人员增多,不确定性因素增大,各高校对实验室的安全管理工作提出了新的要求[1].做好实验室的安全管理工作,与高校的发展息息相关,同时也是每个高校的重要工作.

如表1中依次给出了顺序结构、分支结构和循环结构的控制流程图和控制依赖图的结构。为了方便表示,可以对程序的节点用0到n的自然数表示。其中程序的入口节点记作0节点,依次标号。

 

表1 控制依赖关系

  

程序举例 控制流程图 控制依赖图{1.int i=0;2.int j=1;3.int k=0;}10顺序结构23123{1.if(i

由此可以对如下所示示例程序进行控制依赖关系分析,得到程序的控制流程图和控制依赖图如图1和图2所示:

通过表1可以得出模型阶数越高,残差越小,相应的AIC准则越小,但阶数越高计算越繁琐,综合考虑该文取AR(2)模型作为陀螺随机误差模型。具体模型如下:

 
  

图1 控制流程图

  

图2 控制依赖图

构建程序切片所依据的是程序的切片准则,基于程序中的依赖关系来对程序进行切片的。出于对程序执行时间的目的考虑,切片准则的设定要保留程序中影响程序执行路径的依赖关系。程序的依赖关系的获取要对程序的控制流和数据流分析来获得。构建程序的依赖关系首先要构建程序的数据依赖关系以及程序的控制依赖关系。其中程序的数据依赖关系以及控制依赖关系分别使用程序的控制流程图和数据依赖图来描述。

土壤综合肥力指数(IFI)一般划分为5个等级,即高(IFI≥0.8)、较高(0.6≤IFI<0.8)、中(0.4≤IFI<0.6)、较低(0.2≤IFI<0.4)和低(IFI<0.2)[21]。昌宁植烟区域土壤肥力综合指数在0.12~0.99,平均值0.60,绝大部分植烟区土壤处于中等水平(37.02%)和较高水平(24.26%),土壤肥力状况良好。

(1)流依赖或真依赖:是指在某程序点中被赋值的变量在后面的程序点中被重新引用的情况。例如某一程序变量v1,在某一程序点p1被赋值,然后在p1后面的某一程序点p2被另一个变量v2引用。

(2)反依赖:是指某程序点出现过的变量,在该程序点之后的某点被取值发生变化的情况。例如某一程序变量v1,在某一程序点p1被使用,然后在p1后面的某一程序点p2被重新赋值。

(3)输出依赖:是指某一程序变量在不同的程序点分别被赋值的情况。例如某一程序变量v1,在某一程序点p1被赋值或重新赋值,然后在p1后面的某一程序点p2被重新赋值。

如表2依次给出了三种数据依赖关系的依赖图的结构:

抽象执行(Abstract Executiom,AE)是扩展的抽象解释的程序分析方法,它基于抽象解释理论的符号执行方法。在文章[11]中James R.Larus将抽象执行描述为一种在程序执行过程中通用的事件追踪技术。抽象执行的对象是程序变量的在抽象域中的表达形式。并且与一般的抽象解释过程不同的是,抽象执行作为一种扩展的抽象执行理论,抽象执行的对象可以是一个单独的程序片段,而并不强调对整个程序进行。

 

表2 数据依赖关系

  

程序举例 数据依赖图{1.int i=1;2.int sum=0;3.sum=sum+i;}流依赖{反依赖1.sum=sum+i;2.i=0;}{输出依赖1.int i=0;2.i=1;}

由此,对示例程序的数据依赖关系构造数据依赖图如图3所示:

系统集中存储检查中的问题并进行分级分类,安全管理人员可进行多纬度的统计分析,发现集中及突出的问题并辅助确定下一阶段的改进计划。

  

图3 数据依赖图

由于对程序的循环边界问题的分析过程中,只考虑会对循环迭代次数产生影响的程序语句。此类语句在程序依赖图上体现为包含出度的节点。由此,我们提出删除有向图中不包含出度的节点无关节点,以达到程序依赖图的约简目的。逐步删除无关节点后得到约简后的程序依赖图如图5所示:

(2)抽象域上的操作:抽象域上的操作是对程序中的具体操作的抽象刻画。用来描述程序在具体域中的例如赋值操作、条件判断操作和程序循环执行等操作。

  

图4 程序依赖图

2.1.3 构建程序依赖图指导切片

  

图5 约简程序依赖图

根据图5得到约简后的程序依赖图中的节点就是与循环迭代次数相关的程序语句。因此得到切片后的程序中保留了原示例程序的2、4、6、7、9、10行代码。

2.2 抽象表示

在计算程序的循环边界过程中,变量在抽象域中的描述用区间抽象域表示。其中本文的程序循环边界分析过程中,只考虑变量取值为整数情况下的程序的边界值的计算。其中,为了分析方便的考虑,我们定义了一种只包含整数的区间,整数区间的描述形式使用诸如[C1..C2](其中C1和C2均为整数,且满足C1..C2)的形式表示从C1到C2的所有整数构成的区间。在 C1、C2为整数,N1、N2为正整数,且满足 C1..C2,N1..N2的情况下,使用[C1..C2],N1%N2的形式表示在整数区间[C1..C2]中模N2余N1的整数区间。对于该整数区间抽象域上的操作过程与一般的区间抽象域的四则运算过程类似,描述如下:整数区间的算术算术运算符号是指对取值范围为整数的区间的表示的变量进行的加(+*)、减(-*)、乘(×*)、除(/*)的基本操作。其中当空区间⊥参与运算时,运算结果一律为空区间。具体的算术运算定义如下:

 

例如对于程序中的变量值i,假定变量i的取值范围为1到100的整数,那么i的取值范围的抽象表示为[1..100]。当i在程序中进行四则运算时,映射在抽象域上计算过程即为对区间[1..100]上的四则运算。

2.3 边界值计算

程序的循环边界由程序的变量的取值范围所确定。因而确定的程序的边界值需要对与循环相关的程序变量的取值范围进行分析。将程序的控制流程图和循环变量的取值范围作为输入,抽象执行过程通过抽象的执行程序的操作,变量的抽象取值区间进行运算。抽象执行的过程中的运算法则与整数区间的四则运算法则一致。最后输出程序的循环迭代次数。

在对程序的抽象执行过程中,不难得出程序中循环变量 i和 j的取值为:i=[1..10],j=[1..10]。传统的循环边界计算方法是以及循环变量的取值范围计算循环边界[13]。按照这种方法计算得到较为粗糙的循环边界结果为:10×10=100次。由此推测出该循环结构的循环边界为(0,100)。显然这种方法计算结果存在较大的误差。又由于在本文的分析过程中,可以清晰地获取程序中的依赖关系,对如下形式的循环代码,根据程序切片模块中得到的程序数据依赖信息对程序循环变量的取值进行约束,对循环结构中的外层循环变量i和内层循环变量j建立形如公式(1)所示的约束条件。根据约束条件,使用更加精确的变量取值,得到更加接近实际迭代次数的程序循环边界。

 

例如,对示例程序点9所确定的对变量j重新赋值的多项式j=j+2。显然内层的循环的迭代次数不大于(10-2)/2=5次,且不小于(10-4)/2=3次。对外层结构的循环中循环变量i的多项式为i=i+1,外层循环的迭代次数不大于(10-1)/1=9次,且不小于(10-4)/1=6次。所以该循环结构迭代次数为:[3..5]×*[6..9]=[min(3×6,3×9,5×6,5×9)..max(3×6,3×9,5×6,5×9)]=[18..45]次。相比与之前粗糙的边界值(0,100),显然依据本文中提出的方法可以得到的较为精确的程序循环边界为(l,u)=(18,45)。

3 分析验证

为了证明本文提出的分析方法的有效性,使用形式化的程序分析工具Frama-C的值分析插件[14]对上述的分析结果进行验证。使用命令“frama-cvalue slevel 100 example.c”设置循环展开100次后计算得到循环结构中变量i,j的取值,当i和j的取值为“i∈{10},j∈{11}”时,循环结束。分析可知该循环结构的循环上界必然是不大于100的。进一步,使用命令“frama-c-value slevel 45”,将循环展开的次数设置为45,得到的i和j的取值仍为“i∈{10},j∈{11}”。由此可见示例函数的循环上界必然不大于45次,将45作为函数的循环上界,比100更加精确。并且在人为将循环变量i和j的值设定为“i=4”,“j=4”之后,使用命令“frama-c-value slevel 18 example.c”,将循环展开的次数设置为18之后,变量 i和 j的计算结果“i∈{10},i∈{10}”并没有达到循环结束时的取值。由此可见示例函数的循环下界必然不小于18。所以18可以作为该段循环片段的循环下界比0要更接近实际值。

结果表明使用本文的循环边界分析方法得到的程序循环下界“l”不大于程序实际迭代的次数,计算得到的循环上界“u”不小于程序的实际迭代次数。证明使用本文所述的循环边界分析方法得到的(l,u)可以作为有效的边界。从而验证了本文提出的方法的有效性。

3 结语

针对程序的循环边界计算问题,通过对程序中的控制流和数据流分析的来获取程序中与循环相关的程序语句,来指导程序的切片。并且根据约简后的依赖关系,可以将缩小循环变量的取值范围,通过更加精确到取值范围计算得到更加接近实际循环次数的边界值。

参考文献

[1]R OUXEL B,PUAUT I.STR2RTS:refactored stream IT benchmarks into statically analyzable parallel benchmarks for WCET estimation&real-time scheduling[C].17th International Workshop on Worst-Case Execution Time Estimation,Paris,2017:1—13.

[2]CASSE H,SAINRAT P,OTAWA.A framework for experimenting WCET computations[C].3rd European Congress on Embedded Real-Time Software(ERTS),Toulouse,2006:1—8.

[3]ZHAO J,COHEN A.A general compilation algorithm to parallelize and optimize counted loops with dynamic data-dependent bounds[C].Seventh International Workshop on Polyhedral Compilation Techniques,Paris,2017:1—10.

[4]SINN M,ZULEGER F,VEITH H.Complexity and resourse bound analysis of imperative programs using difference constraints[J].Journal of Automated Reasoning,2017,59(1):3—45.

[5]MASTROENI I,ZANARDINI D.Abstract program slicing:an abstract interpretation-based approach to program slicing[J].ACM TransactionsonComputationalLogic(TOCL),2017,18(1):1—58.

[6]WEISER M.Programmers user slices when debugging [J].Communications of the ACM,1982,25(7):446—452.

[7]HORWITZ S,REPS T,BINKLEY D.Interprocedural slicing using dependence graphs[M].ACM Trans.Program Lang Syst.12(1):2660,1990.

[8]COUSOT P,COUSOT R.Abstract interpretation:a unified lattice model for static analysis of programs by construction or approximation of fixpoints[C].Proceed of the 4th POPL.Los Angeles:ACM Press,1977:238—252.

[9]李梦君,李舟军,陈火旺.基于抽象解释理论的程序验证技术[J].软件学报,2008,9(1):17—26.

[10]SINGH G,PUSCHEL M,VECHEV M.Fast polyhedral abstract domain[C].Proceedings of the 44th ACM SIGPLAN Symposium on Principles of Programming Language,New York:ACM,2017:46—59.

[11]LARUS J R.Abstract Execution:A technique for efficiently tracing programs[R].Computer Science Technical Report#912,1990.

[12]SAMPAIO D N,POUCHET L N,RASTELLO F.Simplification and runtime resolution of data dependence constraints for loop transformations[C].Proceedings of the International Conference on Supercomputing,Chicago:ACM,2017:1—11.

[13]MICHIEL M De,BONENFANT A,CASSE H.Static loop bound analysis of c programs based on flow analysis and abstract interpretation[C].Embedded and Real-time Computing Systems and Applications,Toulouse,2008:1—6.

[14]CUOQ P,YAKOBOWSKI B,PREVOSTO V.Frama-C’s value analysis plug-in[R].F-91191.Saclay:CEA LIST,Software Reliability Laboratory,Saclay.2015,27(3):573—609.

 
崔少轩,喻慎
《计算技术与自动化》2018年第04期文献

服务严谨可靠 7×14小时在线支持 支持宝特邀商家 不满意退款

本站非杂志社官网,上千家国家级期刊、省级期刊、北大核心、南大核心、专业的职称论文发表网站。
职称论文发表、杂志论文发表、期刊征稿、期刊投稿,论文发表指导正规机构。是您首选最可靠,最快速的期刊论文发表网站。
免责声明:本网站部分资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有
如有不愿意被转载的情况,请通知我们删除已转载的信息 粤ICP备2023046998号