论文部分内容阅读
随着信息技术的不断发展,软件的应用领域愈加宽广,软件规模日益扩大,企业内部的遗产系统和散布于互联网上的开源项目也在不断增加。为了降低软件项目的开发成本,提高软件的开发效率,基于复用和迭代的开发泛型越来越受到欢迎;同时,对于软件质量的要求也在不断的提高,如何保证软件质量也成为软件工程领域的研究热点。
逆向工程技术通过对代码进行分析,抽取软件系统的主要部分,在更高层次对系统进行描述,隐藏不必要的细节,从而帮助用户更好的对系统进行理解、维护和改进。逆向工程工具一般基于代码抽象语法树的中间表示获得控制流图、依赖图、类图等程序结构和关联信息,通过图形化的方式显示给用户。程序结构信息的抽取是逆向工程的基础活动。程序分析和测试在程序的质量保证方面发挥着重要的作用,用于程序验证和缺陷查找的程序分析技术,基于源代码结构的测试用例生成、测试用例排序、测试覆盖率度量等技术,都需要从代码出发,抽取程序结构,并以此为基础进行后续分析。所以,程序结构信息的抽取也是计算机辅助程序分析与测试的基础活动。
当前,在企业级应用、Web开发、桌面开发等不同领域,多种编程语言依据自身特色,发挥着各自重要的作用。而现有的逆向工程与程序分析测试工具多针对单一语言,如Java或C/C++,对很多新型语言的支持不够;很多支持多语言的工具代码复用度低,也没有为针对新增语言的扩展提供支持。针对这些问题,本文通过对Java、C/C++、JavaScript等编程语言进行分析,依据其共有的特点,提出了一种通用代码结构(Common Program Structure)用于保存代码的结构信息,该结构模型忽略了编程语言的细节,有效保存了程序代码结构相关的重要信息。以该通用代码结构为基础,不同编程语言得以共享基于公共结构模型的同一分析程序,从而提高了相关软件工程工具的复用性和开发效率。
本文同时设计实现了对Java字节码、C/C++和JavaScript源代码的结构信息抽取器,抽取器以字节码结构模型或代码抽象语法树为基础,通过对其周游访问,转化为通用代码结构;同时,利用基于通用代码结构的分析程序,实现了分析程序对于多种语言的支持。我们将三个抽取器集成到了PolyFlow代码分析测试平台上,收到了较好的效果。