开篇:润墨网以专业的文秘视角,为您筛选了一篇基于源代码挖掘的软件质量改进方法研究范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!
摘要:代码搜索引擎(code search engines, CSE)的产生和互联网上日益增加的开源代码工程,使得软件开发人员在软件开发的过程中可以大量的重用已有的源代码。然而大部分开发人员使用CSEs只是简单完成相关代码搜索。该文给出了一种通用的范型挖掘过程模型,能够充分利用CSEs,通过挖掘源代码范型保证重用代码的质量,并详细的说明了该范型挖掘过程模型在三个方面辅助软件质量改进。
关键词:代码搜索;代码挖掘;软件质量改进
中图分类号:TP335文献标识码:A文章编号:1009-3044(2009)34-9771-02
Improving Software Quality Based-on Code Mining Technology
CHU Yan-ting1, WANG Li-qiong2
(1.School of Computer and Technology, University of South China, Hengyang 421001, China; 2.School of Economics & Management, University of South China, Hengyang 421001, China)
Abstract: A amount of open source code is available on the Internet and various code search engines (CSE) are available to serve as a means for searching in open source code. However, usage of CSEs is often limited to simple tasks such as searching for relevant code examples. In this paper, we present a generic model that can be used to improve software quality by exploiting CSEs. We present three example software development tasks that can be assisted by our life-cycle model and show how these three tasks can contribute to improve the software quality.
Key words: code searching; code Mining; improving software quality
随着互联网技术的飞速发展和源码开放运动的兴起,网络上越来越多的优秀的源代码可以被人们下载、学习和使用。以目前最大的开源社区为例,该社区共享了179,518个开源工程,拥有200万的注册用户以及数量更为庞大的匿名用户群。为了方便人们随时获得和使用网络上的源代码资源,互联网上出现了很多以搜索源代码为目的的搜索引擎,例如Google code search,Krugle,Koders,Sourcerer,Codase等[1]。通过这些代码搜索引擎,程序开发人员可以很方便、快捷的获得他们所需要的源代码。然而,由于网络上代码的质量参差不齐,如果程序开发人员只是简单的将从网络上获取源代码直接使用到所开发的程序中,或者仅对这些源代码进行简单的修改的话,会给所开发的软件的质量带来隐患,并且加重了软件测试和维护的开销。
为了解决直接使用网上搜索到的源代码所带来的问题,充分利用网络上丰富的源代码资源,该文给出了一种综合代码搜索引擎的代码收集过程和在已收集代码中挖掘通用API应用范例过程的源代码挖掘使用模型,称为范型挖掘过程模型。这个模型能够在以下三个方面辅助软件质量的改进:1)通过自动推导编程规则学习API用法;2)使用挖掘模式发现在软件中的潜在缺陷;3)对所发现的软件缺陷进行定位。
1 范型挖掘过程模型
范型挖掘过程模型结构如图1所示,过程包含搜索和挖掘两个主要阶段,分别完成从互联网获取源代码并进行相应处理阶段,从处理过的源代码中挖掘通过范型阶段。下文详细介绍模型中两个阶段的工作。
1.1 搜索
范型挖掘过程模型的搜索阶段包括查询构造和冗余消除两个任务。
在查询构造任务中,主要是通过将API的名称作为搜索项构造所需的查询。例如,构造查询“lang:java org.apache.regexp.RE”,意图是在Google code search中收集与RE类相关的代码实例。CSEs根据我们的查询返回了大约2,000条相关的代码实例。根据CSEs的使用经验,与对应CSE相关的查询格式对查询结果的相关性起了决定作用,查询结果的相关性是指查询结果中包含所需查询的API的程度。如果查询格式构造的不好,GCEs可能会产生大量不相关的代码实例。例如,要搜索与fopen API 相关的代码实例,在GCEs中建立基础搜索查询设为“lang:c fopen”。这个搜索会产生大约752,000个代码样本。当查询转换为“lang:c file:.c$ [\ s \*]fopen [\ s]?\(”时,GCEs会返回689,000个代码样本。在两者各自返回的前50个代码实例中,后者产生的搜索结果中相关代码实例的数量是前者的两倍。由于GCEs所产生的代码实例的相关性在通用模式挖掘中起了十分重要的作用,所以即使是程序员可以在搜索阶段或者代码挖掘阶段手工去除不相关的代码实例,由于这样会极大的增加程序开发的工作量,代码实例的相关性对于程序挖掘也是依然非常重要。
冗余消除任务,是根据对CSEs返回的代码样本数据的观察,可以发现返回结果中有很多的重复样本。如果2个样本属于同一个源文件或者同一个工程,就认为这两个样本是重复样本。例如,在CSEs中根据“lang:java org.apache.regexp.RE”搜索出的2,000个代码样本中源文件,其中JakartaRegexpRegexp.java一共出现了13次。在这13个拷贝中,有5个不同的版本,有5个拷贝对应这些版本,剩下的 8个拷贝则是这五个版本的冗余拷贝。
另一方面冗余代码的存在或者说一个代码实例多次出现重复能够表明这个代码实例被广泛使用,而被广泛使用的代码实例比没有被复制过的代码实例更加可信。另一方面,被复制或者有多个版本复制的有倾向性的代码能够帮助挖掘程序挖掘出通用范型。
1.2 挖掘
挖掘阶段主要包括类型解析,抽取候范型和范型推导三个任务。这三个任务是对所收集的代码的预处理过程。
在类型解析任务中,将解析对象的类型,例如解析所收集代码中方法调用所产生的返回对象的类型。这个模型中不使用传统的方法进行分解和解析对象类型,主要原由于通过CSEs收集的代码实例通常是不完整的,不可编译的,所以在我们的模型中不能采用传统的对象类型抽取和解析技术。这里所说不完整代码实例是指代码本身完整,而代码实例运行所依赖的其他源文件不可用。在本阶段的任务中使用了部分程序分析技术,利用反汇编的启发式方法解析对象类型。以图2中的程序为例:在java程序中,通常可以从类的声明中提取完整的类和接口属性名称。然而从网络中获取的这个程序代码实例片段是不完整的,因此需要从程序的import声明中推导出完整的属性名称。比如从01行程序的import声明中可以推导出ArrayList类。需要说明的是使用启发式的方法并不是总是有效的[2],例如对于05行程序启发式方法无法推导出Iterator类是否也是一个完整的属性名称,因为在02行程序中使用了*替代了Iterator。不过总的来说,基于启发式方法的对象类型解析还是相当有效的。
抽取候选范型这个任务是指通过分析CSEs所收集的代码实例,抽取出程序的候选范型。候选范型包含了API惯用信息。例如图2中的代码实例,从这个实例中可以抽取出的范型是:Iterator.next 之前必须要执行Iterator.hasNext的布尔判断。
在范型推导这个任务中,使用频度子序列挖掘等技术挖掘候选范型,用以得到API的通用使用范型。在程序挖掘的三个任务中抽取候选范型和范型推导是两个关键的任务,然而从收集的代码实例中解析类型的任务也是一个重要的工作。
2 范型挖掘过程模型应用
使用范型挖掘过程模型,可以在以下几个方面提高软件开发的质量:
开发阶段:应用范型挖掘过程模型挖掘范型,能够帮助程序员更好的完成软件开发阶段的任务。这些挖掘出的范型提供APIs通用的使用场景,这为如何重用APIs提供了有用的指导,并且可作为所写代码的注解使用。
验证阶段:在此阶段应用范型挖掘过程模型分析程序,能够发现异常行为。挖掘出来的范型通过处理可以得到APIs的详细使用说明书和并对违反该范型的程序进行分析并报错。例如:为标准C语言库(stdio.h)中的fopen API挖掘出的范型如下:
API方法:fopen
检查返回状态值
状态类型:NULL-CHECK
在前面的范型描述中,收集的代码实例中大部分都包含了fopen方法调用的NULL状态检查的返回值。这个范型能够用于发现那些在程序底层分析中使用了fopen方法调用但是却丢失了状态检查而产生的缺陷。这个范型挖掘过程模型能够在软件验证任务中发现错误。
维护阶段:应用范型挖掘过程模型挖掘范型还可以在维护阶段用于缺陷定位。例如下面这个Iterator.next方法的相关范型。
API 方法:Iterator.next
检查Iterator.hasNext的返回状态值
状态类型:BOOLEAN-CHECK
在前面提到了Iterator.next方法使用之前都要执行Iterator.hasNext方法进行布尔值检查,如果不执行布尔值检查会导致NoSuchElementException。验证任务完成的是在程序分析时发现范型的错误,根据先前的范型可以进行错误定位。例如可以通过在Iterator.next方法使用之前插入Iterator.hasNext方法的布尔值检验自动对执行缺陷定位。
3 总结
重用已有代码是软件开发过程中程序员经常使用的方法,为了改进在软件开发过程中程序员对源代码的机械重用,该文中给出的基于搜索技术和挖掘技术的范型挖掘过程模型,并详细说明了该模型中两个主要阶段,以及从源代码中挖掘通用范型的处理技术。利用该范型挖掘过程模型可以从三个方面改进软件开发的质量,在实际的软件开发中应用也取得了很好的效果,解决了机械重用源代码带来的很多问题,对保证软件的质量起到了明显的作用。
参考文献:
[1] Sushil B,Trung N,Erik L.Sourcerer:a search engine for open source.code supporting structure-based search[C].Proc OOPSLA Companion,2006:681-682.
[2] Agrawal R,Srikant R.Fast algorithms for mining association rules in large databases[C].Proc VLDB,1994:487-499.
[3] 于秀梅,梁彬,陈红.软件源码上的数据挖掘应用综述[J].计算机应用,2009(9):2494-2498.
[4] LIND I C.Mining patterns and violations using concept analysis[D].Saarbrucken,Germany:Saarland University,2007.