基于C++程序动态切片系统的设计与实现.docx

上传人:b****8 文档编号:29993557 上传时间:2023-08-04 格式:DOCX 页数:76 大小:1.47MB
下载 相关 举报
基于C++程序动态切片系统的设计与实现.docx_第1页
第1页 / 共76页
基于C++程序动态切片系统的设计与实现.docx_第2页
第2页 / 共76页
基于C++程序动态切片系统的设计与实现.docx_第3页
第3页 / 共76页
基于C++程序动态切片系统的设计与实现.docx_第4页
第4页 / 共76页
基于C++程序动态切片系统的设计与实现.docx_第5页
第5页 / 共76页
点击查看更多>>
下载资源
资源描述

基于C++程序动态切片系统的设计与实现.docx

《基于C++程序动态切片系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于C++程序动态切片系统的设计与实现.docx(76页珍藏版)》请在冰豆网上搜索。

基于C++程序动态切片系统的设计与实现.docx

基于C++程序动态切片系统的设计与实现

 

基于C++程序动态切片系统的设计与实现

 

摘要

为了方便开发、调试和测试等人员,提出了一种能便于程序理解、调试、维护、逆向工程的技术—程序切片技术。

这种技术主要是通过将一个复杂程度高、规模大的程序通过一定的分解机制将程序分解成若干的复杂程度低、结构相对较低的程序片段,通过必要的程序切片技术可以有效的被程序开发人员理解、调试、维护。

切片技术本身存在众多的趋于解决的问题,本文主要针对所发现的问题或者对问题进行了一定的改进。

实现基于C++程序动态切片系统。

通过对切片技术的优缺点分析,提出一种更加的高效的切片技术,对面向对象程序切片方法进行改进,利用简化的系统依赖图实现面向对象程序切片方法,这个可以减少复杂的系统依赖图产生不必要的麻烦。

对切片技术的发展具有指导意义。

首先系统依赖图的面向对象程序切片方法。

对于系统依赖图而言,其最关键的缺点系统依赖图过于复杂,此外切片技术的关键就是需要正确的系统依赖图。

换句话说对于在系统依赖图绘制过程中,若出现错误就不能进行正确的切片。

为了这种切片技术的简单实现,采用对系统依赖图进行必要的简化,拟引用简单的系统依赖图实现面向对象程序切片方法。

这种改进的依赖图切片方法主要对传统的切片方法进行改造。

最后实现了基于C++程序动态切片系统的原型,并且提高了查找和追踪效率。

切片技术本身存在众多的趋于解决的问题,本文主要针对所发现的问题或者对问题进行了一定的改进。

通过对切片技术的优缺点分析,提出一种更加的高效的切片技术,对面向对象程序切片方法进行改进,利用简化的系统依赖图实现面向对象程序切片方法,这个可以减少复杂的系统依赖图产生不必要的麻烦。

对切片技术的发展具有指导意义。

关键字:

C++,面向对象程序切片方法,程序动态切片系统

Abstract

Inordertofacilitatethedevelopment,debuggingandtestingpersonnel,whichcanfacilitateprogramunderstanding,debugging,maintenance,reverseengineeringtechnologyprogramslicingtechnology.Thistechnologyismainlythroughahighlevelofcomplexity,largescaleprogramthroughthedecompositionmechanismofcertainprocedureswillbedecomposedintoseverallowcomplexity,structurerelativelylowprogramfragments,throughprogramslicingnecessarycaneffectivelybeprogramdeveloperstounderstand,debug,maintenance.Slicingitselfexistsmanytendtosolvetheproblem,thispapermainlyfoundfortheproblemorproblemsandmakessomeimprovement.ImplementationofDynamicSlicingSystemBasedontheC++program.Theadvantagesanddisadvantagesofslicingtechnologyanalysis,proposedamoreefficientslicingtechniques,theobject-orientedprogramslicingmethod,objectorientedprogramslicingmethodusingthesimplifiedsystemdependencegraph,thiscanreducethedependencegraphgeneratingunnecessarytroublecomplexsystem.Hastheguidingsignificancetothedevelopmentoftheslicingtechnique.

Objectorientedprogramslicingmethoddependencegraphofthefirstsystem.Thesystemdependencegraph,themostcriticaldrawbacksystemdependencegraphistoocomplex,inadditionthekeysectiontechnologyisneededtocorrectthesystemdependencegraph.Inotherwordsthesystemdependencegraphdrawingprocess,iftheerrorcannotbethecorrectsection.Inthissectionthesimplerealization,necessarytosimplifythesystemdependencegraph,quasibyusingasimplesystemtorealizetheobject-orientedprogramslicingmethoddependencegraph.Thedependencygraphslicingtheimprovedmethodsoftraditionalslicemethodweremodified.FinallyrealizesthedynamicslicingsystemprototypebasedonC++program,andimprovetheefficiencyofsearchingandtracking.Slicingitselfexistsmanytendtosolvetheproblem,thispapermainlyfoundfortheproblemorproblemsandmakessomeimprovement.

Theadvantagesanddisadvantagesofslicingtechnologyanalysis,proposedamoreefficientslicingtechniques,theobject-orientedprogramslicingmethod,objectorientedprogramslicingmethodusingthesimplifiedsystemdependencegraph,thiscanreducethedependencegraphgeneratingunnecessarytroublecomplexsystem.Hastheguidingsignificancetothedevelopmentoftheslicingtechnique.

Keywords:

C++,object-orientedprogramslicingmethod,thesystemdynamicallyslice

缩略语表

 

第一章绪论

1.1研究背景和意义

1.1.1课题来源

随着程序的规模的增长,对于程序的分析、逆向工程、调试和维护的难度越来越多。

在程序调试过程中,我们重复率最高的工作在于,通过调试并找出错误有关的语句,但是对于程序规模较大的项目来说通过单步调试不仅影响工作效率而且极大的影响了工程的进程;在程序测试过程中,通过对一个软件进行必要的整体测试之后,会对某个位置进行微小的修改,修改之后面临的问题是仍然要对程序进行必要的整体测试,这样一来消耗了人力和物力;软件维护过程中,对于软件人员来说需要做的不仅是对程序进行整体的阅读,并在不影响程序整体设计理念的前提下进行适当的修改,保证程序的稳定性,但是在维护过程中难免会对程序的变量进行赋值,在其过程中,一旦进行赋值,难免对程序的稳定性造成影响;逆向工程最关心的问题是对软件整体进行理解,但是在逆向工程中出现大量的重复、无关的内容。

因此来说随着程序的规模增长,程序遇到的问题将会越来越多[]。

因此为了方便开发、调试和测试等人员,提出了一种能便于程序理解、调试、维护、逆向工程的技术—程序切片技术。

这种技术主要是通过将一个复杂程度高、规模大的程序通过一定的分解机制将程序分解成若干的复杂程度低、结构相对较低的程序片段,通过必要的程序切片技术可以有效的被程序开发人员理解、调试、维护。

到目前为止,基于程序切片技术的基本目的,程序切片的研究人员提出了许多程序分解的算法和相关技术,例如静态切片和动态切片、前向切片和后项切片、对象切片、同步切片、分解切片技术、条件切片等,切片技术的基本发展过程从静态切片到动态切片、从前向切片到后项切片、从过去的切片过程到面向对象的切片技术、从非分布式切片技术到分布式切片技术的发展过程。

尽管对于切片技术来说拥有众多的研究成果,但是对于这些切片技术本身同样存在众多的趋于解决的问题。

1.1.2课题意义

本文的题目是:

基于C++程序动态切片系统的设计与实现

主要探讨的问题:

主要针对面向对象程序动态切片过程中存在的问题,具体问题有系统的依赖图过于复杂、可用的切片工具较少,以下为主要的创新点。

主要基于以下几个方面对程序切片技术理论与应用进行研究:

首先给出了C++程序切片技术的相关文法,并在此基础上实现C++自动化语法分析。

其次对面向对象动态的系统依赖图进行简化,实现了系统依赖图复杂度的简化。

通过对静态插桩方法进行适当的改进,进一步提高效率。

通过对一种基于Java的自上而下的切片方法进行改进,改成C++版本。

从而提高了效率。

实现了基于C++程序动态切片系统的原型。

通过利用简化的系统依赖图实现面向对象程序切片方法,这个可以减少复杂的系统依赖图产生不必要的麻烦。

实现了系统依赖图复杂度的简化。

1.2国内外研究现状

1.2.1国外研究现状

国外在过去主要针对程序的切片技术进行各方面的研究,但是对于程序快的切片技术而言,都没有特别突出的成绩,马克等人从不同的角度分析研究了切片技术,这极大地扩展了切片技术的方法,但是对于马克等人的技术而言,一定程度上存在相应的缺陷,并没有通过基于可控制语句间的依赖关系和数据间的依赖关系进行详细的研究。

国外主要针对基于系统依赖图来进行解决程序是计算面向对象程序切片的一个有效方法。

但是系统依赖图的缺点是太复杂,而且在建立系统依赖图的过程中容易出错,一旦出现错误就可能导致切片结果的不准确。

1.2.2国内研究现状

国内利用一种动态面向对象的依赖图((DODG,DynamicObject-orientedDependenceGraph)和系统依赖图网(SDN,SystemDependenceNet)用于解决面向对象程序的动态切片问题和并发面向对象的程序切片问题。

东南大学的教授在面向对象的程序切片领域都做出了不可忽视的贡献。

但这些切片方法都是基于依赖图的,而构造程序的依赖图是一件非常复杂的工作,而且构造过程中容易出错,这会导致切片的结果不正确,造成前工尽弃。

1.2.3对比分析

首先本对系统依赖图了进行简化,得到简化的系统依赖图。

简化的系统依赖图省略掉了那些表示输入参数和输出参数的结点和概括边,使图形更加简洁、清晰;同时,文中还定义了一种面向对象程序的粗粒度切片概念,讨论了它的性质,分析了它与细粒度切片的关系,并基于简化的系统依赖图计算面向对象程序的粗粒度切片,最后还讨论了切片技术的简单实现。

系统依赖图的面向对象程序切片方法优点避免了建立系统依赖图的过程中答易出错,一旦出现错误就就能导致切片结果的失败的不良局面。

最后实现了基于C++程序动态切片系统的原型,并且提高了查找和追踪效率。

1.3主要研究内容

为了方便开发、调试和测试等人员,提出了一种能便于程序理解、调试、维护、逆向工程的技术—程序切片技术。

这种技术主要是通过将一个复杂程度高、规模大的程序通过一定的分解机制将程序分解成若干的复杂程度低、结构相对较低的程序片段,通过必要的程序切片技术可以有效的被程序开发人员理解、调试、维护。

切片技术本身存在众多的趋于解决的问题,本文主要针对所发现的问题或者对问题进行了一定的改进。

实现基于C++程序动态切片系统。

通过对切片技术的优缺点分析,提出一种更加的高效的切片技术,对面向对象程序切片方法进行改进,利用简化的系统依赖图实现面向对象程序切片方法,这个可以减少复杂的系统依赖图产生不必要的麻烦。

对切片技术的发展具有指导意义。

首先系统依赖图的面向对象程序切片方法。

对于系统依赖图而言,其最关键的缺点系统依赖图过于复杂,此外切片技术的关键就是需要正确的系统依赖图。

换句话说对于在系统依赖图绘制过程中,若出现错误就不能进行正确的切片。

为了这种切片技术的简单实现,采用对系统依赖图进行必要的简化,拟引用简单的系统依赖图实现面向对象程序切片方法。

这种改进的依赖图切片方法主要对传统的切片方法进行改造。

最后实现了基于C++程序动态切片系统的原型,并且提高了查找和追踪效率。

切片技术本身存在众多的趋于解决的问题,本文主要针对所发现的问题或者对问题进行了一定的改进。

通过对切片技术的优缺点分析,提出一种更加的高效的切片技术,对面向对象程序切片方法进行改进,利用简化的系统依赖图实现面向对象程序切片方法,这个可以减少复杂的系统依赖图产生不必要的麻烦。

对切片技术的发展具有指导意义。

第二章程序切片技术的相关概述

本章主要针对程序切片技术的基本概念、技术的分类以及程序切片技术的基本准则和相关算法,然后并对程序切片技术的具体应用进行详尽的分析,并在最后对程序切片的基本工具进行简单的说明。

2.1引言

随着全球软件技术的日益发展,其软件系统的代码量和数据量程日益增加趋势,这种趋势造成软件的规模呈线性增长。

随着程序规模的线性增长,在软件测试、程序的分析、逆向工程、调试和维护过程中,人们往往会发现,若程序的规模增大若干倍,程序的复杂程度则呈级数倍增加,这就使得人们不得不考虑如何解决这种问题。

在程序或者软件进行调试的过程中,人们发现对于一个规模较为庞大的程序而言,当对于这个程序进行适当的拆分,将其分割成为软干个相对较小的程序是,这种程序变非常利于程序的分析、逆向工程、调试和维护等过程。

这种技术被称之为程序切片技术,随着程序切片的概念在20世纪七十年代末期被正式提出的,在接下来的几年里,程序切片技术逐步在理论方面得到了完善,先后有基本思想得到了阐释、随后程序切片的相关算法得到了实现,这在八十年达初的学术界引起了相当大的反响,成为计算机界的一个重大事件。

基于面向对象的程序切片技术是在20世纪末期才开始进入研究阶段,现在美国的IBM研究中心、克莱姆森大学的好多教授仍然在进行这方面的研究。

2.2程序切片的基本概念

对于分析程序切片而言最重要的部分是分析其中的程序依赖性,对于这方面的分析也是程序切片的进行下去的敲门砖。

对于程序切片的基本方法最开始是由MarkWeiser博士提出的。

而最早的程序切片技术是关于数据流方程的程序切片技术,其是基于程序切片控制流图的基础上建立的;接着程序技术继续发展,向图可达性算法迈进,图可达性算法根据其发展可以分为程序依赖图的图可达性算法和基于系统依赖图的遍历图图可达性算法。

这一小节主要根据相关的一些基本的程序切片概念。

2.2.1控制流图

对于控制流图而言其在一定程度上也被称之为MarkWeiser图方式或者称之为MarkWeiser切片。

对于程序切片中满足MarkWeiser条件的程序切片称之为MarkWeiser切片,其在一定程度上满足一下几种切片方式:

首先对于一个不确定的程序切片而言,对应的其所特有的切片准则(V,i),在这个切片准则中,V的含义表示在i中的定义或者对于程序所使用的变量的所有组成。

对于其中的i表示程序中的某个具体的语句,这个语句可以看成是一个相应的点;其次,对于程序P来说,其对应的切片S可以根据相应的规则从程序P中减除若干条语句,这里的若干根据实际情况而定,可以是多条也可以没有。

但是前提是保证程序P与其对应的切片S之间的关系是关于(V,i)的,他们之间的基本行为是相同的。

对于控制流图而言,其主要是程序分析,这一概念是程序分析界的一个重大突破,其实现了对程序的图形化,从图中我们可以清晰地发现程序与其对应的模块之间的调用关系。

如图2-1所示,这是我们选取作为实例的一个程序片段,对于其相应的程序流程图如下图2-2所示。

图2-1程序片段的源码

图2-2程序片段的控制流图

我们从图中可以明显的看出来,对于程序代码if(a>b)而言,它是程序片段a=x的直接前驱,对于程序而言,可以清晰地发现这是一个可以执行的路径,在这条路径中程序2是程序3的直接前驱,程序5是程序7的直接前驱,对于整个程序来说,程序2和程序5是整个程序的必经路径,对于这两个前驱来说,3和7不是程序的毕竟路径。

2.2.2控制图和系统依赖图

对于本问而言,我们拟采用系统图和系统依赖图对整个文章进行描述,这样做的目的在于在分析程序的过程中能够更加清晰分析和判别数据之间的相互关系,能够更加直观的看出他们之间的依赖,例如直接前驱等。

对于本文的程序依赖图而言,其的主要成分是由整个程序的控制流图、程序生成的控制依赖图以及程序中的数据所形成的依赖图等相关部分组成。

对于所有程序控制流图表示如下首先对于一个不确定的程序切片而言,对应的其所特有的切片准则(V,i),在这个切片准则中,V的含义表示在i中的定义或者对于程序所使用的变量的所有组成。

对于其中的i表示程序中的某个具体的语句,这个语句可以看成是一个相应的点;其次,对于程序P来说,其对应的切片S可以根据相应的规则从程序P中减除若干条语句,这里的若干根据实际情况而定,可以是多条也可以没有。

但是前提是保证程序P与其对应的切片S之间的关系是关于(V,i)的,他们之间的基本行为是相同的。

控制依赖图主要包含了程序的控制依赖关系,对于这样一个图形而言,其在一定程度上可以认为是一个有向图,我们可以人为的当成(S,C),对于程序中的S,如上所述表示程序中的对应的所有结点的集合,对于程序而言如果其中间的语句S1被语句S2控制,而且S2依赖于S1有句,这是后将其之间的对应关系加入到集合C中去。

这就是我们所说的控制依赖关系。

数据依赖图同样是一个有向图,我们可以人为的记做(S,D),对于程序中的S,如上所述表示程序中的对应的所有结点的集合,对于程序而言如果其中间的语句S1被语句S2控制,而且S2依赖于S1有句,这是后将其之间的对应关系加入到集合D中去。

这就是我们所说的数据依赖图关系。

2.2.3控制依赖和数据依赖

对于程序切片来说,对于程序切片的依赖性分析是程序切片的根本,对于一个常见的程序而言,一般情况下存在两种依赖关系,分别为数据依赖性和控制依赖性。

对于前者来说主要用于程序的定义和其具体实体之间的关系,后者表示由于控制流引起的与实体之间的关系。

首先数据依赖,对于在实现过程中,变量的定义和使用时数据分析的基础。

我们可以给定一个假设,假设程序a、b在一个特定的程序中是两个不同的片段,若对于这个程序而言,存在一个可以在a、b之间行的通的语句这个语句。

对于a、b而言存在一个对应的a处的变量和b出的定义,或者在a处的定义和b处的变量,且在a、b之间其他的位置没有被程序所定义,对于前者称为a依赖于b,对于后者可以称为b依赖于a。

数据依赖,语句a依赖语句b。

我们可以认为

,而有且只有:

存在a到b之间路径L,同时有且仅有一个变量m满足,如下公式一所示。

对于L而言,若其执行顺序上存在其他的类型的语句,如下公式二所示。

2.3程序切片技术的分类

为了方便开发、调试和测试等人员,提出了一种能便于程序理解、调试、维护、逆向工程的技术—程序切片技术。

这种技术主要是通过将一个复杂程度高、规模大的程序通过一定的分解机制将程序分解成若干的复杂程度低、结构相对较低的程序片段,通过必要的程序切片技术可以有效的被程序开发人员理解、调试、维护。

我们将程序切片从几个方面进行分类,分别是程序切片的方向、程序切片的范围、以及程序切片的依赖程度,进行分析。

2.3.1前向切片和后向切片

根据计算切片方向的不同,可把程序切片分为前向程序切片和后向程序切片。

前向程序切片是指所有受兴趣点变量的值影响的语句的集合;后向切片是指程序中所有能够影响兴趣点变量的值的语句的集合。

这两类切片最后是不构成一个可执行程序的。

2.3.2过程内切片和过程间切片

根据切片的范围,可以分为过程内切片和过程间切片。

过程内切片是指单个过程内影响兴趣点变量的值(或受兴趣点变量的值影响)的语句的集合,不考虑过程调用的情况;过程间切片指在过程内切片的基础上,考虑过程调用的情况。

执行过程间切片时,要分析实参和形参相对应的依赖关系,要完成实参和形参之间依赖性的转换。

2.3.3静态切片,动态切片和条件切片

根据切片过程对程序某一次具体的输入的依赖程度,可将程序切片分为静态切片和动态切片。

静态切片是指不考虑程序运行时的输入,完全利用静态分析方法得到切片,也就是分析程序的源代码,计算所有可能输入情况下的切片。

静切片考虑了程序中所有的执行路径,包含了所有与兴趣点处变量相关的句,不管某些语句在程序实际的执行中是否被执行,因而,静态切片具有很大的冗余性,工作量较大。

动态切片是指在特定输入下实际影响兴趣点变量值(或受兴趣点变量值影响)的所有语句的集合。

动态切片只考虑程序在某个具体输入下,实际执行的路径中,和兴趣点变量相关的语句。

因此,动态切片的计算过程依赖于程序的具体输入,因而,每一次的计算工作量较小,但得到的切片相对比较精确。

对于程序切片中的条件切片而言,其在一定程度上属于一种在静态切片与动态切片之间的一种技术,这种技术对于静态切片技术而言,如上所述其主要针对的是以静态信息为主的切片技术,这种切片技术在形式上较为复杂,主要原因是因为这种静态切片为主的程序在实现过程中包含了许多无用的信息,对于动态切片而言其在一定程度上实现了程序的某次的操作对于这种操作,导致程序切片的结果也千差万别。

为了结合动态程序切片和静态程序切片的基本特点,弥补动态程序切片和静态程序切片的不足,提出了一种具有改善两者确定的切片系统这种系统通过对输入值的操作,人为的增加了一些条件这些条件在一定程度上有效的避免了程序包含了许多无用的信息和加入了初始状态。

例如在程序切片过程中,如果存在从满足切片条件的任一个初始状态出发都不可能被执行的语句,那么把这些语句去除掉后,就得到了在这个切片条件下的程序切片。

对于条件切片动态切片和静态切片的一个比较如下所示,如下表2-1所示。

表2-1条件切片动态切片和静态切片的一个比较

Voidfun(floatb)

{

If(b==2.0)

s=1;

elseIf(b==3.0)

s=2;

elseIf(b==4.0)

s=3

}

Voidfun(float

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1