没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记233(2009)143-159www.elsevier.com/locate/entcs大型C++代码库Alexandru Telea1 Heorhiy Byelas2荷兰格罗宁根大学数学与计算科学研究所卢西恩·沃什3SolidSourceBVEindhoven,荷兰摘要在评估大型C++代码库的质量和可维护性时,需要工具从源代码中提取一些事实,例如:架构,结构,代码气味和质量指标。此外,这些事实应该以这样的方式呈现,以便人们可以将它们联系起来并找到异常值和异常我们提出了SOLIDFX,一个集成的逆向工程环境(IRE)的C和C++。SolidFX专门设计用于支持代码解析、事实提取、度量计算和结果的交互式可视化分析,其方式与用于正向工程管道的IDE和设计工具非常相似。在SSOLIDFX的设计中,我们调整和扩展了几种现有的代码分析和数据可视化技术,使它们能够处理数百万行的代码库。在在这篇文章中,我们详细介绍了几个设计决策,以构建SolidFX。我们还举例说明了应用程序我们的工具和我们的经验教训,在使用它在几种类型的分析现实世界的工业代码库,包括可维护性和模块化评估,检测编码模式,和复杂性分析。关键词:逆向工程,解析,C++,软件可视化1引言在过去的几年中,出现了一些工具来支持程序理解,软件维护,逆向工程和再工程活动。 这些工具的很大一部分主要通过静态分析从源代码中提取信息。这包括一组操作,从代码解析和事实提取,事实聚合和查询,到交互式表示。1电子邮件:a.c. rug.nl2电子邮件:h. v. rug.nl3电子邮件:lucian. solidsource.nl1571-0661/© 2009 Elsevier B. V.根据CC BY-NC-ND许可证开放访问。doi:10.1016/j.entcs.2009.02.066144A. Telea等人/理论计算机科学电子笔记233(2009)143静态分析工具需要满足几个要求才能被软件行业接受和使用。首先,事实提取器应 该 能 够 从 可 能 不 正 确 和 不 完 整 的 数 百 万 行 代 码 ( Lines-of-Code , 简 写 为Numbers)的代码库中提供详细的低级信息,例如完整的语法树。接下来,需要后续工具来从原始数据查询感兴趣的事实的子集,例如,选择符合给定质量或安全标准的所有代码片段。特别令人感兴趣的是从源代码中恢复高级设计信息,例如类图。计算质量指标和代码气味是这个过程中的重要工具。第三,应提供互动的演示和探索机制,以推动整个理解过程。最后,所有上述工具应该紧密集成,可扩展,易于使用和学习。对于C++语言,很少有静态分析和逆向工程工具集满足所有上述标准。考虑到语言的复杂性,它的几种方言,混合C和C++代码的存在,以及预处理器的使用,对工业规模的C++代码库进行健壮的静态分析特别困难。此外,尽管存在几个C和C++静态分析器,但很少有集成在一个框架中的查询,度量和交互式可视化工具,使它们真正可扩展,易于软件工程师使用在本文中,我们提出了我们的经验,在体系结构的SOLID FX,C和C++的集成逆向工程环境。 S SOLID FX是一个COM-商业产品,它提供了对行业规模的C和C++代码库的全面分析,可定制的查询和度量引擎,以及从源代码中提取UML类图[22]。 所有的分析操作支持的S SOLIDFX是通过一个交互式的用户界面,使用几种新颖的可视化技术,以实现可扩展性。S OLID FX的设计涵盖了从局部变量到系统架构的广泛分析,同时也是一个开放的环境,允许通过插件集成第三方分析。总体而言,S OLID FX可以为软件开发人员提供与集成开发环境(IDE)( 如Visual C++或Eclipse)相 同 的 外 观 和 感觉。本文件的结构如下。 在第2节中,我们介绍了相关的工作,交互式静态分析和逆向工程的上下文,重点是C++。第3节描述了SOLID FX的工具架构,并详细介绍了它的主要组件:解析器,查询和度量引擎,以及SOLID FX在事实提取和分析引擎之上添加的数据视图。 第4节介绍了我们的工具在三个现实生活中的代码基础上的几个应用程序。 第5节讨论我们在实践中使用SSOLID FX的经验以及从实际客户那里获得的反馈。第6节总结了未来的工作方向。2以前的工作交互式逆向工程领域的相关工作可以分为两类:从源代码中提取和分析事实,以及结果的可视化表示。在第一类中,我们特别关注C++静态代码分析,因为A. Telea等人/理论计算机科学电子笔记233(2009)143145这是我们的目标域。C ++静态分析器可以大致分为两类:轻量级分析器只对输入代码进行部分解析和类型检查,因此只产生整个静态信息的一小部分。 轻量级分析器包括S RC ML [6],S NIFF+,GCCXML,MCC [18]和几个使用ANTLR解析器生成器构建的自定义分析器[20]。通常,这样的分析器使用有限的C++语法,并且不执行预处理、作用域和类型解析。 这使得它们非常快,并且实现和维护相对简单。然而,这样的分析器不能提供我们(视觉)分析所需的详细信息,我们将在后面看到。此外,轻量级分析器不能保证所有产生的事实的正确性,因为它们不执行完整的解析。与此相反,重量级分析器执行(几乎)典型编译器的所有步骤,例如预处理,完整解析和类型检查,因此能够提供高度准确和完整的静态信息。支持C++ 的著名重量级分析器包括DMS [2]、COLUMBUS[9]、ASF+SDF [28]、ELSA[17]和CPPX [15]。然而,更强大的重量级分析器也显着(通常超过一个数量级)慢,并且实现起来要复杂得多重量级分析器可以进一步分为严格的,通常基于编译器解析器,它会在词法或语法错误时停止(例如CPPX);和宽容的,通常基于模糊解析或广义左归约(GLR)语法(例如COLUMBUS)。我们早期为C++设计IRE的工作使用了一个严格的基于GCC的分析器[16]。我们很快注意到使用严格分析器的局限性 典型的用户没有完全可编译的代码库,例如。 因为缺少包含或不支持的方言,但仍然希望能够分析它。静态分析器的输出,主要是由运行的批处理产生的,可以馈送到一系列可视化工具。 存在许多这样的工具,从线级、细节可视化(如SeeSoft [8])到结合结构和属性表示的架构可视化(如Rigi [23]),CodeCrawler [13]或SoftVision [24]。Diehl在[7]中提供了软件可视化技术的广泛概述3IRE架构3.1环境要求我们寻求设计一个集成逆向工程环境(IRE),它为逆向工程过程提供类似的可扩展性和易用性,就像IDE对正向工程所做的那样,始于早期的工具集版本,称为可视化代码导航器(VCN)[16]。在涉及商业,开源和学术C++代码的几个项目中使用VCN获得的初步结果,以及我们自己使用COLUMBUS进行内部事实提取的经验,使我们得出以下主要设计考虑和要求:• 相对于不完全的提取器,强烈优选容许提取器。 在早期和后期的逆向工程和分析阶段,用户希望能够146A. Telea等人/理论计算机科学电子笔记233(2009)143分析由于各种原因无法编译的代码,并且不接受 一个严格的提取器,在预处理器,语法或类型错误时失败• 由于几个原因,较重的提取器优选于较轻的提取器。首先,用户需要设计自定义的、项目或特定于任务的查询和代码指标,这些指标使用广泛的事实类型,因此我们需要能够生成这些指标。 第二、为了对源代码进行实时查询,并在代码级可视化中呈现分析结果,我们需要细粒度的信息,例如源代码中每个标识符的位置,范围和类型。这样的细节水平需要一个重量级的提取器。• 将提取、分析和可视化工具紧密集成在一个单一、一致、易于使用的环境中对于接受是至关重要的。许多用户不会接受复杂工具的陡峭的学习曲线,而他们准备好尝试点击式的容错界面。构建一个符合所有这些要求的可扩展解决方案是相当困难的。虽然存在几个重量级的C++提取器(参见第2节),但这些工具通常在批处理模式下工作,并且没有公开细粒度的API,允许它们集成到交互式环境所需的复杂控制结构中。此外,以有效的方式对提取的事实实现一组开放的自定义查询是相当困难的。最后,大多数这样的提取器都是封闭源代码的,这使得它们的修改是不可能的。出于这些原因,我们决定将IRE设计基于我们自己构建的重量级C++事实提取器。整个IRE由这个事实提取器、一个查询和度量计算引擎以及几个数据视图组成。所有这些组件都通过一个中央事实数据库进行通信(图1)。在下面的部分中,我们将描述这些组件中的每一个3.2事实数据库事实数据库包含提取器直接从源代码中产生的原始事实,以及查询和度量引擎在分析和逆向工程过程中产生的几个派生事实(第12节)。3.4)。数据库充当中央存储库,由各种组件读取和写入在IRE(图)①的人。数据库实例包含从给定项目的分析中提取的事实。一个项目很像一个make文件,即包含一组源文件,包括路径,#define和语言方言设置。项目描述可以通过解析make文件或VisualC++ XML项目文件自动创建,其技术与COLUMBUS提取器描述的所谓编译器包装非常相似[9]。事实提取器一次分析一个项目的一个源文件(翻译单元)。3.3),它保存数据库中四种数据元素(词法、语法、类型和预处理器)的信息每个数据元素都被分配了一个唯一的id。数据库被构造为一组二进制文件,每个翻译单元一个,以及一组允许在每个文件中通过id引用元素的映射。A. Telea等人/理论计算机科学电子笔记233(2009)143147Fig. 1. SSOLID FX的数据流架构IRE组件通过轻量级的事实ID集(称为选择)相互通信,这类似于SQL数据库中的表视图。在解析源代码期间完成的数据库创建是静态分析中最耗时的部分。在这个过程完成后,查询和可视化只修改选择,这是一个可以以交互速率完成的过程(第3.4,3.5节)3.3C++解析如3.1节所述,我们的SOLIDFX环境使用了自己构建的C和C++重量级分析器。我们基于ELSA,一个现有的C++解析器设计使用GLR语法[17]这个分析器。在生成所有可能的输入替代的解析森林的解析器之上,ELSA添加了复杂的类型检查、范 围和 符号 查找 规则 , 这些 规则 消除 了输 入的 歧义 , 以生 成注 释的 树 图(ASG)。ASG包含两种类型的节点:基于GLR语法的抽象语法树(AST)节点;以及类型节点,其对在消歧期间创建的类型信息进行编码,并且附接到对应的AST节点。虽然功能强大,ELSA缺乏在交互式环境中使用的分析器所需的几个功能(第3.1节)。 其最重要的限制如下。首先,ELSA需要预处理的输入,因此没有预处理器事实148A. Telea等人/理论计算机科学电子笔记233(2009)143被提取出来。此外,缺少代码级可视化(第3.5节)所需的标记级信息,例如精确(行,列)位置。第二,错误恢复缺乏,因此不正确的代码会导致解析错误。第三,输出不能被过滤或查询特定的事实。我们扩展了ELSA以消除所有这些限制[3]。我们的事实提取器分为五个阶段(见图2)。首先,解析器、预处理器和预处理器过滤器并行操作。预处理器读取输入文件,并输出一个富含(行,列)位置数据的令牌流。为此,我们可以使用一个标准的C预处理器,例如Boost或libcpp库提供的预处理器),修补到输出令牌位置以及令牌。图二、SOLID FXC++解析器的体系结构(主要组件以粗体显示解析器在执行reduc- tions并构建AST时从预处理器读取令牌流。我们在这里使用ELSA解析器,我们扩展它来处理不正确和不完整的输入,如下所示。当遇到解析错误时,我们将解析器切换到所谓的错误恢复规则,该规则将所有传入的to- kens匹配到相应的右括号(如果错误发生在函数体或类声明范围内)或右括号(如果错误发生在方法,命名空间或全局声明范围内)。除了跳过错误的代码,我们还从解析树中删除了相应的部分。结果就好像包含错误的声明或函数体不在输入中一样。这种方法只需要在ELSA的C++ GLR文法基础上增加6条额外的文法规则。我们的方法,错误处理语法规则按需激活,类似于[12]建议的混合解析策略。 与ANTLR相比,我们的方法介于ANTLR总而言之,我们相信我们的设计很好地平衡了实现的简单性和错误恢复的良好粒度解析阶段,增加了错误恢复,其次是原来的AST dismbiguation和类型检查实现的ELSA解析器。在这一步之后,我们过滤提取的事实(预处理器、AST节点和类型节点),只保留源自项目源文件或从项目源文件引用的事实A. Telea等人/理论计算机科学电子笔记233(2009)143149(第3.2节)。换句话说,过滤阶段消除了所有存在于所包含的报头中但未被所分析的源中包含的AST节点引用的AST节点。这消除了包含头中包含的所有声明和预处理器符号,这些声明和符号在源代码中没有引用过滤解析后的输出对于性能和可伸缩性至关重要,因为它可以将输出减少一到两个数量级。最后,过滤后的输出使用自定义二进制格式写入文件总而言之,在事实提取器实现期间所做的几个设计选择,即使用具有高度优化的C编写核心的ELSA解析器;在全局声明和函数/类范围级别提供轻量级错误恢复;从解析器输出中过滤未引用的符号;并以优化的二进制格式编写输出,提供了一个高效的重量级解析器。SSOLID FX的平均速度大约是C olumbus的三到六倍,COLUMBUS是我们可以测试的最快的重量级C++解析器之一,并且可以很好地分析数百万行代码的项目。 对于这样的项目,保存在磁盘上的事实数据库可能需要数百兆字节。然而,正如我们接下来将看到的,查询这样的数据库仍然非常快。3.4查询和查询引擎IRE的第二个主要组件是可定制的查询和度量引擎。查询实现函数(1)S out={x ∈ S in|q(x,p i)= true}也就是说,从满足谓词q(x,pi)的选择S中找到那些元素x,其中pi是查询特定的参数。查询引擎是作为一个C++类库实现的,它实现了上述查询接口的几个专门化Q,如下所示。我们的解析器的C++GLR文法中的每个语法节点T都有几个子节点c(T)和几个数据属性a(T)。例如,一个方法节点有一个签名,一个函数体子函数,和一个“virtual”布尔属性。 对于每个这样的节点T,我们生成一个查询节点,专门用于检查属性a(T)的值和/或调用c(T)的查询子节点。例如,“virtual”属性设置为“true”的函数查询节点将仅匹配声明为virtual的函数的AST节点。查询节点可以组装在查询树中,产生复合查询。查询树可以使用逻辑运算符进一步组合,例如AND、OR、NOT。通过使用访问者模式将给定的查询树q应用于给定的元素x,以在以x为根的AST中找到匹配的那些元素y Q的根的类型上面的机制允许灵活地指定一组广泛的静态查询,范围从“查找所有名为x的变量“到“查找所有从Base继承的类并包含一个方法,该方法恰好抛出两个类型为E 查询树可以被序列化为基于XML的文件格式,从而允许用户4这并不奇怪,考虑到典型的包含100000行预处理后的代码,其中只有一小部分实际使用150A. Telea等人/理论计算机科学电子笔记233(2009)143通过编辑XML文件设计自定义查询和查询库,即无需重新编译查询引擎。 查询及其应用的几个示例 接下来将在第4节中介绍。一个精心设计的查询引擎使得在大型事实数据库上应用查询是非常有效的。首先,由于已解析的AST节点在二进制数据库中通过它们的id进行索引,因此访问大型查询树可以通过访问它们各自的索引集合直接在磁盘上非常高效地完成。查询的结果是选择,即轻量级索引集。结合早期查询终止,一旦代码被解析,这使我们能够在亚秒的时间内查询数百万AST节点的事实数据库可以直接使用查询引擎实现几个代码度量。例如,类型“代码模式P的出现次数“的度量直接作为(2)m(x)= |q(x,p i)|∈ R,则x ∈ S在.这基于搜索模式P的相应查询q的命中数将数值m(x)与选择S中的每个元素x相关联。一些度量,如McCabe图三. SSOLID FX集成逆向环境概述3.5数据视图SOLIDFXIRE的第三个也是最后一个组件提供了一组交互式数据可视化或视图。这些视图作为逆向工程操作的输入和输出:用户可以选择视图中的元素并传递它们A. Telea等人/理论计算机科学电子笔记233(2009)143151作为对诸如查询或度量引擎之类的各种操作的输入,其输出可以进一步用作视图的输入图3显示了我们为IRE开发的主要数据视图项目视图允许用户设置事实提取项目,就像在Visual Studio或Eclipse中设置构建项目一样。C++解析器创建的事实数据库文件显示在输出视图中。选择视图显示事实数据库中可用的所有选择每个选择的外观可以在这里定制,即可以指定它是否可见,如果可见,如何为其元素着色(如下面所讨论的)5.查询视图显示了基于XML的查询库中所有可用的查询(第3.4节)。为了执行查询,例如例如,在我们的示例中,在查询GUI中的n的值,并在选择视图中点击要执行查询的选择。查询的输出会自动作为一个新的选择添加到选择视图中。一个单独的视图,称为选择监视器,显示选择视图中当前活动选择中的所有代码元素,以及它们的计算度量。基于所谓的“表透镜”技术,使用文本和彩色条形图的组合显示度量放大时,表镜头的行为就像一个普通的Excel表。当缩小时,每一行被缩小为一个像素行,该像素行被着色和缩放以显示数据值,从而整个表被缩小为一组垂直图。代码视图显示所需文件中的实际源代码。可见选项中的代码以相应选项的颜色突出显示,从而使人们能够发现特定事件的发生。构造这样的突出显示很容易,因为我们有每个AST节点的确切(行,列)位置和解析阶段的预处理器指令(第二节)。3.3)。就像选择监视器一样,代码视图可以通过减小字体大小来缩小,从而允许人们比使用标准编辑器查看更多的代码UML视图是显示UML类图的自定义视图。图本身是使用查询从事实数据库中提取的,这些查询搜索类、继承关系和关联。后者可以定义为函数调用、变量使用或类型使用。 提取的图表可以手动布局,也可以使用GraphViz库[1]或我们开发的自定义图形布局库自动布局。此外,类和方法度量可以使用缩放和着色的图标绘制在布局图的顶部,以显示度量值,遵循[27]中描述的技术的扩展。 相结合 是执行各种类型的代码质量和模块化评估的强大工具(参见第4节)。除了这些内置的视图,外部可视化工具可以通过编写适当的数据导出器集成到我们的IRE中。 图3中的插图示出了这样的外部视图,其使用SQL Lite数据库浏览器可执行文件,无需修改,以可视化选择中的数据,即代码元素id、它们的实际代码以及在其上计算的度量,通过5我们建议您以全彩色方式查看本文档152A. Telea等人/理论计算机科学电子笔记233(2009)143一个数据输出者这种类型的集成使我们能够通过重用几个现有的软件分析和可视化工具来扩展我们的IRE,并使用最少的资源。当事实数据库和视图之间的交互相当松散时,以及当要传递给视图的数据量是有限的,与内置视图相比,内置视图在细粒度级别大量访问事实数据库。4应用我们现在用几个工业项目中实际使用的例子来说明S solid FX IRE。在所有这些情况下,分析的C++代码都是由第三方开发的,在分析之前,我们并不熟悉代码或其目的。与利益攸关方一起讨论了分析结果,主要是使用数据视图。 一个典型的分析会话从最初的代码移交到结果可用需要几个小时。一个完整的代码库评估通常需要三到六次这样的会议,在后面的会议中,越来越细化的问题和假设将通过对代码库中简化部分的具体查询4.1发现复杂性热点在第一个应用程序中,我们研究了wxWidgets代码库的复杂性,这是一个流行的C++GUI库,拥有超过500个类和500个Kind [21]。在提取之后,我们查询所有函数定义并计算它们的几个度量:代码行(CLOCK),注释行(CLOC),McCabes圈复杂度(CY CLO)和C风格转换表达式的数量(CAST)。接下来,我们通过文件对函数进行分组,并使用选择监视器小部件按照CY CLO图4底部显示了这个小部件的缩小快照,重点是两个文件A和B。每个像素行显示一个函数的度量。文件B顶部的红色长条表示系统中最复杂的函数(表示为f1)。我们还看到,f1也是最好的记录(最高的CLOC),最大的(最高的CLOCK),有趣的是,在前两名的C-cast(CAST)。显然,f1在wxWidgets中是一个非常复杂和重要的函数。双击f1的表格行打开一个代码视图,显示所有选定的函数定义和我们点击的f1映射(图10)。第四,也可以看视频)。代码视图中的函数被着色以同时显示两个度量,使用蓝色到红色的颜色映射:CY CLO度量(突出显示填充颜色)和CAST度量(突出显示框架颜色)。我们看到f1的车身和车架都是红色的,也就是说,它既复杂又有很多造型。在选择监视器中,我们还看到具有最多类型转换的函数f2(位于文件A中)也非常复杂(高CY CLO),但几乎没有注释(低CLOC)。6一个显示SSOLID FX使用的视频也可以在www.solidsource.nl/video/SolidFX/SolidFX.html上找到。7唯一的例外是wxWidgets代码库A. Telea等人/理论计算机科学电子笔记233(2009)143153图四、在wxWidgets代码库中查找复杂性热点这可能意味着需要重新编制文件。4.2模块化评估在第二个应用程序中,利益相关者有兴趣评估商业数据库解决方案的两个给定子系统的整体模块化。在随后的移植过程中,需要将评估作为第一步。为此,我们首先从代码中提取静态调用图,使用自定义设计的查询来查找函数定义和函数调用,并使用基本上再现类工作的技术将调用链接到定义。校准连接器。除了调用图,我们还提取了系统层次结构,可以看作方法-类-文件-文件夹。调用图和层次树接下来由Call-i-Grapher导出和可视化,Call-i-Grapher是一种设计用于显示大型结构图的第三方工具[10]。层次结构显示为一组同心环,其扇区表示方法,类和文件(从内到外)(图5)。 调用关系被绘制为样条曲线,这些样条曲线被捆绑以指示从同一层次祖先出现或去往同一层次祖先的关系。图5左侧所示的子系统是完全模块化的。 我们可以很容易地辨别出它的五个子系统相互调用的方式。边缘颜色指示呼叫方向:呼叫者为红色,被呼叫者为蓝色。例如,我们立即看到,154A. Telea等人/理论计算机科学电子笔记233(2009)143只从数据库调用,emphcore不调用库。 相比之下,图5右边所示的子系统,尽管在方法和类方面具有类似的大小,但模块化程度要低得多。在这里,我们看到两个文件以高度复杂的方式相互调用。几乎看不到结构,因此很难将这些文件轻松地拆分为更小的松散耦合单元,以简化理解和稍后的移植。在这里,我们使用边缘颜色来显示调用类型:绿色表示静态调用,而蓝色表示虚拟调用。蓝色的边缘看起来有些捆绑,所以我们仍然有希望通过这种方式找到一些接口类(主要包含虚函数)图五. 调用图可视化。 模块化系统(左)与4.3维修性评估在第三个应用程序中,我们感兴趣的是评估使用OpenGL,wxWidgets和STL库实现UML编辑器的C++代码库的可维护性。该应用程序是由四个人在几年内开发的[26]。最后一个开发人员,他工作了下半年,最终对整个代码架构没有一个清晰的概念,并且关心代码的可维护性。我们通过从源代码中提取一些类图来开始分析。开发人员根据自己的直觉和洞察力将这些类松散地手动分组到图中。作为关联关系,我们考虑了方法调用和引用类类型。接下来,我们计算了这些方法的三个度量:代码行数(Lines-of-Code,简写为CLOC)、注释行数(Lines-of-Comment-Code,简写为CLOC)和麦凯布圈复杂度(McCabe图6显示了一个提取的类图,使用GraphViz自动布局。类的高度与方法的计数成正比。继承关系被绘制为黑线,而关联被绘制为浅灰色线(为了减少视觉混乱)。在这张图上,架构师沿着模型-视图-控制器模式识别出所考虑的代码库的三个主要子系统:数据模型,包含主要的应用程序数据结构;可视化核心,包含控制功能;以及可视化插件,A. Telea等人/理论计算机科学电子笔记233(2009)143155支持渲染(查看)功能。子系统本身通过使用所谓的感兴趣区域技术(在[4]中详细描述),用模糊形状的轮廓包围其包含的类来可视化。 这些感兴趣的领域没有重叠,这表明所考虑的子系统是相当解耦的,这表明了良好的可维护性。此外,我们看到大量使用几个STL类,主要用于数据模型。 这不会造成任何维护问题,因为从一开始就决定在系统实现中使用STL,而STL是稳定且文档齐全的软件。在类图标的顶部,使用彩色条形图可视化计算出的CITY和CY CLO长的红色水平条表示高值。细的蓝色条表示低值。在每个类中,条形图按CY CLO度量的降序排序从图6的顶部看,我们很快发现了可视化插件子系统中的一个异常类,标记为X这个类在整个系统中具有最高的CY CLO值和最大值,并且还有许多方法。所有其他类别的CY CLO和CY CLO值相对较小,如细条所示。图6底部显示了可视化插件的放大视图。排序后的条形图,加上文本工具提示(图中未显示),使我们能够快速定位整个系统中最复杂的方法,如X类。最复杂的方法的McCabe值为40,非常大。仔细看X的代码,我们后来发现它确实非常复杂。然而,该图还向我们展示了类X不是直接从可视化插件外部引用此外,首席开发人员认为这个类包含他自己的代码,而这些代码确实还没有被清理和重构。因此,尽管维护这个类确实很难,但这个问题不会传播到整个系统,而是保持在插件内。总体而言,评估认为整个系统相当可维护。4.4一种复制粘贴模式到目前为止,所呈现的示例已经显示了我们的IRE在执行代码库的高级别、全局评估中的使用。然而,SSOLID FX也可以用于更细粒度的分析,如第四个也是最后一个应用程序所示。在这里,我们研究的是同一个UML编辑器,它是第二节中可维护性分析的主题。四点三我们现在使用UML视图放大图形呈现子系统类的子集。渲染子系统由橙色轮廓(图7)表示,使用感兴趣区域可视化技术,该技术已在第2节中介绍。四点三 我们显示了JavaScript和COM指标,并按JavaScript对方法进行排序-因此,类图标中最上面的方法是最大的,而最下面的方法是最小的。在呈现子系统中,我们看到一个较小的类集合,它们通过继承而相关,并且也具有非常相似的度量模式,如度量条的长度所示。图7中的暗填充感兴趣区域对这些区域进行了标记。 考虑到继承关系,它们看起来是一个以类R为根的三级类层次结构。为什么这些类会表现出如此相似的度量模式?这一点乍看起来很有趣,所以我们开始浏览类和方法名,使用156A. Telea等人/理论计算机科学电子笔记233(2009)143见图6。可维修性评估。模型-视图-控制器架构视图(顶部)。包含最复杂类的子系统的放大视图(底部)UML视图的工具提示功能,以获得更多的洞察力。过了一段时间,一个解释出现了:这些类实现了所研究的UML编辑器支持的不同的度量字形(例如,饼图,彩色条,彩虹色条,3D条等)。 具体来说,这些类都实现了MetricGlass接口(图7中的类R),它只有几个方法,例如draw()。当我们在Code视图中查看它们的实际代码时,R的所有子类都具有如此相似的度量的原因变得显而易见:它们展示了与基类R几乎相同的代码片段。我们与负责这些类的开发人员讨论了这个发现(他没有参与这里描述的评估),他告诉我们,这些类是通过复制粘贴类R的代码并进行一些小的局部修改来编码的,主要是在draw()方法中。这个分析显示了度量可视化的一个有趣的附带用途:与关系(例如继承)一起,度量可视化可以用作复制代码的第一个指示器,吸引用户注意潜在的复制和粘贴事件。检测这些事件在许多维护场景中是有趣的,例如调试、重构、迁移、移植和文档。我们的集成(IRE)解决方案的有用性变得显而易见,因为如果没有交互式度量和UML可视化的紧密集成,以及详细的代码视图的补充,这里的文档是不可能的。A. Telea等人/理论计算机科学电子笔记233(2009)143157图第七章类层次结构中复制粘贴模式的识别5讨论SOLIDFX是一个成熟的产品,能够处理数百万字节的代码库。早在[24],在众多的试点项目中,我们注意到, 所提出的可视化分析技术的接受是建立分析项目的高难度、一组混合工具的陡峭的学习曲线以及为了使用工具集而编程(只要是脚本)的需要的相对高成功率 S固体外汇在最近的几个项目似乎是由于高集成其功能,在统一的界面下呈现,并有可能以最少的(或没有)编程执行复杂的分析。在提取阶段,使用IRE并不比使用脚本化的命令行工具更有效。然而,对于探索阶段,IRE及其紧密的工具集成比单独使用相同的工具,通过小脚本和数据文件连接更有效率。逆向工程和代码评估场景本质上是迭代的和探索性的,因此它们完美地映射到重复的选择、查询和交互式可视化操作。考虑将我们的IRE解决方案扩展到现有的IDE工具(如Eclipse或VisualStudio)是很有吸引力的。在这两种情况下,主要的问题是关于一个有效的重量级解析器的可用性,该解析器也可以细粒度访问其事实数据库。最近在这个方向上迈出的一步是CDT,一个用于Eclipse的开放C/C++开发工具包[5]。CDT类似于目标,并且松散地具有与SSOLID FX相同的架构,尽管处于更早的整合阶段。Vi- sual Studio内置了正确类型的解析器基础结构支持,因此是一个很好的候选者。然而,目前,解析器API还没有158A. Telea等人/理论计算机科学电子笔记233(2009)143充分开放(ed)以提供此处讨论的功能所需的细粒度访问类型。6结论介绍了一个集成的C和C++逆向工程环境Solid FX的设计。SOLIDFX将重量级的C++解析器与事实数据库相结合,以支持细粒度访问,开放式查询和度量引擎,以及几个结合代码,度量和图表的可扩展可视化。 由于这些工具的高度集成,SSOLIDFX使用户能够像传统的IDE软件开发一样轻松地进行逆向工程。介绍了IRE的几种典型应用我们目前正在努力在几个方向上扩展SSOLID FX。可以从基本事实中提取细化的静态信息,例如控制流程和数据依赖图,从而进行更复杂和有用的安全分析。其次,我们正在努力实现一些预定义的即用型分析包,例如检查MISRA C标准[19],从而使SSOLID FX的使用更加高效和简单。确认我们非常感谢匿名评论者对我们改进应用场景选择的意见。这里介绍的部分研究得到了ITEA Trust4All欧洲面向组件软件架构研究项目的资助[11]。引用[1] 在T. GraphViz。2007. www.graphviz.org网站。[2] I.巴克斯特角,澳-地Pidgeon和M. Mehlich DMS:用于实际可扩展软件演化的程序转换。 在proc ICSE,第625-634页,2004 年。[3] F. Boerboom和A.詹森大型c++代码库的事实提取、查询和可视化。2006.埃因霍温理工大学硕士论文。[4] H. Byelas和A.泰莱娅软件架构图中感兴趣区域的可视化。在Proc. SoftVis,第20-28页。ACM Press,2006.[5] CDT团队。 C/C++开发工具包。 2007年 www.eclipse.org/cdt网站。[6] M. L. Collard,H. H. Kagdi和J. I.马来语一个基于XML的轻量级C++事实提取器。在IWPC程序中,第134IEEE Press,2003.[7] S.迪尔软件可视化-可视化软件的结构,行为和演化。Springer,2007年。[8] S. Eick,J. Ste Ewen,and E.萨姆纳Seesoft -一个可视化面向行的软件统计的工具。IEEE Trans. Soft.Eng. ,18(11):957[9] R. 费伦茨岛 Sik et,和T. 金奥特从两个世界的原始资料中提取事实。 在P roc. ICS M,2004年。[10] D.霍顿层次边束:层次数据中邻接关系的可视化。在Proc. InfoVis,第741-748页[11] ITEA。Trust4All研究项目。 在www. 赢了个周二nl/trust 4all,2007年。[12] G. 知道了,B。 等一下,M。 Dagenais和E. 梅洛 在缺少声明的情况下调用C++。 在Proc. IWPC,第114-122页,1999年。[13] M. 兰扎CodeCrawler-多度量视图的实际应用。 在proc ASE,第394-395页,2004 年 。[14] M. Lanza和R. 马里内斯库面向对象系统设计实践--用软件设计来描述、评估和改进面向对象系统的设计。Springer,2006.[15] Y. 林河,巴西-地C. Holt,和A.J. 马尔顿事实提取器的完整性 在proc WCRE,第196-204页,2003年。A. Telea等人/理论计算机科学电子笔记233(2009)143159[16] G. Lommerse,F.诺辛湖Voidian和A.泰莱娅 可视化代码导航器:一个交互式工具集源代码调查。 在proc InfoVis,第24-31页,2005 年。[17] S.麦克皮克Elkhound:一个快速,实用的glr解析器生成器。加州大学伯克利分校计算机科学系。Tech.报告UCB/CSD-2-1214,12月12日。2002年。[18] P. Mihancea,G.加内亚岛韦雷比角Marinescu和R.马里内斯库McC和Mc#:统一的C++和C#设计事实提取工具。 在proc SYNASC,第101104页,2007年。[19] MISRA协会。C语言在关键系统中的使用指南。 2008. www.misra-c2. com.[20] T. Parr和R. 阿广ANTLR:一个谓词LL(k)解析器生成器。 软件-实践和Experience,25(7):789[21] J. Smart,K. Hock和S.乔莫使用wxWidgets进行跨平台GUI编程。Prentice Hall,2005年。[22] SolidSource BV. SOLIDFX产品信息。 2008. www.solidsource.nl/products网站。[23] M. A. 商店,K。 Wong和H. A. 穆勒 程序理解是如何检验程序员是如何理解程序的?计算机程序设计科学,36(2):183207,2000.[24] A.泰莱娅一个开放的可视化逆向工程体系结构。在管理企业信息系统的发展和维护(CH。9),第211-227页。Idea Group Inc.,2004年。[25] A.泰莱娅结合扩展表透镜和树图技术可视化表格数据。在Proc. EuroVis,第5158页,2006中。[26] A. Telea,M.特梅尔角Lange和H.拜拉斯AreaView:一个结合UML图和度量的编辑器。在www. 赢了个周二nl/~alext/ARCHIVIEW,2008.[27] M.特梅尔角Lange,A. Telea和M.肖德龙可视化探索组合的架构和度量信息。在Proc. VISSOFT,第21-26页[28] M. van den Brand、P. Klint和C.维尔霍夫再工程需要泛型编程语言技术。ACM SIGPLAN Notices,32(2):54
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 探索数据转换实验平台在设备装置中的应用
- 使用git-log-to-tikz.py将Git日志转换为TIKZ图形
- 小栗子源码2.9.3版本发布
- 使用Tinder-Hack-Client实现Tinder API交互
- Android Studio新模板:个性化Material Design导航抽屉
- React API分页模块:数据获取与页面管理
- C语言实现顺序表的动态分配方法
- 光催化分解水产氢固溶体催化剂制备技术揭秘
- VS2013环境下tinyxml库的32位与64位编译指南
- 网易云歌词情感分析系统实现与架构
- React应用展示GitHub用户详细信息及项目分析
- LayUI2.1.6帮助文档API功能详解
- 全栈开发实现的chatgpt应用可打包小程序/H5/App
- C++实现顺序表的动态内存分配技术
- Java制作水果格斗游戏:策略与随机性的结合
- 基于若依框架的后台管理系统开发实例解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功