8.42 基于编程模式挖掘软件缺陷
软件缺陷种类繁多且新缺陷不断出现、不同缺陷形成的原因各不相同。试图通过直接描述软件缺陷模式来发现软件缺陷非常困难。所幸,由于程序编写过程需要遵循程序设计语言确立的各种编程规范和约定,无缺陷的正常程序大都应与此“正常模式”相符。因此,要挖掘软件缺陷,可以设法对正常程序需要符合与遵循的编程模式进行建模,据此发现与此“正常模式”相违背的潜在软件缺陷。对编程模式的刻画,可通过对软件项目中的源代码以及其他相关非代码数据的分析和挖掘来实现。
从源代码挖掘编程模式
获得程序正常模式描述的最直接方法是基于程序设计语言的领域知识定义出一套模板,然后根据所定义的模板实现软件缺陷的检测[3] 。,然而,该方法对软件缺陷的甄别效果很大程度上依赖于所定义的模板正确性与完备性,需要经验丰富且对当前程序设计语言构造理解深的专家才能定义出正确且相对完备的模板,因此难以在实际中广泛应用。为此,Li et al [4] 提出了自动模板生成。他们假设程序中缺陷是因不慎引入的,缺陷自身的数量远不及正常模式多。因此,通过频繁模式进行挖掘,即可有效发现与描述程序中的正常模式。他们利用编码规则将函数作为项 (item) 进行关联规则挖掘,获得了函数之间使用的耦合关系,据此发现不满足关系的潜在缺陷。Livshitz et al [5] 通过关联规则挖掘从软件的修改记录 (change log) 中挖掘出了函数的成对使用模式 ( 如函数 malloc () 与 free() 通常成对使用 ),据此发现因未成对使用某些函数而造成的缺陷。
从其他数据源挖掘编程模式
仅利用当前软件项目的源代码进行挖掘,有时并不能涵盖所有有用的正常编程模式。例如,在这个软件中仅对某个 API 使用了一两次,因此很难从中挖掘出针对这个 API 的频繁模式。因此,需要利用其他数据来源来辅助对编程规则的挖掘。Taoet al [6] 借助 Google 代码搜索获得大量对该 API 使用的历史记录,并通过对此进行关联规则挖掘获得API 的使用模式与规范。Tan et al [7] 通过挖掘源代码中给出的文字注释,将注释中指明的函数使用规则映射为一组规则模板,基于此发现程序中与注释所指明的函数使用规则不相符的缺陷。