24小时论文定制热线

热门毕设:土木工程工程造价桥梁工程计算机javaasp机械机械手夹具单片机工厂供电采矿工程
您当前的位置:论文定制 > 毕业设计论文 >
快速导航
毕业论文定制
关于我们
我们是一家专业提供高质量代做毕业设计的网站。2002年成立至今为众多客户提供大量毕业设计、论文定制等服务,赢得众多客户好评,因为专注,所以专业。写作老师大部分由全国211/958等高校的博士及硕士生设计,执笔,目前已为5000余位客户解决了论文写作的难题。 秉承以用户为中心,为用户创造价值的理念,我站拥有无缝对接的售后服务体系,代做毕业设计完成后有专业的老师进行一对一修改与完善,对有答辩需求的同学进行一对一的辅导,为你顺利毕业保驾护航
代做毕业设计
常见问题

基于Github的Java程序缺陷自动修复方法研究

添加时间:2021/11/19 来源:未知 作者:乐枫
软件缺陷制约软件产业发展,严重影响软件质量。探索高效、自动的软件缺陷修复方法是目前软件工程领域的重要课题之一。深度学习技术的发展和大规模开源代码库的出现为改进传统基于"生成-验证"的缺陷修复方法带来了可能,正在成为目前研究的热点方向。
以下为本篇论文正文:

摘要

  软件缺陷制约软件产业发展,严重影响软件质量。探索高效、自动的软件缺陷修复方法是目前软件工程领域的重要课题之一。深度学习技术的发展和大规模开源代码库的出现为改进传统基于"生成-验证"的缺陷修复方法带来了可能,正在成为目前研究的热点方向。

  目前基于深度学习的缺陷修复方法主要依赖来自开源代码库中的数据集构建模型,尽管与传统基于手工提取缺陷修复模式的修复方法相比,能够生成可通过配套测试用例集的有效补丁,但生成的补丁往往偏离了原始程序的语义,正确性依然有待提升,其主要原因在于:

  (1)因为这些方法使用简单的规则从开源仓库中获取数据,由于开源仓库的多样性,这种单一的数据筛选方式获取的训练数据质量低,影响模型的学习效果;

  (2)现有方法忽略关注程序中的控制流和数据流信息;

  (3)现有方法在序列化处理源代码时粒度单一,并且对其中的用户自定义标识符抽象表示,使生成的词汇表中损失了一部分程序语义信息,影响模型生成补丁的效果。

  本文针对以上问题对现有缺陷修复方法进行改进,并提出一种基于深度学习技术的缺陷修复解决方案,具体研究内容总结如下:

  (1)面对开源仓库的数据存在质量分布不均衡的挑战,本文提出了一种基于大规模开源仓库的数据优化方法,通过数据筛选过程对开源仓库中的数据进行提纯,并且为了捕获程序上下文中对缺陷修复有意义的重点特征,构建一种基于程序控制流和数据流的程序切片方法对数据进行预处理,提升从开源仓库获取数据的质量。

  (2)提出一种使用编码器-解码器结构的程序缺陷修复模型。针对现有方法在源码序列化过程中存在粒度单一、损失部分程序信息的问题,本文使用基于子词表示的序列化方法对源码进行处理,尽可能多的保留程序上下文中的用户自定义标识符信息。

  再通过基于局部注意力机制的编码器-解码器模型学习缺陷的修复模式,实现补丁的自动生成。考虑到每种缺陷的修复操作具有相似性,本文通过构建一个基于程序抽象语法树 (Abstract Syntax Tree, AST) 结构特征的缺陷预分类模型,为待修复缺陷选择最匹配的补丁生成模型。

  (3)设计并实现了一个基于 Github 的 Java 程序缺陷修复原型系统 VulRepair.

  并且为了验证 VulRepair 的缺陷修复效果,还设计并实现了一组评估对比实验,从多个角度评估验证本文提出的缺陷修复模型和系统。实验结果表明,本文提出的缺陷修复方法在基准数据集和来自开源仓库的数据集上,相比已有的缺陷修复方法,VulRepair 生成的有效补丁和正确补丁数量更多,并且具有修复多行缺陷的潜力。

  关键词: 自动缺陷修复,深度学习,开源仓库

  ABSTRACT

  Software defects restrict the development of the software industry and seriously affect software quality. Exploring efficient and automatic software defect repair methods is currently one of the important topics in the field of software engineering. The development of deep learning technology and the emergence of large-scale open source repositories bases have brought the possibility to improve the traditional defect repair method based on theG&V technique, and it is becoming a hot research direction at present.

  The current defect repair methods based on deep learning mainly rely on data sets in the open source repositories. Although compared with traditional repair methods based on manually extracting defect repair patterns, they can generate effective patches that can pass a set of matched test cases, but the generated patches usually deviate from the semantics of the original program, and the correctness still needs to be improved. The main reasons are as follows: (1) Because these methods use simple rules to obtain data from open source repositories, due to the persity of open source repositories, the quality of training data obtained by this single data screening method is low, which affects the learning effect of the model; (2) Existing methods ignore the control flow and data flow information in the concerned program; (3) The existing method uses a single granularity when tokenizing the source code, and abstractly expresses the user-defined identifier in it, which loses part of the program semantic information, thus affecting the effect of the model to generate patches.Because of the above problems, this thesis proposes a defect repair solution based on deep learning technology. The specific research content is summarized as follows:

  (1) Facing the challenge of unbalanced quality distribution of data in open source repositories, this thesis proposes a data optimization method based on large-scale open source repositories. The data in the open source repositories is purified through the data filtering process, and in order to capture the program context features that are meaningful for defect repair, construct a program slicing method based on program control flow and data flow to preprocess data and improve the quality of data obtained from open source repositories.

  (2) Propose a program defect repair model using an encoder-decoder structure. Aiming at the problem of single granularity and loss of partial program information in the source code tokenization process of existing methods, this article uses a tokenization method based on subword representation to process the source code, and retain as many user-defined identifiers in the program context as possible. Then, through the encoder-decoder model based on the local attention mechanism, the defect repair mode is learned to realize the automatic generation of patches. Considering the similarity of repair operations for each defect, this thesis constructs a defect pre-classification model based on the structural features of the program abstract syntax tree and selects the most matching patch generation model for the defect to be repaired.

  (3) Designed and implemented a Github-based Java program defect repair prototype system VulRepair. And in order to verify the defect repair effect of VulRepair, a set of evaluation and comparison experiments are also designed and implemented to evaluate and verify the defect repair model and system proposed in this thesis from multiple angles. The experimental results show that the defect repair method proposed in this thesis is based on the benchmark data set and the data set from the open source repositories. Compared with the existing defect repair methods, VulRepair can generate more effective patches and can repair multiple lines of defects.

  Keywords: Automatic program repair, Deep learning, Open source repositories

Java程序缺陷自动修复方法

  目录

  第一章 引言

  本章节首先阐述本文的研究内容,包括软件缺陷自动修复的研究背景和意义,之后通过梳理该方向的历史研究进程,进一步分析当前研究所面临的局限和主要挑战。

  最后再针对现有研究中存在的问题,给出本文的研究思路,并简要介绍本文的研究方法和文章的组织结构。

  1.1 研究背景与意义

  在软件的开发过程中,由于需求不明确,设计不合理,开发人员编码错误等各方面原因,不可避免的会在系统中引入各种各样的缺陷。这些软件缺陷随着软件规模和复杂度的提升,成为限制软件发展的重要阻碍,甚至会被不法攻击者利用,威胁系统安全,产生难以预计的严峻后果。

  由于开源平台快速发展带来的开发便利性,很多开发者直接使用公开的开源代码库进行编码,并且忽略检查其中的内部流程和具体实现操作。有关报告[1]显示:在 2019年,平均每个软件使用了 445 个开源代码库,和往年相比平均使用率增长了 85%,还指出几乎所有(99%)被统计的软件中都使用了开源代码库,而这些被使用的开源代 码库中,超过 75%都含有缺陷。进一步说明在减少开发时间的同时,开源代码库的使用也加快了缺陷的数量增长和危害范围,带来巨大的隐患。因为开源代码库自身隐藏的缺陷会随着被大量复用而快速传播,而且很多开源代码库并不会公开自己存在的缺陷,这些缺陷对代码审查人员和开发人员来说并不明显,甚至是隐蔽的,分析和修复它们显得更加困难。

  因此,对于开发人员来说,发现缺陷,并对其进行修复仍然是一项耗时且繁琐的工作,在缺陷排查过程中首先需要借助代码审查,理解程序的执行过程,以找到引起缺陷的原因,然后对缺陷进行相应的修改,最后通过回归测试验证修复的正确性。尽管对于每个阶段已经有很多相关的工具,然而这一过程依然需要必不可少的人工参与,Britton 等人通过相关的访谈和调查发现,开发人员在调试 bug 上面花费的时间几乎占据其总编程时间的一半,除了耗时以外,调试所消耗的资金开支也同样不容小觑,约占整体资金开支的 50%,每年消耗在调试 bug 上的开支近乎 1560 亿美元[2].

  由此可见,随着系统规模的扩大,对软件缺陷修复的研究提出了更严峻的要求,以人工为主的缺陷修复过程不仅延长了软件开发的时间周期,还极大地增加了软件开发的人力成本。因此,对缺陷修复的自动化研究迫在眉睫。

  1.2 本文研究动机

  为了提升软件开发的效率,研究人员对程序缺陷的自动修复展开了一系列研究。

  目前基于生成-验证的缺陷修复方法[3-6]是该领域主流的技术之一,通过使用一些特定的转换规则对缺陷程序进行变换来生成候选补丁,然后对候选补丁执行配套的测试用例集进行排序和验证,从包含全部候选补丁的搜索空间中筛选出排名最高并且通过全部测试用例的可编译补丁作为修复结果。

  尽管基于生成-验证的修复方法已经能够成功修复一些数据集中的缺陷,但最新的一项研究表明[7]这类修复方法普遍存在搜索空间不能捕获正确补丁分布的不足:即生成的候选补丁中,包含的正确补丁极少,进一步说明搜索空间已经成为制约基于生 成-验证的缺陷修复方法修复效果的重要因素。即使一些方法采用从项目上下文中手工提取修复模式的操作来提升生成候选补丁的质量,但在实际修复过程中,基于手工提取修复模式的修复方法从程序中提取的修复特征有限,并且对不同缺陷修复的操作不够灵活,限制搜索空间的多样性。因此目前这种基于手工提取修复模式的缺陷修复方法亟需探索一种更新颖更智能的方式去提取缺陷修复特征,生成更精确的候选补丁。

  神经机器翻译 (Neural Machine Translation,NMT) 模型是一种主要处理自然语言翻译任务的深度学习技术,近几年已经被广泛应用于程序分析领域[8],可以利用神经翻译模型学习从缺陷程序到修复程序的修复过程。这种基于深度学习提取修复模式的方法相比传统手工提取修复模式的方法,所提取的缺陷修复模式更多样化,并且可以基于更灵活的修改粒度生成补丁。Santos 等人[9]探索使用神经翻译模型检测并修复小规模程序中存在的语法和编译问题,表明了使用深度学习技术解决缺陷修复问题的潜力,但由于训练数据有限,并且只对程序语言中的简单语法特征进行学习,导致这些方法修复的程序规模和缺陷类型有限,只能处理一些简单的语法、编译问题,对实际开发过程中开发人员常出现的缺陷往往无能为力。

  为了进一步丰富训练数据,改善模型修复缺陷的效果,研究人员选择从大型开源仓库中挖掘缺陷数据对模型进行训练,使基于深度学习提取修复模式的缺陷修复方法学习到更真实更多样化的缺陷特征,提升模型解决实际缺陷的能力。

  即使基于深度学习提取修复模式的缺陷修复方法可以有效改善人工提取修复模式过程中需要手工定义特征、提取特征的问题,并且可以从海量真实数据中自动学习程序缺陷修复模式,真正实现自动化修复,但是目前这种基于深度学习的方法对实际开发场景中的真实缺陷进行修复时效果不佳,原因主要有以下几点:

  (1)现有基于深度学习的相关工作,从 Github 开源平台上获取数据集进行建模时,仅使用简单的关键词筛选数据,这种基于简单规则的数据获取方法无法避免一些低质量的数据,导致模型学习修复模式时捕捉不到有用的信息,影响模型修复效果。

  (2)程序的上下文信息对缺陷修复过程具有指导作用,但现有的方法通常将缺陷所在的单一语句输入模型进行训练,所包含的缺陷上下文信息有限,影响模型从中学习缺陷修复模式的能力。

  (3)现有的方法在序列化源代码时根据空格将其分割为单独的单词,并对源代码中存在的变量名、函数名等用户自定义标识符统一抽象表示,导致序列化形成的词汇表中损失了部分缺陷上下文语义信息,阻碍模型生成有效补丁的能力。

  (4)目前基于深度学习的修复方法粒度过粗,缺陷类型和对应修复模式之间没有建立映射关系,而是将缺陷全部视为单一类型,这种方式使模型在学习过程中需要关注多种修复模式,无法捕捉和输入缺陷紧密相关的修复特征,难以生成更有针对性的补丁。

  1.3 本文研究内容根据

  1.2 节提出的现有相关方法在数据获取、数据处理等方面存在的不足,本文提出一种基于深度学习技术的缺陷修复解决方案,具体研究内容如下:

  (1)研究从开源仓库中获取训练数据的方法。

  通过分析现有基于简单规则从开源仓库中获取数据的方法中存在的不足,提出一种基于大规模开源仓库的数据优化方法,利用数据筛选过程对开源仓库中的数据进行提纯,并且为了捕获对缺陷修复有意义的上下文信息,提出一种基于程序控制流和数据流的程序切片方法对数据进行预处理。

  (2)研究使用深度学习技术从缺陷-修复数据中学习缺陷修复模式并生成补丁的方 法。

  因为每种缺陷的修复操作具有相似性,本文通过提取源代码的 AST 结构特征,训练一个基于代码语法特征和结构特征的相似性缺陷预分类模型,为待修复缺陷匹配最相似的补丁生成模型。并构建基于局部注意力机制的 Encoder-Decoder 模型学习缺陷的修复模式,实现自动生成补丁的目标。

  本文的主要贡献有以下几点:

  (1)提出一种基于大规模开源仓库的"多筛选与预处理融合"的数据优化方法。

  首先,基于 commit 的变更类型、正则表达式以及分类模型对开源仓库中的缺陷数据进行三次筛选,剔除了 91%的低质量数据,并根据 CWE 描述对数据进行分类,经过这些步骤可以得到来自开源仓库的高质量数据样本。再使用程序控制流和数据流信息对缺陷程序进行切片,这种预处理方法能够去除无关的上下文信息,使模型能够从与缺陷紧密相关的控制流和数据流中学习更精确的缺陷修复模式。

  (2)提出一种基于 Encoder-Decoder 的程序缺陷修复模型。

  首先,提取源代码的 AST 路径作为其结构特征,并使用注意力机制从中学习源代码的向量化表示,这种源代码表示方法能够充分捕捉缺陷程序所蕴含的语法特征和层次结构特征,利用双向长短时记忆网络 (Bi-directional Long Short-Term Memory, BiLSTM) 自动地学习这种缺陷特征,根据程序语法特征和结构特征训练一个可以检测缺陷相似性的缺陷预分类模型;同时使用基于子词表示的序列化方法对每种类型的缺陷程序及修复程序进行序列化及向量化表示,基于子词表示的序列化方法能够兼顾使用字符级别和单词级别序列化方法的优点,并且在缩小序列化词汇表范围的同时,可以保留全部用户自定义标识符信息,这些信息包含充分的与缺陷修复相关的文本语义信息,可以提升模型推断补丁生成的能力;最后利用基于 Encoder-Decoder 的补丁生成模型自动地学习缺陷修复模式。

  (3)设计并实现缺陷修复模型的原型系统 VulRepair,并对 VulRepair 的缺陷修复能力进行评估。

  设计并实现本文提出的缺陷修复模型,详细介绍 VulRepair 的各个模块和具体功能。并且在基准数据集和开源仓库数据集上对比 VulRepair 和其他 11 种先进方法的缺陷修复能力,证明 VulRepair 和已有的工作相比,能够对基准数据集和真实场景中的缺陷生成更多有效补丁。并且通过实验分别评估本文提出的基于子词表示的序列化方法、基于控制流和数据流对程序切片的数据预处理方法、以及基于程序 AST 结构特征的缺陷预分类模型对系统修复能力的影响。

  1.4 本文组织结构

  本文主要从基于深度学习的程序自动修复方法展开,针对目前程序修复研究领域中存在的问题与挑战,提出一种相应的解决方案,并详细说明具体的缺陷修复过程。

  本文一共划分为五个章节对基于 Github 程序自动修复方法研究展开详细论述,各章节的主要研究内容如下:

  第一章 引言首先介绍了程序缺陷修复工作的研究背景和意义,然后通过简要概括程序缺陷修复领域的研究进展,进一步分析当前研究所面临的问题和挑战。接着根据目前所存在的问题给出本文的研究思路,简要描述研究方法及主要贡献,最后介绍文章的组织结构。

  第二章 程序缺陷修复方法本章将详细阐述程序缺陷修复领域的研究历程和相关技术,对每一种类型的缺陷修复技术展开描述,并且讨论当前技术的局限性。

  第三章 基于大规模开源仓库的高质量数据优化方法本章将针对已有方法从开源仓库中获取数据时存在的不足,介绍本文提出的高质量数据优化方法过程,首先介绍从开源仓库获得高质量数据的提取方法,然后介绍对数据的筛选过程,最后介绍对数据的预处理方法。经过一系列优化操作,可以显著提升从开源仓库中获取数据的质量,是下一章进行缺陷修复工作的基础。

  第四章 基于 Encoder-Decoder 的程序缺陷修复模型本章将系统的介绍提出的基于 Encoder-Decoder 的程序缺陷修复模型,是本文研究的重点内容。首先介绍对源代码的两种向量化方式,然后详细介绍提出的缺陷预分类模型及补丁生成模型的模型结构和训练过程,通过缺陷预分类模型可以为待修复缺陷选择最匹配的补丁生成模型。最后介绍补丁的生成和评估过程。

  第五章 系统实验评估与分析本章将介绍对第三章、第四章所提出模型的系统设计、实现,以及实验评估过程,首先介绍缺陷修复系统的设计与实现,然后介绍对系统进行评估实验的细节,包括实验数据、实验环境、实验设置等内容,然后展示和几种先进方法的对比结果,从多个方面对系统进行评估。

  总结与展望

  本章将对本文的研究工作进行总结,简要描述研究动机、解决方案、以及最终的修复结果。特别地,还分析了研究过程中存在的不足,并提出合理的展望。

  第二章 程序缺陷修复方法

  2.1 研究现状

  2.1.1 基于生成-验证的缺陷修复技术

  2.1.2 基于语义合成的缺陷修复技术

  2.1.3 基于手工提取修复模式的缺陷修复技术

  2.1.4 基于深度学习提取修复模式的缺陷修复技术

  2.2 当前研究的局限性

  2.3 本章小结

  第三章 基于大规模开源仓库的高质量数据优化方法

  3.1 高质量数据优化方法概述

  3.2 Github 仓库获取

  3.2.1 Github 仓库与 commit 介绍

  3.2.2 commit 存在问题

  3.2.3 基于排序的 Github 仓库获取

  3.3 commit 筛选

  3.3.1 基于变更类型的一次筛选

  3.3.2 基于正则表达式的二次筛选

  3.3.3 基于 BiLSTM 分类模型的三次筛选

  3.3.4 基于关键词模式匹配的 commit 分类

  3.4 数据预处理

  3.4.1 解析变更文件对

  3.4.2 提取变更函数对

  3.4.3 基于程序控制流和数据流的切片方法

  3.5 本章小结

  第四章 基于 Encoder-Decoder 的程序缺陷修复模型

  4.1 程序缺陷修复模型介绍

  4.2 源代码特征提取与向量化表示

  4.2.1 基于文本特征与子词表示的源码向量化

  4.2.2 基于 AST 结构特征与注意力机制的源码向量化

  4.3 基于程序 AST 结构特征的 BiLSTM 缺陷预分类模型

  4.3.1 BiLSTM 神经网络介绍

  4.3.2 学习分类特征

  4.4 基于 Encoder-Decoder 的补丁生成模型

  4.4.1 基于局部注意力机制的 Encoder-Decoder 模型介绍

  4.4.2 学习缺陷修复模式

  4.4.3 补丁生成与验证

  4.5 本章小结

  第五章 系统实验评估与分析

  5.1 VulRepair 原型系统设计与实现

  5.1.1 系统实现与模块设计

  5.1.2 系统界面展示

  5.2 VulRepair 系统实验设计

  5.2.1 实验数据

  5.2.2 实验环境与配置

  5.2.3 实验设置

  5.2.4 对比工作介绍

  5.2.5 评估指标

  5.3 不同序列化方法对模型修复效果的影响实验

  5.4 不同预处理方法对模型修复效果的影响实验

  5.5 缺陷预分类模型对模型修复效果的影响实验

  5.6 与其他缺陷修复工具的对比实验

  5.6.1 基于 Java 基准数据集的对比

  5.6.2 基于开源仓库数据集的对比

  5.7 修复实例分析

  5.7.1 在 Java 基准数据集上的修复结果

  5.7.2 在 Github 数据集上的修复结果

  5.8 本章小结

  总结与展望

  总结

  随着软件规模的扩大,软件缺陷越来越成为阻碍软件发展的重要因素。目前的程序缺陷自动修复方法研究中,基于生成-验证的方法普遍存在搜索空间不能捕获正确补丁分布的问题,导致生成的候选补丁中,很少有和缺陷程序语义保持一致的正确补丁。其中基于手工提取修复模式的缺陷修复方法不仅需要人工定义修复特征,而且在修复缺陷时采用单一的代码修改粒度,因此只能应用于修复某些特定类型的缺陷。基于深度学习提取修复模式的缺陷修复方法依赖大数据可以改善手工提取修复模式的不足,在修改缺陷语句上的操作粒度更加多样化,解决了自动化提取修复模式并生成有效补丁的难题。

  但基于深度学习的缺陷修复方法在修复实际开发过程中开发人员编写的缺陷时,其生成补丁的有效率和正确率有待进一步提升,原因主要有以下几点:

  (1)目前基于深度学习提取修复模式的缺陷修复方法通常使用简单的规则从开源仓库中筛选训练数据,这种方式无法去除一些低质量的数据,不能使缺陷修复模型发挥出最好的修复能力,导致模型学习的特征有限,影响修复效果。

  (2)现有的方法在处理程序上下文信息时,将缺陷和修复所在的单一语句输入模型中进行训练,包含的缺陷上下文信息有限,使模型难以捕捉到对缺陷修复有意义的重点上下文依赖特征,阻碍模型提取缺陷修复模式的能力。

  (3)已有的方法使用单一的粒度对源码进行序列化处理,并且抽象表示源码中大量存在的用户自定义标识符,导致序列化形成的词汇表中丢失了许多对缺陷修复有意义的上下文信息,影响模型修复缺陷的效果。

  (4)现有研究方法对所有缺陷使用同一个缺陷修复模型进行修复,忽略关注不同缺陷类型对应修复模式的不同,使模型无法针对每种缺陷类型学习具体的修复模式,阻碍模型对待修复缺陷生成精确匹配补丁的能力。

  针对上述存在问题,本文做出以下改进:

  (1)通过构建基于大规模开源仓库的高质量数据优化方法,提升从开源平台挖掘训练数据的质量,并提出一种基于 Encoder-Decoder 的程序缺陷修复模型。

  (2)使用基于程序控制流和数据流的切片方法对缺陷及对应修复程序进行切片,去除代码中无关的上下文信息,减轻模型训练压力,使模型能够从中提取和缺陷紧密相关的上下文特征,从而学习更精确的缺陷修复模式。

  (3)使用基于子词表示的序列化方法对源码进行预处理,尽可能多的保留源码中的语义信息。实验证明这种方式优于基于单词粒度和字符粒度的两种序列化方式。 (4)通过学习不同缺陷类型的程序 AST 结构特征,在生成补丁之前对缺陷进行预分类,根据匹配结果选择不同的补丁生成模型进行缺陷修复,实验证明这种方法相比较不区分缺陷种类的模型修复效果要好。

  本文实现了所提出的程序缺陷修复模型的原型系统 VulRepair,并从开源仓库上选择多种缺陷类型数据、以及多种先进的缺陷修复方法对 VulRepair 进行实验评估和对比分析。最后得出结论,VulRepair 无论是对基准数据集上的缺陷,还是来自开源仓库中的缺陷,其直接生成有效补丁和正确补丁的效果均优于现有的方法,并且避免了对同一个缺陷多个候选补丁进行验证的搜索过程。

  展望

  本文提出的缺陷修复模型,尽管和目前的研究方法相比表现较好,但本文仍然不可避免的存在一些局限性,有待接下来进一步研究。

  (1)目前本文提出的缺陷修复方法主要在 Java 程序上进行实验和评估,但是该方法是与语言无关的,并不局限于某种具体编程语言,因此未来的工作可以将本文提出的缺陷修复方法迁移到对其他编程语言的缺陷修复中,研究其在 C、Python 等语言中的修复效果差异。

  (2)目前评估了本文提出的缺陷修复模型在十种常见缺陷类型上的修复结果,接下来将计划使用该方法来修复更多具有挑战性的软件缺陷问题,对比在不同缺陷上的修复能力。

  (3)与目前的缺陷修复方法相同,本文提出的方法在实施缺陷修复时依然需要依赖于缺陷定位技术,因此,在接下来的研究中,可以探索使用深度学习技术和细粒度切片技术将缺陷定位过程和缺陷修复过程结合,实现对缺陷定位的同时,完成自动化的缺陷修复。

  参考文献

  [1] Synopsys OSSRA Report. [EB/OL]. https://www.synopsys.com/software-integrity/resources/analyst-reports/2020-open-source-security-risk-analysis.html.

  [2] Britton T., Jeng L., Carver G., et al. Reversible debugging software[J]. Tech. Rep., 2013:157-165.

  [3] Goues C. L., Nguyen T. V., Forrest S., et al. Genprog: a generic method for automatic softwarerepair[C]. IEEE Transactions on Software Engineering, 2012, 38(1): 54-72.

  [4] Fan L., Rinard M. Staged program repair with condition synthesis[C]. In Proceedings of the 201510th Joint Meeting on Foundations of Software Engineering, 2015: 166-178.

  [5] Durieux T., Monperrus M. DynaMoth: Dynamic Code Synthesis for Automatic Program Repair[C].International Workshop on Automation of Software Test, 2016: 85-91.

  [6] Yang J., Zhikhartsev A., Liu Y., et al. Better test cases for better automated program repair[C]. InProceedings of the 2017 11th Joint Meeting on Foundations of Software Engineering, 2017: 831-841.

  [7] Fan L., Rinard M. An Analysis of the Search Spaces for Generate and Validate Patch GenerationSystems[C]. International Conference, IEEE, 2016: 702-713.

  [8] Alexandru C. V. Guided code synthesis using deep neural networks[C]. In Proceedings of the 201624th ACM SIGSOFT International Symposium on Foundations of Software Engineering, 2016:1068-1070.

  [9] Eddie A. S., Joshua C. C., Abram H., et al. Finding and correcting syntax errors using recurrentneural networks[J]. PeerJ PrePrints, 2017, 5: e3123v1.

  [10] 王赞, 郜健, 陈翔,等。 自动程序修复方法研究述评[J]. 计算机学报, 2018, 41(003):588-610.

  [11] Weimer W., Fry Z. P., Forrest S. Leveraging program equivalence for adaptive program repair:Models and first results[C]. Automated Software Engineering (ASE), ACM, 2013:356-366.

  [12] Fan L., Rinard M. Automatic patch generation by learning correct code[J]. ACM SIGPLAN Notices,2016, 51(1):298-312.

  [13] Kim D., Nam J., Song J., et al. Automatic patch generation learned from human-written patches[C].

  2013 35th International Conference on Software Engineering (ICSE), 2013:802-811.

  [14] Qi Y., Mao X., Yan L., et al. The strength of random search on automated program repair[C]. The36th International Conference on Software Engineering (ICSE 2014), ACM, 2014:254-265.

  [15] Martinez M., Weimer W., Monperrus M. Do the Fix Ingredients Already Exist? An EmpiricalInquiry into the Redundancy Assumptions of Program Repair Approaches, ACM, 2014:492-495.

  [16] Jiang J., Xiong Y., Zhang H., et al. Shaping Program Repair Space with Existing Patches and SimilarCode[C]. International Symposium on Software Testing & Analysis, 2018:298-309.

  [17] Ke Y., Stolee K T., Goues C L., et al. Repairing Programs with Semantic Code Search(T)[C].

  IEEE/ACM International Conference on Automated Software Engineering, ACM, 2016:295-306.

  [18] Liu K., Koyuncu A., Kim K., et al. LSRepair: Live Search of Fix Ingredients for Automated ProgramRepair[C]. 2018 25th Asia-Pacific Software Engineering Conference (APSEC), 2018:658-662.

  [19] Debroy V., Wong W E. Using Mutation to Automatically Suggest Fixes for Faulty Programs[C].Third International Conference on Software Testing, 2010:65-74.

  [20] Jha S., Gulwani S., Seshia S. A., et al. Oracle-guided component-based program synthesis[C].Acm/ieee International Conference on Software Engineering, IEEE, 2010:215-224.

  [21] Chandra S., Torlak E., Barman S., et al. Angelic debugging[J]. Proceedings of the InternationalConference on Software Engineering, 2011:121-130.

  [22] Nguyen H. D. T., Qi D. W., Roychoudhury A., et al. SemFix: Program repair via semanticanalysis[C]. Proceedings of the International Conference on Software Engineering, 2013:772-781.

  [23] Mechtaev S., Yi J., Roychoudhury A. DirectFix: Looking for simple program repairs[C].Proceedings of the International Conference on Software Engineering, 2015: 448-458.

  [24] Xuan J. F., Martinez M., DeMarco F., et al. Nopol: Automatic repair of conditional statement bugsin Java programs[J]. IEEE Transactions on Software Engineering, 2017, 43(1):34-55.

  [25] DeMarco F., Xuan J. F., Berre D. L., et al. Automatic repair of buggy if conditions and missingpreconditions with SMT[C]. ACM, 2014:30-39.

  [26] Marcote S., Monperrus M. Automatic Repair of Infinite Loops[J]. Computer Science, Arxiv:1504.05078v1, 2015.

  [27] Saha R. K., Yoshida H., Prasad M. R., et al. Elixir: an automated repair tool for Java programs[C].ICSE, 2018: 77-80.

  [28] Le X., Lo D., Goues C. L. History Driven Program Repair[C]. 23rd IEEE International Conferenceon Software Analysis, Evolution, and Reengineering (SANER), 2016:213-224.

  [29] Liu K., Koyuncu A., Kim D., et al. TBar: Revisiting Template-based Automated Program Repair[C].the 28th ACM SIGSOFT International Symposium. ACM, 2019:31-42.

  [30] Gupta R., Pal S., Kanade A., et al. DeepFix: Fixing Common C Language Errors by DeepLearning[C]. In AAAI, 2017: 1345-1351.

  [31] Tufano M., Watson C., Bavota G., et al. An empirical investigation into learning bug-fixing patchesin the wild via neural machine translation[C]. the 33rd ACM/IEEE International Conference. ACM,2018:832-837.

  [32] Chen Z., Kommrusch S., Tufano M., et al. SequenceR: Sequence-to-Sequence Learning for End-toEnd Program Repair[J]. CoRR abs/1901.01808, 2019.

  [33] Gu J., Lu Z., Li H., et al. Incorporating Copying Mechanism in Sequence-to-Sequence Learning[C].

  Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics, 2016: 199-208.

  [34] Just R., Jalali D., MD Ernst. Defects4J: a database of existing faults to enable controlled testingstudies for Java programs[C]. International Symposium on Software Testing & Analysis. ACM,2014: 437-440.

  [35] Lutellier T., Pang L., Pham V H., et al. ENCORE: Ensemble Learning using Convolution NeuralMachine Translation for Automatic Program Repair[J]. CoRR abs/1906.08691 (2019)。

  [36] Zhou Y., Sharma A. Automated identification of security issues from commit messages and bugreports[C]. Joint Meeting, 2017:914-919.

  [37] Github REST API. [EB/OL]. https://docs.Github.com/cn/rest/overview/resources-in-the-rest-api.

  [38] Serena E. P., Henrik P., Antonino S., et al. Cédric Dangremont:A manually-curated dataset of fixesto vulnerabilities of open-source software[C]. MSR, 2019: 383-387.

  [39] Tomas M., Ilya S., Kai C., et al. Distributed representations of words and phrases and theircompositionality[C]. In Advances in neural information processing systems, 2013:3111-3119.

  [40] GumTree. [EB/OL]. https://Github.com/GumTreeDiff/gumtree.

  [41] 柯鑫。 基于大型开源仓库的软件源代码漏洞检测方法研究与实现[D]. 西北大学, 2020.

  [42] Silva J. A vocabulary of program slicing-based techniques[J]. ACM Computing Surveys, 2012,44(3):1-41.

  [43] Li Z., Zou D., Xu S., et al. VulDeepecker:A deep learning-based system for vulnerability detection[J].NDSS, 2018: 18-21.

  [44] Sennrich R., Haddow B., Birch A. Neural Machine Translation of Rare Words with SubwordUnits[J]. Computer Science, CoRR abs/1508.07909, 2015.

  [45] Hochreiter S., Schmidhuber J. Long Short-Term Memory[J]. Neural Computation, 1997, 9(8):1735-1780.

  [46] 凌波。 基于缺陷上下文深度学习的程序修复方法[D]. 哈尔滨工业大学, 2020.

  [47] Cho K., Merrienboer B V., Bahdanau D., et al. On the Properties of Neural Machine Translation:Encoder-Decoder Approaches[J]. Computer Science, 2014:103-111.

  [48] Sutskever I., Vinyals O., Le Q. V. Sequence to Sequence Learning with Neural Networks[J].Advances in neural information processing systems, arXiv:1409.3215, 2014.

  [49] Luong M T., Pham H., Manning C. D. Effective Approaches to Attention-based Neural MachineTranslation[J]. Computer ence, 2015: 1412-1421.

  [50] EvoSuite. [EB/OL]. https://www.evosuite.org/.

  [51] JGenProg. [DB/OL]. https://github.com/SpoonLabs/astor/tree/master/src-jgenprog.

  [52] Xiong Y., Wang J., Yan R., et al. Precise Condition Synthesis for Program Repair[C]. ICSE, 2017:416-426.

  [53] Saha R. K., Yoshida H., Prasad M. R., et al. Elixir: an automated repair tool for Java programs[C].

  ICSE (Companion Volume), 2018: 77-80.

  [54] ssFix Repair. [DB/OL]. https://github.com/sharpFix18/sharpFix.

  [55] Li Y., Wang S., Nguyen T. N. DLFix: Context-based Code Transformation Learning for AutomatedProgram Repair[C]. ICSE, 2020:602-614.

  致谢

  光阴荏苒、岁月如梭,美好的日子总是转瞬即逝,不经意间已在西北大学度过了人生中最充实的七年时光。这一路走来,我不仅掌握了相关专业技能,还学会了如何在团队中和其他人沟通合作,也在成长的过程中懂得了感恩。

  回首往事,总有一些人在前行的途中给予我无私的帮助、陪伴和关怀,因此在文章的最后,我由衷的向大家表示感谢。首先我要以最崇高的敬意感谢我的导师房鼎益教授,早在本科时期,受房老师严谨认真的治学态度影响,使我坚定了在计算机领域深入研究的信念,并且有幸在房老师的引领下来到 NISL 网络安全实验室继续学习。

  其次,我由衷的感谢汤战勇教授在科研过程中对我的悉心指导,正是因为您的认真指导使我意识到自身存在的不足和优势,也正是因为您对实验室的严格管理督促我养成了良好的作息习惯。这些谆谆教诲让我终生受益匪浅。我还要感谢叶贵鑫老师,当我刚进入实验室时,被分配到了您的课题组,在您的带领下逐渐上手了对验证码安全性分析这个课题,这个过程使我不仅明白了网络安全的重要性,也学会了如何参与团队协作,如何在动手实践中学习,还要感谢您在日常生活及科研中对我相关困惑的指导与答疑,您严谨的科研态度一直影响着我。我要感谢柯鑫学姐、孔维星、田超雄两位学长在我遇到实际编程问题时对我的帮助和支持。还要感谢一同并肩奋斗的范天赐、冯晖、贺怡、李朋、田洋、王焕廷、薛永康、姚厚友、张梦欢、张宇翔十位同学,感谢你们与我一起分享知识和生活中的快乐,相聚是一种缘,正是因为有了你们的陪伴,才使得这三年的时光趣味与收获并存。我还要感谢我生命中的另一半任博先生,感谢你对我的包容、理解与支持,感谢你在找工作期间对我的指导以及论文撰写期间对我论文的认真校对,亦祝愿你未来的科研之路顺利坦荡、硕果累累。最后,感谢父母二十三年如一日对我的辛勤抚养,感谢爷爷、姑姑、姑父对我读研的支持与关怀,正是因为您们对家庭的无私付出,才使得我可以无忧无虑的完成学业。

  最后,祝愿母校西北大学枝繁叶茂、人才济济,也祝愿 NISL 实验室的发展日新月异,培育出更高层次的栋梁之才,最后祝愿相逢一场的各位前途似锦,平安顺遂。

(如您需要查看本篇毕业设计全文,请您联系客服索取)

相关内容
相关标签:Java毕业设计
好优论文定制中心主要为您提供代做毕业设计及各专业毕业论文写作辅导服务。 网站地图
所有论文、资料均源于网上的共享资源以及一些期刊杂志,所有论文仅免费供网友间相互学习交流之用,请特别注意勿做其他非法用途。
如有侵犯您的版权或其他有损您利益的行为,请联系指出,论文定制中心会立即进行改正或删除有关内容!