一种考虑软件补丁的软件可靠性模型研究
- 格式:pdf
- 大小:206.30 KB
- 文档页数:3
总第171期2008年第9期舰船电子工程Ship Electronic Enginee ring Vol.28No.9181 关于软件产品的软件可靠性增长模型的改进及可靠性3杜 翔 沈元隆(南京邮电大学 南京 210003)摘 要 提出改进的关于软件产品的软件可靠性增长模型。
分析了关于软件产品的可靠性增长原模型的特性,指出了原模型的假设与实际情况不相符的方面;在充分考虑补丁对销售后的软件产品的作用下,将Lit tlewood 对软件模型的思想—即在测试初期出现的错误对软件失效的影响大于后期出现的错误对软件失效率的影响—引入到原模型,并提出了改进的关于软件产品的软件可靠性增长模型。
针对所提出的模型,利用测量的数据进行了实际仿真。
关键词 软件可靠性;软件可靠性增长模型;参数估计中图分类号 TN406Imp rovement of Reli abili ty Growt h in Soft ware Prod uct san d t he St ud y of Reli abilityD u Xia ng S he n Yuanlong(Nanjing Universit y of Posts and Telecommunications ,Nanjing 210003)Abs tra ct The impro veme nt of r elia bilit y growt h in software product s is put forwared in this pape r.Firstly ,the per 2fo rmance of reliability growt h in software products is analyzed ,and the diffe rence between t he original model a nd t he real e n 2vironment is pointedt out.Seco ndly ,ba sed on the idea that t he inf luences of e rror on the earlier stage test on t he sof twa re dis 2abled rate overceed that on the la te r ,the improveme nt of relia bility growt h in sof tware p roduct s i s p rese nted.At la ster ,chec 2king computation a re operated on the original and the p rese nted models.Ke y w ords sof tware r eliability ,s oft ware relia bilit y model ,pa rameter e stimation Class N umber TN4061 引言从1972年到目前,为了研究软件可靠性,已经提出一百多种模型,但这其中大部分模型主要是从消除软件中的错误数的角度来研究软件的可靠性模型。
软件可靠性研究及其应用软件可靠性是指软件在给定的条件和一定时间内具有稳定的性能和安全性的能力。
软件可靠性不仅是软件开发过程中的一个重要指标,也是软件应用、维护和升级的关键因素。
本文将介绍软件可靠性研究的背景、内容、方法和应用。
一、背景软件已经成为现代社会最为重要的基础设施之一,其在诸多领域的应用越来越广泛。
然而,与此同时,软件所带来的危机也逐渐显现。
由于软件的复杂性和抽象性,软件本身具有不确定性和难以预测性,造成了软件的错误、故障、漏洞等问题的频繁发生,日益对软件的可靠性和安全性提出了更高的要求。
软件可靠性研究的兴起,是为了应对软件危机,提高软件可靠性和安全性,保障软件应用的稳定和持续。
随着软件工程领域的不断壮大和发展,软件可靠性研究已成为软件工程的核心技术之一。
二、内容软件可靠性研究主要包括以下内容:1、可靠性模型:可靠性模型是一种数学模型,用于描述软件系统的可靠性和故障率等参数,以便分析和评估软件系统的可靠性。
可靠性模型包括统计模型、物理模型、分析模型等。
2、可靠性评估:可靠性评估是用定量的方法评价软件系统的可靠性和安全性,包括可靠性分析、故障树分析、失效模式和影响分析等。
3、软件测试:软件测试是验证软件可靠性和安全性的基本手段,涵盖单元测试、集成测试、系统测试、验收测试等。
4、故障定位和修复:故障定位是识别和定位软件中的故障,修复是根据故障定位的结果,对软件的故障进行修复和改进,以提高软件的可靠性和安全性。
三、方法软件可靠性研究的方法主要包括:1、建模方法:建模是软件可靠性研究的重要手段之一,建模方法可以采用数学建模、统计建模、物理建模等多种方式。
2、仿真方法:仿真是软件可靠性分析和评估的常用方法之一,主要包括蒙特卡罗仿真、离散事件仿真、连续系统仿真等。
3、统计方法:统计方法广泛应用于软件可靠性测试和评估中,以分析和统计出软件的故障率、平均故障间隔时间、可用性等指标。
4、检测方法:检测方法是对软件进行代码级别的检测和分析,以发现软件中的缺陷和错误,包括静态代码分析、动态代码分析等。
安全性测试的测试内容?(用户认证、加密机制、安全防护策略、数据备份与恢复、防病毒系统)安全防护策略?(漏洞扫描、入侵检查、安全日志、隔离防护)数据备份与恢复技术通常涉及那几个方面?(存储设备、存储优化、存储保护、存储管理)基本的防毒技术有哪几部分?(集中式管理、分布式杀毒,数据库技术、LDAP技术应用,多引擎支持,不同操作系统的保护,远程安装或分发安装)基本的安全防护系统测试的测试点?(防火墙、入侵检测、漏洞扫描、安全审计、病毒防治、Web信息防篡改系统)防火墙的测试点?A、是否支持交换机和路由器两种工作模式B、是否支持对HTTP、FTP、SMTP等服务类型的访问控制C、是否考虑到了防火墙的冗余设计D、是否支持日志的统计分析功能,日志是否可以存储在本地和网络数据库上E、对防火墙和受保护网段的非法攻击系统,是否提供多种告警方式和多种告警级别入侵检测的测试点?A、能否在检测到入侵事件时,自动执行切断服务,记录入侵过程,邮件报警等动作B、是否支持攻击特征信息的集中式发布和攻击取证信息的分布式上载C、能否提供多种方式对监视引擎和检测特征的定期更新服务D、内置的网络能否使用状况监控工具和网络监听工具漏洞扫描的功能?漏洞扫描器有几种类型?漏洞扫描功能是自动检查远程或本地主机安全性漏洞,以便于及时修补漏洞。
1、主机漏洞扫描器,在本地运行检测系统漏洞。
2、网络漏洞扫描器,基于网络远程检测目标网络和主机系统漏洞。
定期或不定期的使用安全性分析工具,对整个内部系统进行安全扫描,及时发现系统的安全漏洞,报警及提出补救措施。
病毒防治的测试点?A、能否支持多平台的病毒防范B、能否支持对服务器的病毒防治C、能否支持对电子邮件附件的病毒防治D、能否提供对病毒特征信息和检测引擎的定期更新服务E、病毒防范范围是否广泛,是否包括UNIX、Linux、Window等操作系统安全审计的测试点?A、能否支持系统数据采集,统一存储、集中进行安全审计B、是否支持基于PKI的应用审计C、是否支持基于XML的审计数据采集协议D、是否提供灵活的自定义审计规则Web信息防篡改系统的测试点?A、是否支持多种操作系统B、是否具有集成发布与监控功能,使系统能够区分合法的修改与非法的篡改C、是否可以实时发布与备份D、是否具备自动监控、自动恢复、自动报警的能力E、是否提供日志管理、扫描策略管理、更新管理安全系统防护体系有哪几层?(实体安全、平台安全、数据安全、通信安全、应用安全、运行安全、管理安全)安全性测试方法有哪些?(功能验证、漏洞扫描、模拟攻击实验、侦听技术)功能测试(白盒测试、黑盒测试、灰盒测试)漏洞的类型(拒绝服务漏洞、本地用户扩权漏洞、远程用户扩权漏洞)模拟攻击技术4种类型:A、服务拒绝型攻击(死亡之ping、泪滴teardrop、UDP洪水、SYN洪水、Land攻击、Smurf攻击、Fraggle 攻击、电子邮件炸弹、畸形消息攻击)B、漏洞木马型攻击(口令猜想、特洛伊木马、缓冲区溢出)C、信息收集技术(扫描技术、体系结构探测、利用信息服务)D、伪装欺骗型攻击(DNS高速缓存污染、伪造电子邮件、ARP欺骗、IP欺骗)主动攻击的方式(窃听、电磁/射频截获、业务流分析、截获并修改、重放、伪装、非法使用、服务拒绝、特洛伊木马、陷门)安全机制有哪些?1、数字签名机制2、访问控制机制3、数据完整性机制4、认证机制5、通信业务填充机制6、路由器控制机制7、公正机制请简述系统的安全防护体系中安全系统的主要构成一般包括什么?答:安全系统的主要构成一般包括证书业务服务系统、证书查询验证服务系统、密钥管理系统、密码服务系统、可信授权服务系统、可信时间戳服务系统、网络信任域系统、故障恢复与容灾备份。
基于机器学习的软件漏洞挖掘与修复研究随着现代社会的高速发展和数字化进程的不断加快,软件在我们日常生活中扮演着越来越重要的角色。
然而,随之而来的是软件漏洞的频繁出现,给我们的生活和信息安全带来了巨大的威胁。
为了提高软件的质量和保障用户的数据安全,研究人员们开始利用机器学习技术来挖掘和修复软件漏洞。
一、软件漏洞挖掘软件漏洞挖掘是指通过分析、检测和验证软件源代码或者二进制代码中的漏洞,找出潜在的安全隐患。
机器学习在软件漏洞挖掘中的应用主要包括以下几个方面:1.1 数据预处理在软件漏洞挖掘的过程中,需要大量的源代码或二进制代码作为输入数据。
由于这些数据通常非常庞大、复杂,数据预处理的工作变得尤为重要。
机器学习的技术可以用来处理和清洗数据,比如去除冗余信息、规范化源代码格式等,以便更好地应用于后续的漏洞挖掘工作。
1.2 特征提取在软件漏洞挖掘中,提取恰当的特征是非常关键的一步。
机器学习可以帮助识别和提取源代码中的重要特征,比如函数调用关系、变量的使用方式等。
通过对特征的分析和建模,可以更准确地识别和定位潜在的漏洞。
1.3 学习算法机器学习的学习算法是软件漏洞挖掘的核心部分。
常用的算法包括决策树、支持向量机、神经网络等。
这些算法可以通过分析历史漏洞数据,学习和预测新漏洞的发生概率。
通过这种方式,可以提高漏洞挖掘的效率和准确性。
二、漏洞修复软件漏洞的修复是保障软件安全的重要环节。
机器学习技术在漏洞修复中的应用主要包括以下几个方面:2.1 漏洞修复建议机器学习可以通过分析和学习大量的漏洞修复记录,提供漏洞修复建议。
这些建议可以帮助开发人员快速定位和修复软件中的漏洞,提高软件的安全性。
2.2 自动修复工具机器学习还可以用于开发自动修复工具。
通过训练机器学习模型,可以识别和分析漏洞,并自动生成修复补丁。
这种自动化的修复工具可以大大减少开发人员的工作量,提高软件修复的效率和准确性。
2.3 漏洞预测机器学习还可以用于漏洞的预测。
补丁管理软件的重要性和选用技巧在当今信息技术飞速发展的时代,网络安全问题已日益成为全球关注的焦点。
随着网络攻击的不断增多和演化,保护计算机系统的安全性和稳定性变得至关重要。
补丁管理软件的重要性因此凸显,它们是防止系统漏洞攻击和确保软件及操作系统安全的重要工具。
首先,我们需要了解什么是补丁。
补丁(Patch)是为修复软件或操作系统中存在的漏洞或错误而发布的临时性修订版。
差错可能导致不寻常的行为,包括无响应、系统崩溃、数据泄露等。
高质量的补丁有助于预防攻击者利用已知漏洞入侵您的系统,并维护操作系统的最新性。
那么,补丁管理软件为何如此重要?首先,补丁管理软件可以帮助组织自动检测和部署软件和操作系统的更新。
这对于大型企业来说尤为重要,因为它们通常拥有大量的计算机设备和软件系统需要维护。
手动更新和安装补丁是一项繁琐和耗时的工作,容易出现遗漏或错误。
补丁管理软件的自动化功能可以大大简化这个过程,减少管理工作,并确保所有设备和软件都及时更新,从而保持最佳性能和安全性。
其次,补丁管理软件可以提供实时的漏洞信息。
业内的黑客和攻击者不断试图寻找新的漏洞来入侵系统。
补丁管理软件可以即时提供最新的漏洞信息,并提示管理员应对措施。
这使得系统管理员能够更快地找到并解决问题,从而减少安全漏洞造成的风险。
另外,补丁管理软件还能够帮助组织管理和跟踪已经应用的补丁。
使用补丁管理软件可以简化整个补丁生命周期的管理,包括补丁的审批、测试、部署和监控。
通过集中管理和跟踪补丁,管理员可以更好地了解系统当前状态,及时发现和解决问题。
在选择补丁管理软件时,有一些关键的技巧是需要考虑的。
首先,软件的适应性和兼容性至关重要。
不同的组织可能有不同的操作系统和软件依赖,因此选择一个能支持您当前系统环境和软件版本的软件是至关重要的。
此外,考虑软件的易用性和用户界面设计。
一个直观和简单的界面可以显著提高管理员的工作效率,并降低出错的风险。
另一个重要的因素是软件的安全性和可靠性。
软件项目质量模型构建与预测技术研究随着信息化进程的加速,软件的应用范围越来越广泛。
同时,软件项目的规模也越来越庞大,参与人数众多,因此软件项目的管理和质量控制也日益复杂。
在软件项目开发中,软件质量是至关重要的,它直接关系到软件产品是否能够满足用户需求。
因此,软件质量模型构建与预测技术的研究成为软件开发领域的一个热点。
一、软件项目质量模型构建的基本原理软件项目的质量评估需要一个合适的质量模型,以此来衡量软件项目的质量水平。
软件项目质量模型构建的基本原理是通过分析软件项目开发过程中的各种因素,确定与软件质量相关的关键因素,并据此构建评估模型。
根据软件项目的特点和质量要求,可以从不同的角度出发,构建不同的软件质量模型。
目前,软件质量模型基本上分为两种类型,一种是基于特定的开发模型的质量模型,例如基于CMMI模型的质量模型;另一种是基于开发过程中的关键因素的质量模型,例如基于COCOMO模型的质量模型。
在实际应用中,根据软件项目的特点以及质量要求,选择合适的质量模型来进行软件项目的质量评估。
二、软件项目质量模型中的关键因素软件项目的质量水平不仅与软件本身的质量相关,也与软件开发过程中的各种因素相关。
因此,软件项目质量模型中的关键因素应该考虑到以下几个方面:1.软件性能软件性能是软件项目中最基本的质量因素之一,直接关系到软件产品的稳定性和可靠性。
软件性能指的是软件在运行时所表现出的响应速度、稳定性以及可靠性等方面的表现。
2.软件安全随着计算机技术的发展,计算机安全问题也愈发显得重要。
软件项目的安全性评价主要涉及到软件的功能安全和信息安全。
软件的功能安全主要指的是软件的可靠性、安全性和保密性能,而信息安全主要涉及到软件的安全威胁和安全防护等方面的问题。
3.软件可维护性软件可维护性是指软件项目在开发之后,能够方便地进行维护以及升级等方面的处理。
软件可维护性不仅与软件本身的结构、设计有关,也与软件开发过程中的文档、测试、配置管理等方面的处理有关。
考虑多种类型缺陷的软件可靠性模型研究邱慧;闫相斌;彭锐【期刊名称】《运筹与管理》【年(卷),期】2022(31)4【摘要】本文提出一种考虑多种类型缺陷的软件可靠性模型,并构建了缺陷检测和剔除两个过程的模型。
具体分类情况,可以根据模型的检验方法(拟合准则和预测有效性度量)和模型复杂度来具体决定,如果有测试人员的分类建议或者分类数据,可以结合模型共同决定。
为了说明问题,本文给出四种类型缺陷的具体模型,并对实际数据集进行了拟合。
通过模型比较,验证了多种类型缺陷模型的有效性。
最后,通过构建软件最优发布时间策略对模型进行了应用。
研究结果为软件开发和测试提供了理论参考。
【总页数】5页(P104-108)【作者】邱慧;闫相斌;彭锐【作者单位】运城学院经济管理系;北京科技大学经济管理学院;北京工业大学经济管理学院【正文语种】中文【中图分类】O213.2【相关文献】1.考虑软件不同失效过程偏差的软件可靠性模型2.一多种错误类型的软件可靠性模型3.一种考虑软件补丁的软件可靠性模型研究4.考虑排错过程引进故障的开源软件可靠性模型研究5.从价值的角度考虑软件测试过程能够增加软件的盈利。
对软件测试过程创造的价值进行量化,构造了直观实用的软件测试工作量估算模型,可估算测试阶段的测试工作量和修改缺陷工作量,为制定和调整测试计划提供有用信息。
模型描述了软件测试过程中的各活动与所创造价值之间的关系,并解释了缺陷修改活动依然会引入新缺陷这一常被忽略的事实。
通过一个应用实例证明,该模型有较好的可用性和有效性。
因版权原因,仅展示原文概要,查看原文内容请购买。
基于深度学习的软件缺陷预测模型①陈 凯, 邵培南(中国电子科技集团第三十二研究所, 上海 201808)通讯作者: 陈 凯摘 要: 为了提高软件的可靠性, 软件缺陷预测已经成为软件工程领域中一个重要的研究方向. 传统的软件缺陷预测方法主要是设计静态代码度量, 并用机器学习分类器来预测代码的缺陷概率. 但是, 静态代码度量未能充分考虑到潜藏在代码中的语义特征. 根据这种状况, 本文提出了一种基于深度卷积神经网络的软件缺陷预测模型. 首先, 从源代码的抽象语法树中选择合适的结点提取表征向量, 并构建字典将其映射为整数向量以方便输入到卷积神经网络. 然后, 基于GoogLeNet 设计卷积神经网络, 利用卷积神经网络的深度挖掘数据的能力, 充分挖掘出特征中的语法语义特征. 另外, 模型使用了随机过采样的方法来处理数据分类不均衡问题, 并在网络中使用丢弃法来防止模型过拟合. 最后, 用Promise 上的历史工程数据来测试模型, 并以AUC 和F1-measure 为指标与其他3种方法进行了比较, 实验结果显示本文提出的模型在软件缺陷预测性能上得到了一定的提升.关键词: 软件缺陷预测; 抽象语法树; 卷积神经网络; 随机过采样; 丢弃法引用格式: 陈凯,邵培南.基于深度学习的软件缺陷预测模型.计算机系统应用,2021,30(1):29–37. /1003-3254/7726.htmlSoftware Defect Prediction Model Based on Deep LearningCHEN Kai, SHAO Pei-Nan(The 32nd Research Institute of China Electronics Technology Group Corporation, Shanghai 201808, China)Abstract : In order to improve the reliability of software, software defect prediction has become an important research direction in the field of software engineering. Traditional software defect prediction methods mainly design static code metrics and use machine learning classifiers to predict the defect probability of the code. However, the static code metrics do not fully consider the semantic features hidden in the code. According to this situation, this study proposes a software defect prediction model based on convolutional neural network. First, extract the characterization vectors from the appropriate nodes in the abstract syntax tree of the source code, and construct a dictionary to map them to integer vectors to facilitate input to the convolutional neural network. Then, a convolutional neural network is designed based on GoogLeNet, and the ability of the convolutional neural network to deeply mine data is used to fully mine the grammatical and semantic features of the features. In addition, this model uses the method of random oversampling to deal with the imbalance of data, and uses the method dropout in the network to prevent the model from overfitting. Finally, the historical engineering database on Promise is used to test the model, and AUC and F1-measure are used as indicators to compare with the other three methods. The results show that the proposed model has a certain improvement in software defect prediction performance.Key words : software defect prediction; abstract syntax tree; convolutional neural network; random oversampling; dropout计算机系统应用 ISSN 1003-3254, CODEN CSAOBNE-mail: Computer Systems & Applications,2021,30(1):29−37 [doi: 10.15888/ki.csa.007726] ©中国科学院软件研究所版权所有.Tel: +86-10-62661041① 收稿时间: 2020-05-19; 修改时间: 2020-06-16; 采用时间: 2020-06-23; csa 在线出版时间: 2020-12-311 引言随着现代软件的不断发展, 软件可靠性已经成为评价软件的关键因素. 软件规模的不断扩展和功能的日益增强, 软件复杂度不断上升, 软件缺陷出现的概率也不断上升, 从而导致软件的失败. 为了帮助开发人员和测试人员及时找到软件缺陷, 软件缺陷预测已经成为软件工程领域、数据挖掘领域的研究方向之一. 软件缺陷预测技术可以在一定程度上预测软件中是否存在着缺陷, 以此帮助相关团队快速了解软件的整体情况和质量, 制定相关策略测试和改善软件, 提高软件的可靠性和稳定性.基于此, 许多研究人员前赴后继潜心研究软件缺陷预测技术并尝试通过机器学习的方法来检测软件中是否存在着缺陷. 传统软件缺陷预测[1]是以手工获取软件度量特征的基础进行分类学习, 而特征选择的方法直接影响软件缺陷预测的准确性和稳定性. 而在以往的软件缺陷预测研究中, 通常使用静态软件度量作为代码的特征, 静态软件度量[1]主要包括以下几种方法:(1)代码度量代码度量是最直接、应用最普遍的度量方式. 通过对源代码相关指标的简单计数得到度量值. 度量包括总行数、代码行数目、注释行数目、空白行数目和代码及注释行总数目等, 通过对总行数、代码行数、注释行数等不同的处理方式, 度量结果就会不同.(2) McCabe度量McCabe度量是一种基于程序流程图的复杂性度量方法, 度量的是程序的复杂性, 主要包括圈复杂度、基本复杂度、设计复杂度等.(3) Halstead度量Halstead度量考虑了程序中出现的操作数和运算符, 具体有程序长度、操作符出现的总数量、操作数出现的总数量、程序容量、程序难度、程序级别、程序工作量等.(4) CK度量CK度量是面向对象程序的度量, 具体包括类方法复杂度带权和(WMC)、类在继承树中的最大深度(DIT)、继承树中类的直接子类个数(NOC)等.根据代码的实际情况, 选择合适的度量方法, 或在各种度量方法中选择合适的指标组成新的特征集合,然后根据从历史软件源码中提取出来的特征构建如逻辑回归、随机森林、支持向量机等分类器, 对新版本的软件源码进行软件缺陷预测, 以此来帮助编程人员找到可能包含缺陷的部分.然而, 传统软件缺陷预测方法使用静态代码度量作为特征, 未能充分考虑潜藏在代码中的语义特征, 这无疑会对缺陷预测造成影响. 而抽象语法树能够表达出源代码的语义, 已经有相关的论文[2]证实了其可以用于源码的完整性和缺陷的检测. 抽象语法树是基于源代码采用树状结构来描述代码上下文之间的关系,其中包含了程序模块的语法结构和语义信息. 从抽象语法树中提取表征用于软件缺陷预测, 可以充分考虑到代码的语法语义特征.近年来, 深度学习作为数据挖掘的技术之一得到了充足的研究. 在软件缺陷预测领域, 深度学习同样可以用于挖掘代码中隐含的特征. Iqbal等[3]介绍了用静态度量的方法获得特征, 然后用4种方法对特征进行投票, 选取出最合适的特征, 然后构建一个多层感知机(MLP)网络来对样本进行学习分类. Wang等[2]介绍了用多层受限玻尔兹曼机叠加而成的深度置信网络(DBN),自动提取源代码中的语法语义特征, 并用提取出来的特征构建软件缺陷预测模型. Li等[4]利用卷积神经网络(CNN)提取源码特征后, 将其与传统静态特征进行连结, 构建逻辑回归分类器来对软件缺陷进行预测. 然而, 这些方法依然存在着数据挖掘不足的问题, 所使用的网络大多是简单模型, CNN也仅使用单层卷积层.基于这种情况, 本文以抽象语法树为特征来源, 提出了一种卷积神经网路模型来进行软件缺陷预测, 并利用Promise官网上的历史工程数据来对模型进行实验, 取得了较好的结果.2 基于抽象语法树的代码表征能否从源代码中提取到合适的特征, 是影响软件缺陷预测性能的一个关键因素. 在过去的研究中, 常常用静态软件度量的方法来处理源代码, 忽视了潜藏在代码中的语义特征. 而本文使用了一种基于抽象语法树的方法来获取代码表征.2.1 抽象语法树抽象语法树(Abstract Syntax Tree, AST)是源代码关于抽象语法结构的树状表示, 源代码中的每一种结构都表征为树上的结点. 之所以说是抽象的, 是因为AST并不会将源代码的细节表示出来, 例如, 一串For 语句, 在结点中就记录为“ForStatement”以及一些关键计算机系统应用2021 年 第 30 卷 第 1 期要素, 而具体循环的内容并不会被记录下来. 另外, 抽象语法树并不依赖源代码语言的语法, 也就是说, 语法分析时所采用的是上下文无关文法, 因为在写文法时,通常会对文法进行等价的转换(消除左递归, 二义性,回溯等), 这样会在文法分析时引入一些冗余成分, 对后续阶段造成不好的影响.抽象语法树能有效保存代码的语法结构和语义信息. 如图1所示, 代码a和代码b十分相似, 且有着几乎一样的静态代码度量, 也就是说, 他们有着几乎一样的特征, 在特征空间中, 它们的距离会非常小, 用分类器分类的话, 很有可能将两份代码归为一类, 但显然代码a是没有缺陷的, 而代码b是有缺陷的, 这就造成了错误的检测结果. 图2展示两份代码的抽象语法树, 代码a的抽象语法树比代码b的抽象算法树多了两个结点, 在提取表征向量时, 两份代码在序列上就会有一定的区别, 而这种区别就可以方便模型区分两种代码, 得到更好的软件缺陷预测性能.图1 抽象语法树示例代码2.2 提取表征向量本文使用了一款开源的Python依赖包Javalang 来对源代码进行解析, 它提供了一个基于Java语言规范的词法分析器和解析器, 可以构造Java源代码的抽象语法树. 在得到源代码的抽象语法树后, 按照深度优先的顺序来遍历AST的所有节点, 然后主要选择以下3类结点作为抽象语法树的表征向量元素:(1)表示为方法调用的结点(2)表示为声明的结点, 包括方法声明、类声明、接口声明等(3)控制流结点, 譬如说条件分支、循环控制等根据结点的类型, 我们选取不同的要素来作为结点的特征. 对于第1类结点, 我们使用结点对应的方法名来作为结点在特征向量中的标识; 第2类结点选择结点的名称来作为标识; 第3类控制流结点选择节点的类型来作为标识, 比如表征条件分支的结点, 记录结点的类型名“IfStatement”作为该结点的特征. 表1列出了本文所使用的所有的结点类型.由此, 我们可以得到一棵树即一份代码的表征向量.2.3 整数向量映射从抽象语法树中获得的表征向量不能直接用于神经网络, 训练神经网络需要输入整数向量, 所以我们需要在获得的特征和整数之间建立一个映射, 将表征向量转换为整数向量.为了在获得的特征和整数之间建立映射, 我们建立一个字典[2]将表征和正整数一一对应起来. 将训练样本和测试样本中的代码全部提取为表征向量后, 统计各个特征的频率, 将其转换为对应的整数. 假设不同的特征的数量是m, 每个特征都有着对应的整数, 那么正整数的范围也是1~m. 具体的, 在从训练样本和测试样本中提取表征向量后, 首先, 计算各个特征在所有样本中出现的频数, 并且根据频数将它们排列; 然后,为排列好的特征建立一个序列字典, 频数高的特征排在前面, 这意味着出现频率越高的特征对应的正整数越小; 构建完字典后, 就可以将之前的表征向量转化为整数向量. 但因为神经网络的输入要求有固定的长度,为了避免向量过于稀疏, 选择适当的向量长度对向量进行处理. 如果一个向量的长度小于设定的长度, 那么我们就在向量末尾添0, 而0在神经网络的计算过程中没有意义; 如果一个向量的长度大于设定的长度, 那就在向量中寻找最大的正整数将它删去, 因为最大的整数对应的是频数最小的特征, 循环往复, 直到向量的长度符合设定的长度. 由此, 我们得到了每份源代码对应的整数向量. 图3给出了从源代码到整数向量的全部流程.2021 年 第 30 卷 第 1 期计算机系统应用图2 示例代码的抽象语法树表1 使用到的所有结点类型类别结点类型方法调用结点MethodInvocation, SuperMethodInvocation声明结点PackageDeclaration, InterfaceDeclaration, ClassDeclaration, MethodDeclaration, ConstructorDeclaration, VariableDeclaration 控制流结点IfStatement,WhileStatement, DoStatement, ForStatement, SwitchStatement, AssertStatement, BreakStatement,ContinueStatement, ReturnStatement, ThrowStatement, TryStatement, SynchronizedStatement, BlockStatement,TryResource, CatchClause, EnhancedForControl其他结点FormalParameter, BasicType, CatchClauseParameter, MemberReference, SuperMemberReference, ReferenceType图3 从源代码到得到整数向量的流程图(①从源代码中解析出抽象语法树; ②从抽象语法树中提取表征向量;③根据提取的特征构建字典; ④将表征向量映射为整数向量)计算机系统应用2021 年 第 30 卷 第 1 期3 卷积神经网络设计与结构卷积神经网络是一种含卷积计算且具有深度结构的前馈式神经网络, 具有表征学习、深度挖掘数据的能力. 卷积神经网络已经被证实在图像处理、语音识别、自然语言处理等领域有着不错的性能表现. 而且,卷积神经网络的隐含层内的卷积核参数共享、层与层之间的稀疏连接使得卷积神经网络能够以较小的计算量对格点化特征.3.1 数据预处理在软件缺陷预测领域, 数据分类不均衡问题是普遍存在的, 如何处理这种不均衡问题也是具有挑战性的. 在获得的数据集中, 往往有缺陷的样本数是要少于没有缺陷的样本数, 如果直接用这样的样本对模型进行训练, 训练出来的模型往往会对样本数量较少的类别的识别能力较弱, 在软件缺陷预测时, 模型便会偏向没有缺陷的结果. 因此, 我们需要对数据进行预处理以弥补数据集分类不均衡带来的偏差.一般而言, 针对数据集中存在的样本分类不均衡问题, 通常采用过采样或欠采样的方法来使得数据集中各类的样本数量达到均衡. 欠采样是从多数样本中随机选择和少数样本一样数量的样本, 以此构建分类平衡的数据样本, 但这样会大大减少数据的训练样本,造成信息的损失, 会造成模型的欠拟合, 因此我们选择过采样的方法来处理分类不均衡问题. 由于AST数值向量并非是特征向量, 所以类似像SMOTE[5]等基于样本间的欧式距离来生成新样本的分类不均衡处理方法并不一定适用. 因此, 在这里, 我们采取简单的随机过采样的方法来对数据进行预处理, 在少数样本即有缺陷的样本中随机选择进行复制, 使得有缺陷的样本数量和没有缺陷的样本数量保持一致, 以此保证数据类别间的均衡. 具体的算法如算法1所示.算法1. 随机过采样算法输入:分类不均衡的数据集D输出: 分类均衡的数据集D'(1)初始化已复制样本集合C为空集.(2)将数据集D复制, 组成数据集D'.(3)在数据集D中筛选出有缺陷的样本集d.(4)在数据集d中随机选择样本a, 如果a不在已复制样本集合C中,将样本a加入数据集D'和已复制样本集合C; 如果已复制样本集C的大小和d一样, 则清空C.(5)重复步骤(4)直至数据集D'中无缺陷样本和有缺陷样本数量保持一致.3.2 网络结构首先介绍所要构建的网络中用到的基础卷积块Inception块[6], 这个卷积模块的结构如图4所示.图4 Inception块如图4所示, Inception块含有4条并行的网络线路. 前三条线路所使用的卷积核大小分别是1×1、3×3、5×5, 以用来抽取不同空间尺寸下的信息, 第2, 3层会先对输入做1×1卷积操作以减少输入通道数, 以降低模型复杂度. 第4条线路会先使用3×3最大池化层, 然后接一个1×1卷积层来改变通道数. 并且, 根据4条线路的具体情况, 设置合适的填充来使得输入和输出的高和宽一致. 最后将每条线路的输出在通道维上连结, 以此完成卷积的功能, 将结果输入到下一层. 相较于普通的卷积层, Inception块因为使用了3个卷积层和1个池化层, 能够更深层次的挖掘数据中的特征,以此帮助模型进行更好的学习分类.为了能够更深层次地挖掘出潜藏在向量中的语法语义特征, 本文基于GoogLeNet[7]设计了一个卷积神经网络, GoogLeNet最初设计出来是用来进行图像处理的, 在I m a g e N e t图像识别挑战赛中大放异彩, GoogLeNet串联了多个Inception块来对图像进行深度挖掘, 以此进行更好的分类. 本文基于GoogLeNet设计一个卷积神经网络, 具体的网络结构如图5所示, 除了最后的输出层使用Sigmoid函数作为激活函数外, 其他层的激活函数均使用ReLU函数, 并且根据实际情况调整网络中各个层的参数, 网络整体分为主要分为以下3个部分:(1)输入层: 输入层主要是一个嵌入层[8], 嵌入层的主要作用是将输入的整数向量中的整数元素转换成整数向量, 使得向量可以进行卷积操作. 嵌入层有两个重要参数: 嵌入层字典的大小(num_embeddings)和每个产出向量的大小(embedding_dim). 这里, 本文将num_embeddings设置为2.3节构建的字典中所含有的2021 年 第 30 卷 第 1 期计算机系统应用特征的数量, 将embedding_dim设置为2.3节中通过映射得到的整数向量的长度. 将长度为n的整数向量输入到嵌入层, 嵌入层将给出一个n×n的矩阵向量. 并且,为了提高内存利用率和训练模型的速度, 本文选择分批量进行训练, 设置每次训练样本个数(批尺寸, Batch_ Size)为16, 即一次输入16个样本进行训练.(2)卷积部分: 卷积部分是网络的主体部分, 共由5个模块组成. 模块与模块之间使用步幅为2的3×3最大池化层来减小输出高度. 第1个模块包含3层的3×3卷积层; 第2个模块使用2个卷积层, 首先接一个64通道的1×1卷积层, 然后接了一个将通道数扩大3倍的3×3卷积层; 第3个模块串联了2个完整的Inception块; 第4模块串联了5个Inception块; 第5模块串联了2个Inception块. 通过多层的不同空间尺寸的卷积操作, 来深度挖掘数据中的特征, 从而进行性能更好稳定性更高的学习分类.(3)输出层: 输出层主要是根据之前卷积层输出的结果来输出分类结果. 首先使用一个全局平均池化层来将每个通道的高和宽都变成1, 然后接上一个全连接层, 输出通道数为标签类别数, 最后, 连结一个Sigmoid 函数构建逻辑回归分类器来计算程序代码的缺陷概率,从而得到分类结果.图5 网络结构图3.3 模型优化之前, 我们在数据预处理时采用随机过采样的方法来解决数据分类不均衡问题, 提升了模型的泛化能力, 但是这样也有一定的过拟合的风险, 因此我们选择使用丢弃法(Dropout)[9], 通过随机丢弃一部分神经元来避免过拟合. 在训练过程中, 随机丢弃一部分隐藏层神经单元, 即所有神经单元都有可能被清零, 这样就减少了神经元之间的依赖性, 输出层的计算也无法过度依赖任何一个隐含层神经元, 从而在训练模型时起到正则化的作用, 用来应对过拟合. 在测试模型时, 为了拿到更加准确的结果, 我们不使用丢弃法.另外, 在训练模型的过程中, 为了得到最优的模型参数, 我们需要根据损失函数的梯度不断地对参数进行迭代, 这里我们选择使用Adam[10]优化器来更新参数. Adam算法结合了AdaGrad和RMSProp两种优化算法的优点[10], 能够自动调整学习率, 并且参数的更新不受梯度的伸缩变换影响. Adam算法能够从梯度均值及梯度平方两个角度进行自适应地调节, 综合考虑梯度的一阶矩估计和二阶矩估计计算出更新步长, 而不是直接由当前梯度决定.4 实验与结果分析4.1 数据集为了评估训练出来的模型的性能, 本文从Promise[11]上下载了5个工程, 总共11个项目, 组成6组软件缺陷预测任务, 用于模型的测试. 在同一软件工程中, 将旧版本的工程项目作为训练集, 将新版本的工程项目作为测试集, 根据测试结果来评估模型的预测能力. 例如, 对于Camel工程, 我们将Camel 1.4版本的工程代码用来训练模型, 然后用Camel 1.6版本的代码用来测试模型. 表2列出了测试时所使用的软件项目的基本信息.表2 测试使用的工程信息工程版本平均代码数平均缺陷率(%) Camel 1.4, 1.691818.1Lucene 2.0, 2.220955.7 Synapse 1.0, 1.1, 1.221225.5Poi 2.5, 3.041364.0Xalan 2.6, 2.784447.3另外, 在数据集中, 每个项目不仅含有工程的源代码, 还统计了源代码的静态代码度量和缺陷注释, 度量方法主要是针对面向对象编程的静态代码度量, 具体的指标内容如表3所示. 这些指标可以用于其他的软件缺陷预测方法, 来和本文模型进行比较.计算机系统应用2021 年 第 30 卷 第 1 期表3 数据集中所使用的20个静态代码度量简写全称LOC Lines of codeDIT Depth of inheritance treeNOC Number of childrenRFC Response for a classCBO Coupling between object classesLCOM Lack of cohesion in methodsLCOM3Lack of cohesion in methodsNPM Number of public methodsDAM Data access metricMOA Measure of aggregationMFA Measure of function abstractionIC Inheritance couplingCAM Cohesion among methods of classCBM Coupling between methodsAMC Average method complexityCa Afferent couplingsCe Efferent couplingsAvg(CC)Average McCabeMax(CC)Maximum McCabeWMC Weighted methods per class4.2 评估指标本文采用AUC[12]和F1-measure[13]这两个指标来评估模型性能, AUC主要用来评估模型的识别缺陷的能力, 而F1-measure主要用来评估模型的稳定性.在二分类的学习预测过程中, 根据分类结果可以将其分为4类: (1)若一个实例为正类且被预测为正类,即为真正类(True Positive, TP); (2)若一个实例为正类但被预测负类, 即为假负类(False Negative, FN); (3)若一个实例为负类但被预测为正类, 即为假正类(False Positive, FP); (4)若一个实例为负类且被预测为负类,即为真负类(True Negative, TN). 基于这4个数据, 可以得到击中概率(TPR)和虚报概率(FPR), 其计算公式如式(1)和式(2)所示:然后以FPR为横轴, TPR为纵轴, 就可以绘制出ROC曲线, 而ROC曲线下的面积就是AUC. 根据AUC的定义, 识别能力更好的模型对应着更高的TPR 和更低的FPR, 所以有AUC值越大的预测方法越好.F1-measure是精确率(P)和召回率(R)的调和平均, 其中精确率和召回率的计算公式如式(3)和式(4)所示:通常情况下, 我们希望精确率越高越好, 召回率也越高越好, 但事实上这两个指标在某些情况下是矛盾的, 而F1-measure则综合考虑了这两个指标. F1-measure 的计算公式如式(5)所示.另外, 用于评估软件缺陷预测模型的指标还有很多, 例如MCC[14]和G-mean[15], MCC考虑所有的有缺陷数据和无缺陷数据来综合评估预测结果和真实结果之间的关系, G-mean是在数据不平衡时十分有参考价值的一个指标, 但因为AUC和F1-measure综合评估了模型的准确性和稳定性, 具有广泛的代表意义.4.3 实验方法为了能够正确估计模型对于软件缺陷预测的性能,将本文提出的模型与以下3种方法进行比较:(1)静态代码度量+逻辑回归(LR): 以数据集中提供的20个静态代码度量作为代码特征, 并用逻辑回归的方法进行分类(2)深度置信网络+逻辑回归(DBN)[2]: 使用深度置信网络从源代码中提取特征, 然后使用逻辑回归的方法进行分类(3)卷积神经网络+逻辑回归(CNN)[4]: 利用单层卷积神经网络对源代码进行特征提取, 然后使用逻辑回归分类器得到分类结果对于传统软件缺陷预测算法, 因为使用的是20个静态代码度量所构成的特征向量, 所以在数据预处理时, 可以使用SMOTE方法进行过采样来处理数据集分类不均衡问题; 而对于DBN、CNN和本文模型, 只能简单地采用随机过采样的方法来对数据进行预处理.本文使用Python环境以及深度学习框架PyTorch 来实现本文提出的模型, 所有的实验均在一台带有NVIDIA GTX 1080的Linux服务器上运行. 此外, 因为随机过采样和丢弃法都具有一定的随机性, 因此实验中每个方法都执行10次, 取平均值来进行模型性能的比较.4.4 实验结果及分析本文采用AUC和F1-measure来比较4种方法在2021 年 第 30 卷 第 1 期计算机系统应用6组预测任务上的性能. 表4和表5分别记录了这4种方法关于AUC和F1-measure的实验结果, 每次测试任务的表现最好的已在表格中加粗.表4 4种方法关于6项测试任务的AUC 训练集测试集LR DBN CNN本文模型Camel 1.4Camel 1.60.5990.6410.6870.709Lucene2.0Lucene2.20.6280.6260.6350.641 Synapse1.0Synapse1.10.6000.6390.5940.646 Synapse1.1Synapse1.20.6370.6970.6220.674Poi2.5Poi3.00.6650.6510.7100.718Xalan2.6Xalan2.70.6510.6830.6750.674平均值0.6300.6560.6540.677表5 4种方法关于6项测试任务的F1-measure 训练集测试集LR DBN CNN本文模型Camel 1.4Camel 1.60.3550.3420.4890.513Lucene2.0Lucene2.20.6110.6660.7090.724 Synapse1.0Synapse1.10.4440.4570.4560.461 Synapse1.1Synapse1.20.4710.4930.4870.473Poi2.5Poi3.00.7070.7160.7560.776Xalan2.6Xalan2.70.6330.6420.6540.681平均值0.5370.5530.5920.605表3和表4分别列出了4种方法关于每个测试任务的AUC值和F1-measure. AUC评估了模型分类的准确性, 而F1-measure评估了模型的稳定性. 从表3和表4中我们可以看到, 总体而言, 本文提出的模型在软件缺陷预测性能方面和模型稳定性明显优于LR、DBN 和CNN的. 而本文模型的AUC和F1-measure的均值也都高于其他方法, 这也证实了本文提出模型的合理性和可行性. 此外, 从两张表中我们可以看出, 相较于传统的软件缺陷预测方法, 应用深度学习方法在软件缺陷预测性能和模型稳定性上都得到一定的提高. 这也证实了, 在软件缺陷预测性能方面, 深度学习方法优于传统的机器学习方法.综上所述, 针对传统软件缺陷预测方法中对源代码语义特征挖掘不足的问题, 本文测试实验结果表明,在软件缺陷预测领域, 相比于传统的预测方法, 应用深度学习方法得到了一定的提高. 而本文也根据前人的工作, 提出了用多层卷积神经网络对基于抽象语法树得到的表征向量进行分类学习, 有效提高了缺陷预测的准确性.5 结束语本文针对传统软件缺陷预测方法应用静态代码度量而忽视代码语义的缺点, 从代码的抽象语法树中提取出向量, 再利用卷积神经网络深度挖掘数据的能力挖掘代码中的语法语义特征, 从而对软件缺陷进行学习分类. 并且, 通过与LR、DBN、MLP方法的实验比较, 由AUC和F1_measure两个指标我们可以看出本文提出的模型在软件缺陷预测性能上得到了一定的提高. 然而, 关于数据集分类不均衡、模型优化等问题,本文的处理方法相对粗糙, 这也是未来需要继续研究的方向.参考文献刘童. 基于机器学习算法的软件缺陷预测技术研究[硕士学位论文]. 武汉: 华中师范大学, 2018.1Wang S, Liu TY, Tan L. Automatically learning semantic features for defect prediction. 2016 IEEE/ACM 38th International Conference on Software Engineering. Austin, TX, USA. 2016. 297–308.2Iqbal A, Aftab S. A classification framework for software defect prediction using multi-filter feature selection technique and MLP. International Journal of Modern Education and Computer Science, 2020, 12(1): 18–25. [doi:10.5815/ijmecs.2020.01.03]3Li J, He PJ, Zhu JM, et al. Software defect prediction via convolutional neural network. 2017 IEEE International Conference on Software Quality, Reliability and Security.Prague, Czech Republic. 2017. 318–328.4Chawla NV, Bowyer KW, Hall LO, et al. SMOTE: Synthetic minority over-sampling technique. Journal of Artificial Intelligence Research, 2002, 16(1): 321–357.5Szegedy C, Ioffe S, Vanhoucke V, et al. Inception-v4, Inception-ResNet and the impact of residual connections on learning. Proceedings of the 31st AAAI Conference on Artificial Intelligence. San Francisco, CA, USA. 2017.4278–4284.6Tang PJ, Wang HL, Kwong S. G-MS2F: GoogLeNet based multi-stage feature fusion of deep CNN for scene recognition. Neurocomputing, 2017, 225: 188–197. [doi: 10.1016/j.neucom.2016.11.023]7Mikolov T, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality. Proceedings of the 26th International Conference on Neural Information Processing Systems. Red Hook, NY, USA. 2013. 3111–3119.8Ba LJ, Frey B. Adaptive dropout for training deep neural 9计算机系统应用2021 年 第 30 卷 第 1 期。