论文部分内容阅读
软件缺陷普遍存在于软件系统中,影响其可靠性。自动化的软件缺陷检测方法可以帮助人们尽早发现缺陷的存在。按照实现原理的不同,目前主要的软件缺陷检测方法有基于静态分析的缺陷检测技术和基于统计学习的缺陷预测技术。前者通过对软件程序语法和语义特征的静态分析来发现其中的缺陷;后者基于机器学习的方法,利用度量元和历史缺陷数据预测存在缺陷的软件模块。另一方面,对于软件缺陷的实证研究,可以帮助人们全面理解软件缺陷的各种特性,有助于改进缺陷检测工具的设计,为软件质量控制提供参考和帮助。目前,软件缺陷检测与分析方法依然面临一些困难和挑战:1)静态缺陷检测工具受制于软件语言和平台而难以通用,由于非开源政策,iOS这样的热门平台上的检测工具却很少,相关研究也不够充分;2)现有缺陷预测方法很多,然而缺乏全面合理的性能评估体系;3)非开源软件多应用在重要领域,对其缺陷的实证研究却很少,其缺陷特性人们无从了解。 针对上述困难和挑战,本文重点研究了软件缺陷检测与分析方法,提出了一种全新的基于静态模型检验的安全缺陷检测技术,并对软件缺陷预测方法的性能评估和非开源软件缺陷的实证分析展开研究,主要工作和贡献如下: 1.针对移动软件安全缺陷,即安全漏洞的检测问题,本文结合软件逆向工程、静态分析、模型检验等技术,提出了全新的iOS安全漏洞检测方法。由于苹果公司的非开源政策,使得面向iOS这一热门移动平台的软件安全漏洞检测研究非常少。已有的工作,使用可达性分析检测iOS软件漏洞,但扩展能力较差,仅能用以检测有限种类的软件漏洞。本文采用标签迁移系统(LTS)对软件程序进行建模。与已有相关工作不同,首次提出了将系统库和GUI定义纳入软件程序建模,增加了模型的完整性,以使得模型对于软件行为的描述更为准确。同时,为解决模型检验状态空间爆炸的问题,本文采用了三种抽象技术,以减少模型的状态数量。通过对CTPL的扩展,本文提出了更适合表示软件安全属性的逻辑语言SE-CTPL,以确保检验方法的灵活性和可扩展性,从而可以对多种安全性质进行描述。基于上述方法,本文实现了一个自动化检测工具VeriForge,并对实际发布的iOS软件进行检测,找到了多个安全漏洞,从而证明了方法的有效性。 2.首次提出了使用大规模指标集,对软件缺陷预测方法的性能进行评估。目前人们在评估比较缺陷预测方法的时候,往往只是选择某些特定的评估指标,且缺乏选择依据,从而导致评估结果存在片面性。为此,本文选取包括recall、F-measure、G-mean和AUC在内的14个评估指标,对6个重要且常用的预测方法,即朴素贝叶斯、决策树、逻辑回归、K阶段近邻、随机森林和贝叶斯网络,进行性能评估。本文选取了10个软件缺陷数据集进行实验分析,这些数据集一共包含了5305个实例。对14个指标的综合分析结果显示,贝叶斯网络在绝大部分的数据集上表现出了更好的性能。其中,在9个数据集中,贝叶斯网络取得了最好的recall、FNR、G-mean1和balance等指标值;在7个数据集上,它取得了最好的F-measure和J-coefficient指标值。此外,本文还通过聚类方法,研究指标之间的相关性,得到了{AUC}、{MCC,J-coeff、{precision}、{accuracy,error rate,specificity,FPR}和{G-mean2,F-measure,recall,FNR,G-mean1,balance}5个群组,为将来工作中选取评估指标提供了依据。 3.首次实现了对于金融系统软件缺陷的半自动化的实证研究。由于非开源软件的缺陷数据获取难度大、获取成本高等原因,目前鲜有对于非开源软件缺陷的实证研究工作,这使得人们难以了解非开源软件,尤其是应用于关键领域的非开源软件系统的缺陷特征。为此,通过与某金融机构合作,本文对PMS、β-Analyzer和OrderPro三个金融软件系统的缺陷进行了实证研究,从而更好的理解了非开源的金融软件系统。由于金融软件具有较多模块,且大多依据复杂的业务逻辑而实现,因而系统十分复杂。本文作者从项目的代码库和缺陷报告库中收集数据,随机挑选了300个缺陷报告,并对其进行准确的分类,讨论并分析了缺陷密度、缺陷检测时间分布、缺陷类别分布以及缺陷类别与缺陷严重度之间的关系,深入理解了金融软件缺陷的特性。结果显示,19.00%的缺陷属于内部接口类,17.67%的缺陷属于算法/方法类,15.00%的缺陷属于逻辑类,这三个类别是本文所研究的金融系统中存在最多的三种缺陷。本文的研究结果有助于项目经理、开发工程师和质保工程师检测和管理金融软件系统中存在的缺陷。