




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 亟两方覆编程 $ 4 和$ 2 - 8 4 两条数据依赖边,此外,语句s 5 定义了i 的值并且从s 5 到s 4 的可执行路径上不存在对i 的重新定义,因此s 4 也数据依赖于s 5 。相应 地存在一条s , s 4 的数据依赖边条件语句s 3 决定了s 4 和s 5 执行与否,因此依赖圈上存在s 3 - 8 4 和8 3 - $ 5 两条控制依赖边 s e n u - j :i n ts u b ( j u t n ) i 玳毛i : s i :i = l : s 幺 s t0 : 8 3 : n a 哪= n ) s 4 :s 4 4 = s 5 : h : s 6 咖n 图3 1 程序依赖圈的示倒 3 2 横切关注点的本质 3 2 1 两种非模块化的不良代码结构 上一章节中提到过传统编程范式中横切关注点对应的两种代码特性,其中t a n g l i n g 特性为横切关注点 的本质特性,s c a n c f i n g 特性只是t a n g l i n g 特性韵外在表现形式本节更细致的讨论这两种不良代码结构 的基本特点。 在面向对象开发软件的需求分析和设计阶段,系统的关注点应该还是彼此分离的,而到了具体实现 的阶段,由于面向对象技术提供的继承和的多态机制难以模块化横切关注点,因此导致了核心关注点的 实现代码和横切关注点的实现代码混会在一起,如冒3 2 所示。这种菲模块他的实现方式导致了两砷不 9 东南大学硕士学位论文 良的代码结构;s c a t t e r i n g 代码和伽百j n g 代码。这两种不良的代码结构给软件的维护和理解带来了一定 的困难。 核心关注点横切关注点 话闵 ( a ) 需求分析和设计阶段 目 圈3 2 面向对象技术中的横切关注点 官圜 彻详细实现阶段 回一功能的实现代码分散在多个模块中。导致了s c 狮嘶n 玳码豹产生。横切关注点,顾名思义,是 “横切”在多个模块中的功能,所以其实现也横跨在多个模块的实现中,图3 ,l 体现t s c a t t e t t n g 代码的 特点。例如,在一个数据库系统中,性能关注点可能影响了所有访问数据库的模块,因此,在这些模块 中都会包含性能相关的实现代码。 当一个模块中同时实现了多个关注点时,便会形成了切r i g i i n g 代码饲如,开发人员在实现一个模块 时往往会考虑诸如业务逻辑、性能、同步控制,日志记录、安全等关注点,这就导致了每个关注点的实 现代码一起出现在同一个模块中。这种乜n 窑l i n g 代码对于后期的维护和理解都不利,因为除了要理解模块 的核心功能之井还有对其他关注点功能的实现有充分的了解图3 3 描述了魂i n g 代码的特点,在实现一 个核心关注点的屈对还混杂实理了诸如k 萌鲳,s e c 谢碜和p i 弛n 等横扔关注点。代码游滔i n 带性 揭示了横切关注点的本质特征 龋溢过心蕊蕊圈心心 麓澎懑燃 - 醛薅灌8 s l 瀑疑酥渊 磷鬻鬻餮餮黼 图土3 协g 魄代玛豹特点 3 2 2 横切关注点本质特性 从系统角度看,核心关注点与横切关注点都是为解决某一特定饲题而设计,不同的是它们在整个系 统中所扮演的角色,核心关注点需要解决的是主要问题,实现最主要的业务逻辑和功能,而横切关注点 涉及的是一些次要的问题,以辅助核心关注点在完成系统核心功能的同时能够兼顾次要需求因此,核 心关注点和横切关注点之间存在一种弱耦合关系,即横切关注点可能会依赖于核心关注点,但绝不会影 响核心关注点的具体实现,我们将这种弱耦合关系称为横切关注点对核心关注点的单向依鞭关系,。在早 期的需求分析和概要设计阶段,一个良好的设计模型应该能够保证这两种关注点是弱耦合的,他们各司 其职,共同完成整个系统的目标 从代码的结构看,零碎地分布在多个模块中的s c a t t e r i n g 代码必然是以t a n g h n g 形式出现在核心模块 单元中,不管是重复代码还是互补代码块,它们都是系统中t a n g l i n g 代码积聚到一定数量时而导致的必 然结果。因此,t g l i n g 特性才是横切代码的最本质的特征,s c a t t e r i n g 特性只是横切关注点的外在表现 形式两已。 0 第三章基于程序依赖图的方面挖掘技术 目前现有的挖掘技术均是以s c a t t e r i n g 特性作为识别横切关注点的依据。然而,在实际的软件系统中 往往存在这样一种情况,即最初的系统中一个横切关注点的实现代码在系统中s c a t t e r i n g 特性并不明显, 它只分散在非常少的几个模块中,甚至在系统中还不存在这个横切关注点的重复代码,但它确实是一个 横切关注点。随着软件的不断地演化和扩展,这类只分散在几个模块中的横切关注点可能会逐凝的蔓延 到其他的模块中,导致的结果是系统中将会出现越来越多的s c a l t e r i n g 代码 3 2 3 横切关注点和核心关注点的依赖关系 尽管详细实现阶段将横切关注点的代码分散到核心关注点的代码中,导致了在代码层次不能直观的 体现横切关注点和核心关注点的单向依赖关系,但其背后蕴含的横切关注点的本质特性并不会改变。 从依赖关系看,横切关注点和核心关注点之间的单向依赖关系,表现为:第一,横切关注点的实现 代码中不应该有数据流信息流入核心功能的代码中,也就是说核心关注点不会数据依赖于横切关注点, 另一方面,横切关注点以“横切”的入侵方式参与到核心功能的实现中,辅助核心关注点完成一些非功 能性的需求,因此可能需要获知核心关注点的一些信息,换句话说。横切关注点可能会数据依狡于核心 关注点;第二,一个模块的核心功能是否被执行不会取决于横切关注点的执行,因此核心关注点也不会 控制依赖于横切关注点,但横切关注点可能控制依赖于核心关注点。 程序依赖图作为一种反映程序中语句级依赖关系的抽象表示,非常适合于用来考察方法体内横切关 注点和核心关注点之间的单向依赖关系,这种关系在依赖图上有着清晰的结构特征,即实现核心关注点 的语句集不会数据依赖或控制依赖于实现横切关注点的语句集示意图3 4 表示某个方法中横切关注点 和核心关注点在程序依赖图上的表现形式,这种形式也与上述的单向依籁关系是相吻合的,核心关注点 独立于横切关注点而存在,横切关注点可能依赖于核心关注点。 e 万二习, ;o 一。+ , b a l a n c e ) s2:throwni n s u f f i c i e n t a m o u n t e x c e p t i o i l ( n oe i i o u 曲m o n e yt od e b i t ) ; s 3 :d 目l c t o d a y 兰t 隔d a t 舅 “:l o g g c r 1 0 9 ( t o d a y t o s t f i n g ( 1 + c a m n o “+ t h i s ,c r c d i t n o + “d e b i t 。+ a m o u n t t o s t r i n 9 0 ) ; s 5 l o n gs t 棚m e = s y n e m c u r r e m 瓜r a e m i l | i s ( ) ; s 6 : i f ( u s e d c o u n t + + 1 0 :o ) 勒卡次数每超过1 0 敬,漶费积分加l s 7 :c r e d i t p o i n t + 一1 0 0 , s 8 :t h i s b a l a n c e 互a m o u n t ; s 9 :l o n ge n d n m e = s y s t e m ,c u r r e n t t i m e m i l l i s 0 ; s 1 0 : s y 辄c m o u t p d n t l n c d u r a l i o a t i m e i n d e b i t :14 - ( e n d t m a e 姐d t i m c ”:,d 曲i t 性能监棍 p u b l i c v o i d d e p o s i t ( f l o a t o 嘲) t d a t e t o d a y = n 州d a t c o ; l o g g e r 1 0 9 ( t o d a y m s t r i n 9 0 + “c a r d l q o “+ t h i 瞳c a r d i t n o + “d e p o s i t “+ 锄m 倒吡l 汹咖g ( ) ) : f l a b , b a l a n c e + = a m o u r ; , , 图3 5 示例程序 控制依赣边 数据伎赣边 图3 6 方法d e b i t 的程序依赖图 经过上述改进后。我们可以得到一个含有c o r e 结点的新的方法依赖图,所有与核心功能相关的语句 在新依赖图上至少存在一条到c o r e 结点的路径,至此,方法的核心关注点可由c o m 结点来表示知图 3 5 所示的示例代码中,c r e d i t c a r d a c c o u n t 是一个模拟的信用卡帐户类,d e b i t 模拟刷卡消费,d e p o s i t 模 拟存款还贷。d e b i t 方法除实现刷卡消费的核心关注点( s 6 ,s 7 、s 8 ) 外,还实现了参数检测( s l ,s 2 ) 、 日志记录( s 3 ,s 4 ) 和性能监视( s 5 、s 9 和s 1 0 在实际应用中可能是记录刷新数据库中记录所需要的 时闻) 等关注点,这两个具有“横切“特性的关注点也是a o p 的最典型应用场合之一。图3 6 显示了按 上述步骤构造的方法d e b i t 的程序依赖图,因为语句s 6 ,s 7 和s g 都修改了接受对象的状态,所有都与 c o r e 结点建立了数据依赖关系。 东南大学硕士学位论文 3 4 横切关注点的挖掘算法 3 4 1 计算核心关注点的语句集 撮据上述的方法对源代码级的程序依赖图进行改进后,利用虚拟c o r e 结点及其边信息很容易确定所 有影响了c o r e 结点的语句结点。程序切片技术【2 5 】为解决此类问题提供了切实可行的解决思路。给定切 片标准s ,p 其中s 是程序点,v 是一个变量集。其切片包含了执行到s 处影响了v 中变量取值的所有 语句。因此,为c o r e 结点构造一个切片标准 ,其切片包含了所有影响c o r e 的语句结点。在 依赖图上,扶c o r e 结点沿着依赖边回溯,我出所有逆向可达结点,这些结点组成的集合就是c o 结点 的切片。对于一个方法而言,它的程序依赖图一定会包含一个表示方法入口的s e m i 3 , 结点,所以,c o r e 结点最后个可达结点是方法的入口结点。 3 4 2 挖掘横切关注点的算法 计算出核心关注点的语句集后,如果从依赖圉上删除这些语句结点,其中也删除了方法入口结点及 其所有出边,即从依赖图上“剥离”出核心关注点,那么剩下的语句结点都可以看做是方法的横切关注 点对应的语句。如果方法中有多于个的横切关注点,那么这些混合在核心关注点中横切关注点在依赖 图的结构上变褥非常清晰,它们各自对应语句集构成了若个连通分量,于是,识别横切关注点的问题很 自然鲢转亿为求解雷的连通分量的简题。因此,挖掘方法体内的横切关注点可分为两个步骤;( 1 从c o r e 结点开始计算后向可达的语句结点并从依赖图上删除这些语句结点;( 2 ) 求解依赖图上的连通分量。每 个连通分量对应了方法体内的个横切关注点。 图3 7 显示了关注点的分离算法,其中v i s i t e d 是个全局的辅助数组,用于存储每个结点的访问状态, c o r e c o a c e m 集是从c o r e 结点后向回溯锝到的结点集,表示核心关注点的语句集。c r o s 幢c m 集是 所有非核心关注点集合,其每个元素都是无向图上的一个连通分量,对应一个横切关注点d f s 是一个 深度优先遍历无向图的算法 算法:s c 咧厦h l m 输入,方法m 程序依赖雷g 输出t 核心关注点语句集c 。l o c 蚰c e m 和横切关注点集c r o s s c u t c o 啊a m s b e 。h 从c o r e 结点开始向上回溯得c o r c c o n c e m 集: 从g 中删除c 【卵c 蛳。锄集中所有的结点并: 去掉边嚣方岛佳褥无岛噩: 韧始化c f o s 鲫l c 知l c 啪s 为空和v i s i u = d i n l = l 扎q f o r c hs n g 山 西删【s 】剑_ s e 凸e l l 创建一个新的c o o c c m 集并置为空: d f s 饼g 髯c o n c e r n ) ; 将c o m u m l 添加至o o 嚣c l i c c o 日c 哪s 中: e n d 图3 7 方面挖掘算法 数图3 5 的示例程序为倒,先从c o 结点开始找出所有后商可达的语句结点s 6 、s 7 、s 8 和s e n m y , 如图3 8 所示( 带阴影的结点为所求的结点) ,然后从依狡匿上删除这四个结点,剩下的依赖图如图3 9 所示,方法o r b i t 中的横切关注点且了然,分别对应图的三个连通分量。利用上述算法,可得到d e b i t 的核心关注点对应的语句集合为 s 6 ,s 7 ,s s 横切关注点对应的语句集合为 s l ,s 2 , s 3 ,s q 和 s 5 ,s 9 。s 1 0 ,其中 s l , s 2 为参数检测的关注点, s 3 , s 4 为日志记录。 s 5 ,8 9 ,s l o 为性能监视。 从这个例子也从另一方面充分地说明了横切关注点的本质特征是t m g l i n g 特性,核心关注点和横切 1 4 第三章基于程序依赖图的方面挖掘技术 关注点之间的单向依赖关系在依赖图上得到了非常清晰地体现,一旦核心关注点被抽取出来,那么那些 与核心关注点交织在一起的横切关注点就是图的连通分量。 3 5 算法分析和讨论 图3 8 核心关注点的语句结点( 带阴影) 一一嘏 ;1 c o r e “ 一罐 匿3 9 方法d e b i t 体内的横切关注点 锄锄 如上所述,基于程序依赖图的方面挖掘算法以方法体内语句间的依赖关系为基础,引入了表征核心 功能的c o r e 结点,充分利用了方法的语义信息( 如返回值等) 和横切关注点的实现惯用法中蕴含的一些 模式特征,先建立语句结点与c o r e 结点的关联边,然后从虚拟的c o r e 结点回溯求解核心功能的语句集 合,并将其从依赖图上剥离核心功能,从而形成了表示横切关注点的连通分量,于是求解图中连通分量 的过程就是横切关注点的识别过程。该挖掘算法的理论支撑点是横切关注点的本质特征及其在依赖图上 表现形式,算法中确定与核心功能的相关数据、改进程序依赖图、从依赖图上剥离核心功能的语句集等 步骤都是从这个支撑点出发的,这也和引入横切关注点的初衷相吻合( 增加额外的功能但不能影响核心 功能) 。从理论模型上分析,挖掘算法具有如下特点: 时间复杂度 从整个挖掘工作的过程来看,该挖掘算法的时问开销由两部分组成:构造程序依赖图和执行挖掘算 法,一旦构造好程序依赣图后,那么执行挖掘算法的时间开销非常小,如图3 6 算法所示,时间复杂度 实际上为遍历依赖图所需的时间,从c o r e 结点开始后向回溯以及求解图的连通分量的时间复杂度均为 c 枷+ 0 ,其中h 为方法依赖图上的结点个数,p 为依赖边的条数( 包括为关联c o r e 结点引入的虚拟边) , 对于一个方法来说,语句的条数一般不会超过6 0 条,绝大部分都小于2 0 条语句。构造程序依赖图的时 问复杂度取决于依赖图的精度,耪度越高所需的时翘开销越大,反之,时阊开销就越少。 1 5 j。j审 。j j 勘雹 、? 厂、一 、 一甜 一 一一鎏 ! q 妥 ,。一 ; ,。建 ;, 一& 一 锣j锣 q 东南大学硕士学位论文 语句级挖掘粒度的影响 该挖掘算法一个显著的特点是具有语句级的挖掘粒度。识别出的横切关注点都是以语句集合的形式 给出。这种细粒度的挖掘方法固然有利于辅助软件维护人员浏览方法体内潜在的横切关注点,特别是对 于因方法前置条件检查和异常处理等造成的横切代码,该方法毹够非常有效地识别出这些横切关注点 当涉及到类层次复杂、应用大量设计模式的场合,仅在方法体内执行横切关注点的挖掘,作用范围 显得过小,因此,挖掘方法会受到挖掘粒度的影响。实际上,在面向对象程序设计中,类作为最小的单 元模块,从现实世界的对象中抽象出来的,对应了系统中的一个角色,并且需要实现这个角色在系统中 担任的职责,如果在实现这些职责的屙时,还要兼顾另外一些横切关注点,那么此时一种常飓的做法便 是将封装了横切功能的对象作为自己的成员对象,将这个横切关注点与类本身绑定在起,通过类的成 员对象实现横切关注点对于这种在类级别以成员对象的方式“入侵”的横切关注点,需要综合更多的 语义信息。 因此,为了尽可能地有效地识别在类级别引入的横切关注点。本文的挖掘算法在确定与核心功能相 关的数据时,对在外部创建而后以参数形式传入的对象作了特殊处理,把它们排除在外,这样做可以有 效地识别出诸如o b s e r v e r 模式、d e c o r a t o r 模式和p r o x y 模式引入的横切关注点基于f a n - i n 分析的挖掘 技术在识别类级别引入的横切关注点比较有效,一则是因为它的挖掘粒度是方法级的,二则它是根据方 法的调用频度来识别横切关注点。f a n - l n 分析方法一旦发现了频繁地调用某个成员对象的方法则推断 这个成员对象是以横甥关注点的形式蔼引入台搴,鉴于此,可以尝试将本文的挖掘算法与f a n - i n 分析方 轰 相结合,先在方法层次上执行f a n - i n 分析,然后根据这些结果执行基于语句级依赖关系的挖掘算法 对s c a t t e r i n g 和t a n g u a g 代码的识别力 与其他挖掘算法相比,该挖掘算法没有局限于横切代码的代码结构或行为特征,而是考虑更底层的 依赖关系,因此s c ;啦晡a g 特性和锄咖特性都旋被有效地识别出。这一点从算法执行过程中求解连通 分量的步骤得到反映。在删除核心功能对应的语句集之后,如果此时待分析的这个方法兼顾了多个横切 关注点,那么每个横切关注点对应的语句在依赖图上都组成了一个连通分量。另一个方面,程序依赖图 仅考虑了语句间的基本依赖关系,丢弃了语句间的执行顺序,因此,对于以非连续语句存在的代码块, 它们在依赖图上对应的仍然是一个连通分量。对于如图3 5 所示的示倒代码,基于f a n i n 分析、克隆检 测或概念格分析的挖掘方法难以识别出作为性能监视而存在的横切关注点。 挖掘算法的可伸缩性 从算法的可伸缩性来看,它能够较好地适应大规模的软件系统就算法本身的特点来说,它是以单 个方法的依赖图为挖掘算法的执行单元。时间和空间开销主要取决于方法依赖图的构造过程而在构造 程序依赖图的过程中。我们可以利用b d d 技术【8 】有效地减少时问和空间的开销提高算法的执行效率。 以适应大规模程序的需求。 3 6 本章小结 本章重点阐述了墓于程序依簸图的方面挖掘技术。横切关注点的本质特征在于它不会影响核心关注 点的具体实现,只是以“横切”的形式与核心功能混合一起,本章从这一角度考察了s c a t t e r i n g 代码和 t a a e 丑i n g 代码中横切功能和核心功能的依赖关系以及横切关注点在实现方式上的特点,并以源代码级的 程序依赖图作为抽象表示,引入一个虚拟的c o r e 结点表征方法对应的核心功能,所有修改了与核心功能 直接相关的数据都将与c o r e 结点建立依赖关系,然最在这个改造的依赖图上执行方面挖掘操作,先从 c 0 1 - e 结点回溯,找出所有的后向可达结点作为核心功能的语句集,然后从依赖图上删除这些语句结点, 再通过求解图的连通分量作为横切关注点的语句集,从而分离了方法中混合在一起的横切关注点和核心 关注点。该挖掘方法从语句问的依赖关系为识别横切代码的线索,能够有效地识别方法体内因横切关注 点而引入的s c a t t e r i n g 代码和t a n d i n g 代码。 1 6 第四章方面挖掘系统实现技术研究 第四章方面挖掘系统实现技术研究 除了前面章节对方面挖掘方法的理论研究,我们还研究了如何实现个基于依赖图的方面挖掘系统。 本章讨论了一个以s o o t 工具为字节码分析框架,面向j a v a 程序豹方面挖掘系统的设计和实现技术。 4 1s o o t 框架简介 s o o t 是m c g i l l 大学开发的一款优秀的j a v a 字节码分析工具,它完全是用i a v a 语言实现,最初目的 是为研究人员提供了一个用于j a v a 程序分析、优化和转换的通用框架,后经不断扩充和改进,s o o t 工具 已内置多种标准的j a v a 分析和优化技术,如数组边界分析、指向分析、类型分析和副作用分析等,并提 供了一个e c l i p s e 插件版本,极大地方便了研究人员结合已有的分析技术研究领域相关的程序优化和转换 技术,如本文提到的方面挖掘技术等。 s o o t 的执行流程大致是这样的,先将输入的c l a s s 文件转换成字节码的某种抽象表示,通常是j i m p l e 格式,然后执行一系歹l j 分析或转换、优化等操作,再将分析结果以t a g 形式附加到j i m p l e 中闻表示上, 最后生成带有优化信息a t t r i b u t e 的字节码文件,用于后继的j a v a 解析器或调试器中。如图5 1 所示 t :“一“s o o t 一一毽 如z 厂i 磊确r 输入 、一, ”彳f ; j 图4 is o o t 框架概篮 鲍臣匦马 一; jv ”_ 撒l : l 一一i d 。解析馨 一,臻j r r 谓试器 7 预编泽嚣 4 2 程序依赖性分析的实现 程序依赖图的构造是实现方面挖掘工具过程中一个极其关键的步骤,正如翦西章节分析,程序依赖 图的构建直接影响了方面挖掘算法的两个重要方面,即效率和精度。本节将描述的是s o o t 框架中构建基 - 于j i m p l e 中间表示的方法依赖图时所涉及到一些分析技术及相应的实现方案。 4 2 1 指向分析 指囱分析 4 5 1 用来获取程序中指针类型的变量所指向的对象集合信息,以确定指针在运行时的行为。 对于j a v a 这种支持动态绑定,存在大量堆空间引用的强类型语言,指向分析能够为程序优化和软件分析 提供更多的信息,推测出指针变量运行时可能执行的对象。s o o t 提供了一个灵活、模块化的、统一的指 向分析分析框架s p a r k 3 2 。s p a r k 以指针赋值图( f a g ) 作为程序的内部表示,先根据输入的j i m p l e 中 间表示构造程序的指针赋值图,然后通过合并具有相同指向集的结点简化指针赋值图,最后根据求解指 向集的传播算法确定指针变量可能指向的对象集。本文就是基于s p a r k 框架实现j a v a 程序的指向分析技 术, s o o t 中可以通过s c e n e v 0 g e t p o i n t s t o a n a l y s i s o :来获取s p a r k 构建的指向赋值图p a g ,p a g 实现了指 向分析接口p o i n t s t o a n a l y s i s ,提供丁r e a c h i n g o b j 。c ) 方法族查询指向类型变量的指向集。如图4 2 所示,定义了s p a r k g b p t s t o q u e r y 封装了s p a r k 指向分析方法,著将指向空间统一转换到抽象堆空间上。 7 东南大学硕士学位论文 4 2 指向分析类层次图 4 2 2 副作用分析 图 副作用分析【4 7 是指向分析的一个具体应用,它用来获取程序中在运行时一条指令或一个方法调用 可能读写的对象空间,为了便于表达程序运行时的物理空问,我们用抽象空间的概念来描述运行时所有 的物理空间一个抽象空间能够表示类的静态变量、堆对象引用和局部变量所对应的内存空间。更细致 她描述了变量或对象除类型之外的信息,如堆对象的分配方式和分配语句等,一个抽象空问应该靛够获 取原对象的类型信息,因此,定义l o c a t i o n 接口表示抽象空闻并提供了g c f c y p e 方法用班返回推象空间 中对象的类型。图4 3 显示了抽象空问的接口以及层次关系接口g l o b a l l o c a f i o n 表示静态变量的空问 接口h e a p l o c 缸i 硼是堆空间,接口s t a c k l o c 舡i o n 是拽空问通过n e w 操作在堆空间中分配的对象用 该对象的分配点作为抽象空闻,h c a 妒b j c c t 提供了g e t a i l o c u n i t 操作来获取这个语句点 图4 3 抽象空间类层次田 对于不含方法调用的语句,可以通过调用u i i i t 接口提供g 甜) e 毋“和g e t u s e b o x e s 来获取读写的抽象 空间。而对于含有方法调用的语句,需要从方法的入口参数开始收集方法可能读写的抽象空间。考虑方 法的可传递调用,分两种情况考虑调用点的副作用:一种是不考虑由于传递调用;二是考虑 c 接口” s 油e e 缗 c l 汗 + 簪n 哦饿d f s 州岫d m o 。 + g e t m o d o u s e r l o c s ( s o o t m e t h o d r rb o o l 口, u 打耐* 硼:s e t + g e t u s e d o u t e r l o c s ( , o o t m e t h o d m b o o l e i j t r c m j i t t v e 0 :s e t + g e t e n t r y d e f ( s n o t m e t h o d m ) o :n l 图4 4s i d e e f f e e t o r 落口 1 8 第四章方面挖掘系统实现技术研究 传递调用,这就需要遍历方法的调用图,获取所有可达的传递被调方法。 图4 4 是一个副作用分析器的接e l s i d e e f f e c t o r 。其中,g e t a e c e s s e d l o c s 获取方法m 中能够访问到的所有 抽象空间集;g e t m o d o u t e r l o c s 获取方法m 中修改的外部抽象空问,i s t r a n s i t i v e 表示是否考虑方法调用; 弛e 桕l 船口。菝取方法m 中使用的外部抽象空间。i s t r a n 5 i t i v e 表示是否考虑方法调甩;g c t e n t r y d e f 获 方法w 的入口定义集,主要用于流分析。 4 2 3 依赖性分析 这里的依籁性分析主要是指数据依赖关系和控制依赖关系的计算。 数据依赖关系鲍计算需要对每个程序点迸彳亍定义引用分析,求解每个程痔点上的到达定义集r d 和 可达引用集r u 4 8 。由数据依赖的定义可知,对于一个程序点s ,如果程序点d 属于s 的r d 集并且s 属于d 的r u 集,那么s 数据依赖于d 。r d 集和r u 集的计算是数据流分析中经典的问题,可通过迭代 数据流方程来求解。s o o t 中提供了一个流分析的抽象模板,并根据流方向的不同分为前向流分析 ( f o r w a r d f l o w a n a l y s i s ) 和后向流分析( b a c k w a r d f l o w a n a l y s i s ) 计算r d 属前向数据流分析问题。计 算r u 属后向流分析问题。 这里,我们首先声明了两个接口,接口r e a e h i n g d e f q u e r y 用于查询程序点的到达定义信息,接口 r e a c h a b l e u s e q u e r y 用于程序可达引用信息。类r d a n a l y s i s 继承了抽象类f o r w a r d f l o w a n a l y s i s ,用于实 现到达定义的数据流分析,它实现了r e a c h i n g d e l 呻接口,类r u a n a l y s i s 继承了 b a c k w a r d f l o w a n a l y s i s ,用于实现可透引用的数据流分析,它实现了r e a e h a b l 洳q u e r y 接口r d 分析 和r u 分析的类层次结构如图4 5 所示 4 5 定义引用分析类层次图 图 控制依簸关系可以通过在控铡漉匿上求解语句结点的最近后岛必经结点集来确定。s o o t 支持构造霹 向不同需求的控制流图。b r i e f u n i t g r a p h 类表示不考虑异常处理控制流的流图,e x c e p t i o n a l u n i t g r a p h 是 考虐异常处理控制流的本文中,考虑到需要识别因异常处理而引入的横切代码,因此需要为每个待分 析的方法构造e x c e t p i o n a l u n i t c a a p h 类型的控制流图 获取程序点之问的依赖关系信息之后,可以很容易的构造基于j i m p l e 格式的程序依赖图,如果两个 语句结点之间存在数据依赖关系,则在结点之问添加一条数据依赖边,若存在控制依赖关系则添加控制 依赖边。需要注意的,每个方法都有一个入口结点,方法体内所有的语句结点都控制依赖于它 1 9 东南大学硕士学位论文 4 3 方面挖掘系统的实现 4 3 1 总体框架 方面挖掘工具由两部分组成:后端分析模块和前端界面显示模块。后端分析模块以源代码级为输入, 先对程序进行依赖性分析计算每个待分析方法体内程序点之间的依赖关系,构建基于j i m p l c 中间表示 ( i r ) 的程序依赖图,然后将其转换为源代码级的依赖图并根据访问数据的属性对依赖图加以改造,最 后执行挖掘算法提取源代码中潜在的横切关注点。前端界面显示模块是一个e c s p s e 插件,通过扩展视图、 上下文菜单等部件为用户提供直观、友好的入杌界面,显示挖掘工具的运行结果,并能以高亮形式标记 方法体内的横切代码总体框架如图4 6 所示。 4 3 2 关键数据结构的设计 图4 6 方面挖掘工具系统框架 天 用户 ( 1 ) 静态变量、局部变量和堆指针的表示 本文的挖掘算法需要考察方法体内每个语句结点中所访问数据对象的属性,包括是否为静态变量、 是否为t h i s 对象的可达域、是否为外部创建的成员对象、是否为方法的输入参致对象、是否为局部变量 等,这些属性是改进程序依籁禹的依据所在 静态变量j a v a 程序中的静态变量类似于c 语言中全局变量,对一个静态变量对象的引用可看做是 一个全局指针s o o t 中用s t a t i c f i e l d r e f 类表示对静态变量的引用。本文定义了g l o b a l p o n t e r 类封装 对静态变量的引用,并将其映射到了抽象空间集中,接口g l o b a 岫t i o n 统一维护了方法体内所有静 态变量引用到抽象空间集的映射表。如果语句只修改了静态变量的值,在改进依赖图时不会将该语句 结点关联到c o m 结点上g l o b a l l o c a t i o n 和g l o b a l p o i n t e r 类结构如下: p u b l i ci m e r f t g l o b a l l o c a t i o ne x t e n d sl o c a t i o n i m b ks o o t f i e l dg o t s o o t f i e l d 0 ;,月* 取l o c a t i o n 刺 应的域 ,静态对象一f i e l d 2 l ( ) c 存储了整个程序中所有的静态对象到其所指抽象空问的映射表, s t a t i cm a p * * f 正l d 口l o c = d e w i - l a s 酬s c e n e v o g c t f i e l d n u m b e r e r 0 s i z e o ) ; ) p u b l i cc l a s sg l o b a l p o i n t e ! re x t e n d sp o i n t e ri m p l e m e n t sg l o b a l l o c a t i o n 产从全局f 1 e l d 2 l o c 表中检索f i e | d 对应的l o t i o n ,如果有,则返回j 耋个i o c a l i o n , 第四章方面挖掘系统实现技术研究 否则,阻6 c i d 新创建一个g l o b a l p o i n t e r 并添加到f i e l d 2 d o c 中, p u b l i cs t a t i cp o i n t e rg e t p o i n t e k s o o t f i e l df i e l d ) ; p r i v a t eg l o b a l p o i n t e r ( s o o t f i e l df i e l d ) ; p u b l i cs 崾i e l dg e t s o o t f i e l d 0 ; p u b l i ct y p eg e t t y p e 0 ; p r i v a t es o o t f i e l d - 矗e l d ; , 堆对象引用。j a v a 程序中存在大量的堆对象引用。可以t l c w 表达式、参数传递、异常处理c a t c h 参数、 访问数组和t h i s 对象等方式引用一个堆上的对象与g l o b a l p o i n t e r 类似,我们定义了h e a p o b j e c t 接 口和一个全局映射表f 1 e l d 2 h e a p 统一维护堆对象的引用到抽象空间的映射表。 c o m m o n h e a p o b j e e t 类实现了h e a p o b j e c t 接口,表示一个堆对象引用。在改造依赖图时,可以通过 c o m m o n h e a p o b j e e t 对象的k i n d 域判断引用堆对象的途径,如果发现一个语句结点修改的堆对象属 于t h i s 对象的成员( 除p r i m i t i v e 类型的成员外) 并且是由n e w 表达式分配的,或者是由方法参数传 入的,那么添加一条从这个语句结点到c o r e 结点的数据依赖边,表示这个语句结点与方法的核心功 能直接相关。c o m m o n h e a p o b j e e t 类的结构和主要方法如下: p a b h e c l a s sc o m m o n h e a p o b j e c ti m p l e m e n t sh e a p o b j e c t 仃和g l o 蛔l p o n 打中辨姆畸1 m l c f 方法类似,以a l l o e 为键值从全局殃射表f i e l d 2 h e a p 中取雉对象 p u b l ks t a t i ch e a p o b j e c tg e t h e a p o b j e t l ( s o o t m e t h o dm e t h o d , u n i ts t m l v a l u ea l l o e ) ; p a b l ku n i tg e t a l l o c u n i t o ;,月x 取分配点的语句 p u b l i cs o o t m e t h o dg e t m e t h o d o ;胴x 取宿主方法 p u b l i cb o o l e a ni s e x t e n d e d p a r a m e t e r o ; 判断该对象是否通过参数丽指向堆空闻 p u b l i cb o o l e a ni s g e n b y n e w e x p r o ; 判断是番由畦w 表达式创建的 构造一个类型为啪辑在方务l a n e t h o d 中的语句s 咖t 处,以a 为分配表达式的堆对象 p r i v a t ec o m m o n h e a p o b j e e t ( s o o t m e t h o dm e t h o d ,u n i ts t r u t , v a l u ea l l o t ,t y p et y p e ) ; p r b r a 垂et y p e _ t y p e , p r i v a t ev a l u e _ a l l o e = n u l l ; p r i v a t eu n i t _ s l r a t = n n i l ; p r i v a t ei n tj d ; p r i v a t es o o t m e t h o dm e t h o d - - n u l k 堆对象的类銎 ,分配对象的表达式 ,分配对象的m - m l 编号 ,j 开属的方法 p r i v a t ef i n a ls t a t i cs h o r tb yn e w = o :,通过n c w 表示式分配的 p r i v a t ef i n a ls t a t i cs h o r tb ye x c e p t i o nr e f = 1 :# 常处理对象引用 p r i v a t ef i n a ls t a t i cs h o r tb yn u 洲p a s s i n g = 3 :,j 甚过参数传递得到的 p r i v a t e 矗矗a ls t a t i cs h o r tb yt h i sr e f = 4 :,墙进 i l b 秭用得蜀的 p r i v a t es h o r t 于上述哪种类型7 k i n d ; n i l 局部变量。定义s t a c k p o i n t e r 表示方法体内的局部变量,它可以是一个指针类型。可以指向堆空间中的 对象。接e l s t a c k l o c a t i o n 类似于g l o b a l l o c a t i o n ,包含了一个全局映射表用于维护方法体内所有栈指针 到抽象空间的映射表v a l u e 2 t h i s p u b l i cd a s ss t a c k p o i n t e re x t e n d sp o i n t e ri m p l e m e n t ss t a c k l o c a t i o n 类似于g l o b a l p o i n 时中的础i n t 口;从用于存储局部变量到指向空间的映射表中取 s t a c k p o i n t e r g ;j 象,若有则直接从映射表中返回该对象,若没有,则用局部变量i c 新建 一个s l a c k p o i n t e r g 嚏 象并以l c 为键值添加到映射表中 2 i 东南大学硕士学位论文 p u b l i cs t a t i cp o i n t e rg e w o i n t e r ( v o a u el c ) ; p r o t e c t e ds t a c k p o i n t c r ( v a l u el c ) ; f t i l o c a l x 日象构造一个s t a c k p o i n t c r 对象 p u b l i cv a j u eg c t v a l u e o ;t 觌s t a c k l o c a t i o n 接e 1 返回局部变量 p u b l kt y p eg c t t y p e o ;实现l 刺i 伽接口返回局部变量的类型 p r i v a t ev a l u e - l c ;溉中v a l u c 对应一个带有值和类型的表达式,此处为局部变量 ( 2 ) 程序依赣图的结构设计 程序依赖图的类层次结构如图5 7 所示,它既支持基于j i m p l e 中间表示的依赖图构造。又能支持基 于j a v a 源代码的依赖图构造。r e f i n e p d g 是一个经改造后的程序依赖图,专门用于实现本文的挖掘方法。 d e p e n d e n c y g r a p h 是一个依赖图的接l :l 。 圈4 7 程序依狡图的类结构 依藏结点d c p e n d e n c c n o d e 是所有依赖结点的抽象类。对于依赖图中一个结点来说。它对应了程序 中的一条语句,因此1 ) 必须属于某个方法;2 ) 具有一个唯一的编号值;3 ) 绑定到程序中的一条语 句脚d e n c e n o d e 的结构如下: p u b l i ca b s t r a c tt l a s sd e p e n d e n c e n o d ei m p l e m e n t sn u m b e r a b l e ,朐遣结点,一个依赖结点必须属于某个方法的环境中, p u b l i cd q m d e n c e n o d e ( m e t h o d o r m e t h o d c o n t e x tm 曲; p u b l i cs t a t i cn u m b e r e rg e t n u m b e r e r o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- UI设计顾问招聘笔试题及解答(某世界500强集团)2025年
- 儿童感觉统合训练师异常处理考核试卷及答案
- 焙烧炉焙烧工三级安全教育(车间级)考核试卷及答案
- 轻冶浆液调整输送工适应性考核试卷及答案
- 电脑维修远程协助创新创业项目商业计划书
- 智能合同谈判与协商平台创新创业项目商业计划书
- 农业资源共享信息平台创新创业项目商业计划书
- 2025年职业卫生培训考试试题(含答案)
- 跨区作业安全管理办法
- 美容院连锁品牌加盟区域市场调研与评估合同
- 生活垃圾填埋场地下水污染防控与综合治理工程项目可行性研究报告
- 医学教育中的全科医学与专科医学的比较与协同
- 肠梗阻小讲课
- 《小儿支气管肺炎》课件
- 马克思主义经典著作选读
- 食材配送沟通服务方案
- 机房建设清单
- 第09章-船舶甲板机械电力拖动及其电气控制
- 小学思政课《爱国主义教育》
- 前列腺癌的诊断与PI-RADS影像
- 现代物流基础PPT完整全套教学课件
评论
0/150
提交评论