庚子年初,新冠肆虐,危及万人,祸至全国.观紧闭窗外,万家灯火,往常生活,然疫区前线,医护救治,争分夺秒.既知难成英雄,驱离病魔,唯闻令而静,扣顶写博.众志成城,祸至而无惧,同舟共济,风雨也有晴,然后复兴矣.

–2020/2/3

序言

本文可以看作网页收藏夹中课题相关的各种论文博文等资料的串讲,介绍代码大数据在软件缺陷预测领域的应用,也算是一年左右在学术上的探索,今整理相关资料以作参考。

基于代码大数据的软件缺陷预测主要基于两个大的背景:

  1. 在近十年的十一五和十二五的国家自然科学基金重大研究计划中,软件工程领域仅有一项”可信软件基础研究“入选,软件可信性成为近期软件工程研究的重点.
  2. 最近几年,大数据在若干领域的成功应用引起了越来越多人的注意,促进大数据的发展已经提升到了国家层面,2018年国务院印发了”促进大数据发展行动纲要“.

在这个背景下,我们尝试基于大数据去提升软件质量和可靠性,其中最简单的切入点就是软件缺陷预测领域,这是主要是由于现在主流的软件缺陷预测是基于数据驱动的方法,已经具有很好的传统的机器学习的基础,所以引入大数据的方法也相对容易。

传统软件缺陷预测方法

现在基于数据驱动的软件缺陷预测首先将软件源代码分散为函数或类或文件的颗粒,然后提取各种特征以此训练机器学习模型,将缺陷预测问题转化为一个典型的机器学习二分类问题,给出一个软件模块是否具有缺陷倾向性。

Software defect prediction

这里给出两篇中文综述和两篇英文综述,每篇的行文思路和关注的点略有不同。

  1. Song, Qinbao, Jia, Zihan, Shepperd, Martin,等. A General Software Defect-Proneness Prediction Framework[J]. IEEE Transactions on Software Engineering, 2011, 37(3):356-370.
  2. 李勇, 黄志球, 王勇, et al. 数据驱动的软件缺陷预测研究综述[J]. 电子学报, 2017(04):217-223.
  3. 陈翔, 顾庆, 刘望舒, et al. 静态软件缺陷预测方法研究[J]. 软件学报, 2016, v.27(01):5-29.

想要了解一个领域,首先从学术情报平台了解该方向活跃的研究团队或大师,以及该领域的热度,通过进一步的分析才能确定该方向痛点及发展瓶颈。从下面三个平台以”software defect prediction”等关键词进行搜索。

  1. Aminer
  2. google scholar
  3. 百度学术-开题分析

基于数据驱动的软件缺陷预测研究随着机器学习的火热在2010年左右迎来一个高峰,研究主要集中在数据集,特征(也就是度量元)设计,数据处理和模型构建四个方面,由于NASA和MDP等较高质量数据集出现的相对较早,因此在数据集上的研究并不多见,较早的研究主要集中在度量元设计和模型构建两个方面,当然这两个方面的也是早期改进预测模型最有效的手段,近些年软件缺陷预测研究陷入瓶颈,论文数量有所减少,主要集中在构建更加完善的框架和针对数据不平衡处理等问题。

A Cluster-Based Hybrid Feature Selection Method for Defect Prediction

缺陷是”未满足与预期或者规定用途有关的要求”的问题,进而影响软件可靠性(在规定时间规定条件下完成规定功能的能力)。传统的软件缺陷预测度量元相对宏观,一般提取软件系统或模块的特征,与此不同的是代码漏洞检测,漏洞检测是根据PMD, CheckStyle, Findbugs等等代码规则通过静态扫描代码发现漏洞,这种方法检测效果准确,可解释性强,但是受代码规则的约束大,很多复杂系统中的深层缺陷不能够被发现。SonarQube是一个著名的开源漏洞检测工具,既可以从网页上体验,也支持各种接口集成使用。未来软件缺陷预测的发展可以不断的借鉴漏洞检测的相关思想,不断增强其检测精度和可解释性。

代码大数据

日益发展的互联网中汇集了海量的信息,计算能力的提升使得大数据的收集、处理和分析工作变成可能,而层出不穷的算法为各个领域的任务提供了高效的解决方法。因此挖掘软件代码库促进软件工程的各项研究也应运而生,成为这几年很多会议的一个专题,MSR是一个挖掘软件仓库的Workshop,Mining Software Repositories(MSR),也有一些公司在尝试对其软件仓库进行挖掘以更好的管理开发工作,如Novoda

无论在哪个领域,大数据的应用基本都包括以下三个方面: 数据采集/数据处理/模型建立。

软件缺陷数据

先看缺陷数据的采集,目前公开的软件缺陷数据集有:

  1. PROMISE: 应用广泛的NASA数据集,目前已经停止运营,备份数据见Github仓库
  2. debian bug
  3. Eclipse Bug Data
  4. Bug prediction dataset
  5. Open Research Datasets in Software Engineering
  6. Download Helix – The Software Evolution Data Set
  7. Software-artifact Infrastructure Repository

目前最大的开源项目托管平台GitHub已经拥有了超过9600个开源软件项目、3100万的用户和2亿次合并请求,这些开源软件代码库的发展,使我们利用互联网获得海量的软件缺陷数据成为了可能。

Git客户端可以可视化的浏览本地Git项目的各个分支和操作,另外我们还可以使用Github提供的接口便捷的获取保存在服务器端的各类数据。

  1. GitHub API 文档
  2. Java API for GitHub 仓库源码
  3. kohsuke API 文档

解决了数据获取的手段,我们还需要确定什么样的数据是我们所需要的,也就是和缺陷相关的数据,GitHub上的数据是以特定的软件开发工作流组织的,所以还需要了解常见的工作流。

  1. Comparing Workflows中文翻译
  2. xirong/my-git对上文的回顾
  3. 推荐的commit规范
  4. 如何优雅地pull request
  5. 团队协作中的 Github flow 工作流程

为了更加直观真切的了解开发过程中需要修复的软件确信啊,这里选取了一些GitHub上项目缺陷的实例,筛选了标签为bug且关闭的issue或PR:

  1. thinkaurelius/titan bug issue
  2. ReactiveX/RxJava bug PR
  3. elastic/elasticsearch bug PR
  4. eclipse/deeplearning4j bug PR

基于源代码的机器学习

假如我们已经获得了标记好的一段段缺陷代码,如何建立模型对新的待预测的软件模块进行缺陷预测呢?针对传统缺陷预测方法的不足,探索将传统缺陷预测从宏观度量元表征推向微观方面,基于源代码的机器学习技术带来了新的研究方向,可以叫做Machine Leaning on source code或者Learning from big code。

由于代码是一种高度组织并具有一定规则的语言,所以目前自然语言处理方法在分析软件源代码上并不能达到最好的效果,研究基于源代码的机器学习对软件工程的很多领域都有很大的意义。2015年,欧盟发布了一项2016-2021为期5年的研究计划
Learning from Big Code: Probabilistic Models, Analysis and Synthesis,之后很多研究人员开始关注该方向,并开展了一些研究,下面是研究进展汇总。

该领域活跃的研究团队:

甚至还有相关的竞赛:
CodRep: Machine Learning on Source Code Competition

代码结构化

本质上是类似自然语言的序列化数据,但是与自然语言不同的是,代码语言在诞生之初就设计了严格的规则,因此将源代码转化为结构化数据较自然语言是更简单的,常见的能够表征源代码的结构有抽象语法书(AST),控制流图(CFG),数据流图(DFG)和程序依赖图(PDG)等,很多概念在程序切片的理论都可以找到。

抽象语法树AST:

通过Eclipse JDT我们可以直接生成并操作Java程序的抽象语法树,下面这几篇文章介绍了Eclipse AST的基础知识:

ASTs parsing

控制流图CFG:

表示学习

将代码转化为AST或者CFG这种结构化数据后还无法直接利用传统的机器学习方法,在学术上类似的这种具有典型图结构属性的数据还真不少,比如生物上的蛋白质结构,交通中的路网结构和社交网络结构,为了自动的提取这种图结构的特征,减少使用特征工程对数据信息的损失,图的表示学习成为近些年的热点,18年春天无意间看到了tkipf的GCN模型,现实证明这两年学术界和业界都对图表示学习或者图神经网络领域青睐有加.现在图神经网络的实现也越来越简单,已经有了多个可以简单实现的框架,如PyG,DGL等:

GNNs

很多国内一线互联网公司也在挖掘图表示学习的可能性,前段时间<深入浅出图神经网络:GNN原理解析>出版,也可以看作该领域早已经在机器学习和深度学习占有一席之地。相关资料有很多,有兴趣可以多多关注,主要关键词有:geometric deep learning, graph representation learning, graph neural network, graph convolution network等。


文中所有文字和图片所有权归本人所有,转载或使用请联系本人并标明出处。

2 条评论

weicong · 2020-03-13 20:53

`2019/2/3`是写错年份了吗?

    wangfeiabn · 2020-03-13 22:01

    是写错了,谢谢指正..

发表评论

电子邮件地址不会被公开。 必填项已用*标注