韩宏峰+罗羿隆+相克磊+徐毅蒙
摘要:软件缺陷是影响软件质量的关鍵因素,及早发现并排除软件缺陷是软件生命周期中重要的环节。随着代码数量级的与日俱增,早期的人工排查显然降低了审查效率和准确性,同时增加了审查成本。所以基于机器学习的软件代码缺陷识别技术是一种提升软件可靠性,适应当今社会发展速度的必然选择。
关键词:软件缺陷;软件可靠性;机器学习
中图分类号:TP181 文献标识码:A 文章编号:1009-3044(2017)25-0185-02
Abstract: Software defect is a critical factor that affected the quality of software, early detection and elimination of software defect is a vital link in software life cycle. With the increasing number of code order of magnitude, early manual inspections observably reduced the efficiency and accuracy of the review, while increasing the cost of the review. Therefore, the software code defect recognition technology Based on machine learning is an inevitable choice to improve software reliability and adapt to the speed of social development.
Key words: software defect; software reliability; machine learning
据统计,在软件开发中约42%的经费用于投入与软件缺陷相关的工作。可见现如今对软件缺陷进行研究在理论和实践中都极有价值。
软件缺陷在软件开发周期内通常不可避免[1]。其中,.软件缺陷通常指可运行产品中可能导致软件失效的瑕疵,定义两个有较强的关联性的重要属性:严重性和优先级,从不同的角度描述软件缺陷对软件质量和最终用户的影响程度及处理方式[2,3]。其中严重性属性指缺陷对整个被测系统造成的破坏程度,优先级属性则指影响缺陷处理顺序的指标,是一种动态的拓扑结构。另一方面,故障、失效和问题是与缺陷密切相关的概念。每个故障(失效,问题)一定是一个缺陷,但并不是每个缺陷都是一个故障(失效,问题)。
1 检查点
定义计算机检查出的缺陷称为检查点,但检测出的缺陷并不是完全准确。有一部分缺陷会引发运行时异常(如空指针异常、内存溢出),另一部分则为误报。因此为保证准确性,需要对所有的检查点都进一步确认其真实性。
表1为项目组前期对Android4.0的缺陷检测结果,共计算出35293个检查点,虽然计算机测试只花费了102个小时,但确认这些缺陷花费了近4个人/月的工作量。
因此通过机器学习的方法实现软件代码缺陷识别是十分必要的,相较早期的人工检测能够以极低的成本,更高的效率,更精确的准确度提前预测产品缺陷分布状况的可能性,从而证明可通过机器学习的方法进行早期缺陷的预测来获得更高的可靠性[4,5]。
2 检测工具DTS
DTS可测试Java/C/C++故障模式、安全模式和疑问模式等约200种,规则模式约100种,已逐步成为可以和美国工具相抗衡的国产工具。 其依据的检测原理是通过静态的方法分析配置的缺陷模式,检测出在动态运行过程中可能出现的问题。其中用DTS测出的故障密度是1个缺陷/KLOC,其他国产软件大致是4~6个缺陷/KLOC。统计表明此类工具8小时可以处理50~100万行源代码。正因为此类工具的上述特点,使得目前在软件测试领域,代码缺陷检测技术已同单元测试、功能测试等一样的基本方法[6]。
3 机器学习
3.1 定义
机器学习意旨通过计算机模拟人类的学习活动,包括有监督学习和无监督学习两大类。
3.2 分类
根据处理的数据是否存在人为标注来判断是否是机器学习,主要被分为两种学习方式,即监督学习和无监督学习。监督学习是指将学习目标进行有标签的数据作为辅助来完成的学习,这种方法在学习中的效果较好,但有标签的数据通常价格高昂,无监督学习是指计算机自主学习,利用多种数据进行先验式的知识吸取,但这种方法学习的效率较低。这两种方法的共性是相同的,通过构建数学模型进行最为优化的解答。
3.3 模型构建
模型构建可分为模型准备,模型假设和模型构成三步,如图1所示。
3.4 模型评估
3.4.1 留出法
l 将数据集分为两个互斥的集合,即用S训练出模型后,用T来评估其测试误差。
l S与T的划分要尽可能保持数据一致性(分层采样法)。
l 一般采用若干次随机划分、重复进行实验评估后取平均值作为留出法的评估结果。
l S与T的样本比例大约为1:2~1:4,一般而言,T中应至少有30个样例。
3.4.2 交叉验证法
l 将数据集划分成k个大小相似的互斥子集,每个子集都保持数据分布的一致性,每次用k-1个子集作为训练集,余下的那个子集作为测试集,进行k次训练和测试[7],最终返回的是这k个训练结果的均值。
l 为了减少因样本划分不同而引起误差,交叉验证法通常要重复p次,最终的评估结果是这p次k折交叉验证的均值。
4 实验
Weka作为一款机器学习的工具,已经提供了诸如分类,聚类,关联规则等方法[8]。但是算法的选择很有学问,选择何种算法需要建立在大量的实验分析结果的基础上。同时Weka作为开源工具集成了众多算法,开发人员可通过面向对象的主流语言Java在其架构基础上进行扩展,开发出所需的更多算法来满足实验需求[9]。
5 结束语
综上所述,基于机器学习的软件缺陷识别技术在软件测试中的地位越来越重要,因为普遍存在的较高误报率,继续通过人工确认的方法的低效率与低准确性严重阻碍了该技术的发展。所以基于机器学习的软件代码缺陷识别技术是一种提升软件可靠性的必然技术,能够将人彻底从繁重的确认工作中解放出来,是适应当今社会发展速度的必然选择。
参考文献:
[1] 马皖王莹,陈林,陈芝菲,等. 基于复杂网络分析的软件高危缺陷评估方法[J]. 计算机科学与探索,2014(8):956-965.
[2] 陈琰. 软件缺陷管理系统的设计与实现[D].华东师范大学,2006.
[3] 陈顺. 试述软件缺陷的严重性与优先级[J]. 无线互联科技,2013(8):108-109.
[4] 刘旸. 基于机器学习的软件缺陷预测研究[J]. 计算机工程与应用,2006(28):49-53.
[5] 刘旸. 基于SVM的Web应用缺陷预测方法[D].中国科学院研究生院(软件研究所),2005.
[6] 于超. 基于Java EE的高速公路收费管理系统的设计与实现[D].西安电子科技大学,2012.
[7] 李涛. 支持向量机在风电功率预测中的应用研究[D].北京交通大学,2012.
[8] 王淑珍. 机器学习算法的Weka嵌入[D].华南理工大学,2013.
[9] 刘卓. 数据挖掘技术在高校图书推荐系统中的应用[D].大连理工大学,2012.endprint