CN112463424A - 一种基于图的端到端程序修复方法 - Google Patents

一种基于图的端到端程序修复方法 Download PDF

Info

Publication number
CN112463424A
CN112463424A CN202011265976.3A CN202011265976A CN112463424A CN 112463424 A CN112463424 A CN 112463424A CN 202011265976 A CN202011265976 A CN 202011265976A CN 112463424 A CN112463424 A CN 112463424A
Authority
CN
China
Prior art keywords
node
graph
nodes
defect
program
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202011265976.3A
Other languages
English (en)
Other versions
CN112463424B (zh
Inventor
李斌
唐奔
孙小兵
倪珍
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Yangzhou University
Original Assignee
Yangzhou University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Yangzhou University filed Critical Yangzhou University
Priority to CN202011265976.3A priority Critical patent/CN112463424B/zh
Publication of CN112463424A publication Critical patent/CN112463424A/zh
Application granted granted Critical
Publication of CN112463424B publication Critical patent/CN112463424B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/0703Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
    • G06F11/0793Remedial or corrective actions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/21Design or setup of recognition systems or techniques; Extraction of features in feature space; Blind source separation
    • G06F18/214Generating training patterns; Bootstrap methods, e.g. bagging or boosting
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N20/00Machine learning

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Artificial Intelligence (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Evolutionary Computation (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Evolutionary Biology (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Medical Informatics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Quality & Reliability (AREA)
  • Devices For Executing Special Programs (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

本发明公开了一种基于图的端到端程序修复方法,属于软件调试领域,该方法包括:缺陷数据集构建;缺陷程序切片;缺陷代码图嵌入;构建和训练Graph2Seq模型;利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性。本发明提出的方法使用图表征代码,可以充分挖掘代码缺陷语句及其上下文之间的语法、语义关联,更好地学习缺陷的特征,从而生成质量更高、可读性更强的修复补丁,达到自动修复程序缺陷的目的,能极大提升自动程序修复的效率。

Description

一种基于图的端到端程序修复方法
技术领域
本发明属于软件调试领域,特别涉及一种基于图的端到端程序修复方法。
背景技术
软件开发过程中,由于各个阶段的综合作用,产生程序缺陷(bug)是不可避免的,而有历史数据表明45%的软件开发成本消耗于定位和修复的过程中。在软件开发人员和维护人员确定缺陷产生的位置之后,往往需要花费大量的精力去人工修复发现的缺陷。因此,为了降低修复过程的成本,工业生产和学术研究领域开始研究自动程序修复的方法。
目前自动程序修复仍处于发展阶段,其中主流的程序修复方法是基于测试集的修复方法。基于测试集的修复方法主要分为三类。第一类是启发式的方法,该方法在程序修改产生的搜索空间上进行补丁构造和迭代以生成能够通过测试集验证的补丁。第二类是基于约束的方法,这类方法通过构建补丁代码应该满足的约束条件并通过这些约束条件生成正确的补丁。第三类方法是基于学习的方法,这一类方法结合最新的深度学习模型,用深度学习的方法代替人工特征提取的过程并自动化地生成修复补丁。三类方法中,第一类和第二类方法多采用人工提取缺陷特征或模式的方法,但由专家手动提取特征和模式的方法效率低下且主观性较强,缺乏泛化能力;而第三类方法虽然避免了大量的人工干预,但是由于没有找到更合适的代码表征方法,其采用的模型无法学习到足够的程序缺陷特征信息导致修复能力低下。
发明内容
本发明的目的在于提供一种具有代码表征方式新颖、缺陷特征提取能力优异、泛化性能和修复能力强劲等特点的自动程序修复方法。
实现本发明目的的技术解决方案为:一种基于图的端到端程序修复方法,所述方法包括以下步骤:
步骤1,构建缺陷数据集;
步骤2,进行缺陷程序切片,提取与缺陷语句相关的上下文;
步骤3,进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构;
步骤4,构建并训练Graph2Seq模型;
步骤5,利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性。
进一步地,步骤1所述构建缺陷数据集具体过程包括:
步骤1-1,从开源软件存储库中获取缺陷数据及修复补丁对;
步骤1-2,对成对的代码数据进行预处理:选取仅修改单行语句的修复补丁,保留当前修改语句所在的函数上下文,删除多余语句,对该修复补丁对应的进行同样的处理,获得数据集;
步骤1-3,随机选取数据集中80%的缺陷代码与修复补丁对作为训练集,剩余的20%作为测试集。
进一步地,步骤2所述进行缺陷程序切片,提取与缺陷语句相关的上下文,具体包括:
步骤2-1,利用工具Checkmarx将代码数据切片,删除与缺陷和修复无关的代码行,保留与缺陷和修复有语义关联的代码行;
步骤2-2,在缺陷语句首尾插入特殊单词标记,该标记用来控制生成补丁过程的起止。
进一步地,步骤3所述进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构,具体过程包括:
步骤3-1,对经上述处理后的代码进行表征,具体包括:将程序代码转换为AST树,并根据程序语法和语义,利用不同类型的边连接AST树中的结点,形成不同类型的图;
步骤3-2,基于所述AST树和不同类型的图,构建语料库;
步骤3-3,利用Word2vec,对语料库中的tokens进行词向量学习,获得一组词向量。
进一步地,步骤3-1中所述利用不同类型的边连接AST树中的结点,形成不同类型的图,具体包括:
(1)根据程序数据流使用LastRead、LastWrite、ComputedFrom三种边连接相关结点构成数据流图DataFlowGraph;
(2)根据程序表达式结构使用GuardedBy、GuardedByNegation两种边连接相关结点构建参数闭合图GuardedByGraph;
(3)根据程序语句顺序结构使用NextToken边连接相关结点构成顺序图NextTokenGraph;
(4)根据程序中函数与变量的调用关系使用Returns To、FormalArgName两种边连接相关结点构成调用图CallGraph。
进一步地,步骤3-2所述基于所述AST树和不同类型的图,构建语料库,具体过程包括:
步骤3-2-1,提取所述AST树和不同类型的图中的结点,标记为token,构建语料库;
步骤3-2-2,将使用驼峰命名法和下划线命名法的标记token拆分为多个子token。
进一步地,步骤4所述构建并训练Graph2Seq模型,具体过程包括:
所述Graph2Seq模型,包括图编码器和序列解码器两部分;
(1)构建图编码器,具体包括:
步骤4-1,输入步骤3-1得到的缺陷代码图,添加全局结点global并初始化,该结点与图中所有结点直接相连;
步骤4-2,将上述代码图转化为最短路径图:对于任意两个结点i、j,计算两者之间的最短路径,得到结点之间的路径图;
步骤4-3,结点i、j之间的关系定义为两个结点之间的路径,将路径图中的边表示为边结点,用边结点插入到原结点之间替换原有的边,则结点i和结点j之间的最短关系路径表示为:
spi→j=[e(i,k1),e(k1,k2),...,e(kn,j)]
或spj→i=[e(j,k1),e(k1,k2),...,e(kn,i)]
式中,spi→j表示结点i到结点j之间的关系路径,spj→i表示结点j到结点i之间的关系路径,若记spi→j为结点i和结点j之间的正向最短关系路径,则spj→i为结点i和结点j之间的正向最短关系路径,e(·,·)代表边的标签即两个结点之间相连的边的类型,k表示中继结点,ki表示第i个中继结点,i=1,2,...,n,n表示结点i和结点j关系路径上结点数量;
步骤4-4,进行关系编码;
利用双向GRU模型对关系路径信息进行序列编码:
Figure BDA0002776135800000031
Figure BDA0002776135800000032
式中,t为当前时间步,
Figure BDA0002776135800000033
为t时刻正向状态向量,
Figure BDA0002776135800000034
为t时刻反向状态向量,f代表正向路径,b代表反向路径,spt指t时刻的最短关系路径;GRU为门控循环单元,其能根据前一时刻结点状态向量和当前时刻的输入计算得出当前时刻的结点状态向量;
则结点i、j之间的关系编码表示为:
Figure BDA0002776135800000041
即在运行n个时间步后,n时刻的正向状态向量和0时刻的反向状态向量拼接组成结点之间的关系向量;
步骤4-5,结点位置信息嵌入,计算每一个结点与其所在AST树中根结点之间的距离,使用位置编码对距离信息进行编码,与步骤3-3中得到的结点词向量连接,得到初始结点向量表示;
步骤4-6,结合步骤4-4得到的结点间关系向量rij和步骤4-6得到的初始结点向量表示,计算结点之间全局注意力得分sij
Figure BDA0002776135800000042
将上述公式展开得:
Figure BDA0002776135800000043
式中,xi、xj分别为结点i和结点j的初始结点向量表示,ri→j和rj→i分别表示结点间关系向量rij的正向部分和反向部分,Wq T为查询向量的转置,Wk为键向量,查询向量和键向量由词嵌入和对应的权重矩阵相乘后创建;该公式中四个子式从左至右分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
拆分出的四个子式分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
(2)构建序列解码器:解码器根据编码器学习所得向量表示预测生成的序列中当前位置可能出现的token及其出现概率,顺序进行这个过程得到候选token序列及其生成概率,具体包括:
步骤4-7,根据步骤4-6得到的全局注意力得分sij和当前预测位置之前生成的token序列,预测当前位置可能出现的token;
步骤4-8,重复进行步骤4-7的token预测过程,通过步骤2-2中插入的特殊标记控制token预测过程的起止,序列解码器的输出是候选token序列及其对应的概率;
(3)训练Graph2Seq模型
步骤4-10,计算概率最大的候选token序列与训练集中真实值的损失值loss,根据损失值loss,利用梯度下降法更新上述步骤所构建的Graph2Seq模型中的参数。
进一步地,步骤5所述利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性,具体过程包括:
步骤5-1,针对存在缺陷并定位到问题语句的程序,重复步骤2-1进行程序切片,得到与缺陷相关代码语句;重复步骤3-1,将缺陷相关代码语句转化为图;重复步骤3-3,将得到的图进行嵌入,之后输入到训练后的Graph2Seq模型,输出与问题语句相对应的候选修复token序列,并根据预测概率对候选序列进行降序排序形成token列表;
步骤5-2,根据token列表还原token序列得到候选修复语句列表;
步骤5-3,验证候选补丁正确性:将每个候选修复语句返回程序并替换缺陷代码语句,之后通过给定的测试用例集计算测试通过率,将通过率高于预设阈值修复语句保留,返回可用修复语句列表。
本发明与现有技术相比,其显著优点为:1)采用图表示的方法对缺陷程序进行表示,通过建立多种类型的图来表达代码丰富的语法语义信息,从而更好地提取缺陷特征;2)图表示过程中建立的图与编程语言类型无关,相较于传统的程序表示方法,具备语言无关性,从而使模型具备更强的泛化能力;3)采用程序切片的方法对缺陷语句的上下文进行精简,在保留程序语义信息的同时极大减少了上下文的长度,进一步提高了修复模型的效率;4)提出引入关系编码的方法和注意力机制,相比于传统的编码器,引入注意力机制的编码器参数更少,速度更快,对距离较远的结点之间使用关系编码的方法将距离信息编码使编码器对于结点之间的长距离依赖关系有更强的学习能力。
下面结合附图对本发明作进一步详细描述。
附图说明
图1为一个实施例中基于图的端到端程序修复方法的流程图。
图2为一个实施例中程序切片效果示意图;
图3为一个实施例中代码数据流图DataFlowGraph示意图
图4为一个实施例中Graph2Seq模型示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅用以解释本申请,并不用于限定本申请。
在一个实施例中,结合图1,本发明提出了一种基于图的端到端程序修复方法,该方法包括以下步骤:
步骤1,构建缺陷数据集;
步骤2,进行缺陷程序切片,提取与缺陷语句相关的上下文;
步骤3,进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构;
步骤4,构建并训练Graph2Seq模型;
步骤5,利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性。
进一步地,在其中一个实施例中,步骤1所述构建缺陷数据集具体过程包括:
步骤1-1,从开源软件存储库GitHub采集代码文件,从项目的提交历史中提取关键词为“fix”、“bug”和“patch”的提交,提取出缺陷代码与修复补丁对;
步骤1-2,对成对的代码数据进行预处理:选取仅修改单行语句的修复补丁,保留当前修改语句所在的函数上下文,删除多余语句,对该修复补丁对应的进行同样的处理,获得数据集;
步骤1-3,随机选取数据集中80%的缺陷代码与修复补丁对作为训练集,剩余的20%作为测试集。
进一步地,在其中一个实施例中,步骤2所述进行缺陷程序切片,提取与缺陷语句相关的上下文,具体包括:
步骤2-1,利用工具Checkmarx将代码数据切片,删除与缺陷和修复无关的代码行,保留与缺陷和修复有语义关联的代码行;
步骤2-2,在缺陷语句首尾插入特殊单词标记,该标记用来控制生成补丁过程的起止。
采用本实施例的方案,通过程序切片对程序进行加工,能够极大地减少缺陷语句的上下文,提高模型学习的效率与精确度。
进一步地,在其中一个实施例中,步骤3所述进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构,具体过程包括:
步骤3-1,对经上述处理后的代码进行表征,具体包括:将程序代码转换为AST树,并根据程序语法和语义,利用不同类型的边连接AST树中的结点,形成不同类型的图;
步骤3-2,基于所述AST树和不同类型的图,构建语料库;
步骤3-3,利用Word2vec,对语料库中的tokens进行词向量学习,获得一组词向量。
采用本实施例的方案,相比于传统的将代码表示成序列的表示方法,能够保留较为完整的语义语法信息,从而进一步提升模型编码器的特征学习效率与解码器的生成准确度。
进一步地,在其中一个实施例中,步骤3-1中所述利用不同类型的边连接AST树中的结点,形成不同类型的图,具体包括:
(1)根据程序数据流使用LastRead、LastWrite、ComputedFrom三种边连接相关结点构成数据流图DataFlowGraph;
(2)根据程序表达式结构使用GuardedBy、GuardedByNegation两种边连接相关结点构建参数闭合图GuardedByGraph;
(3)根据程序语句顺序结构使用NextToken边连接相关结点构成顺序图NextTokenGraph;
(4)根据程序中函数与变量的调用关系使用Returns To、FormalArgName两种边连接相关结点构成调用图CallGraph。
将程序代码表示成上述类型的图可以在保留程序语法和语义的情况下将程序转换为图的形式。
进一步地,在其中一个实施例中,步骤3-2所述基于所述AST树和不同类型的图,构建语料库,具体过程包括:
步骤3-2-1,提取所述AST树和不同类型的图中的结点,标记为token,构建语料库;
步骤3-2-2,将使用驼峰命名法和下划线命名法的标记token拆分为多个子token。
进一步地,在其中一个实施例中,步骤4所述构建并训练Graph2Seq模型,具体过程包括:
所述Graph2Seq模型,包括图编码器和序列解码器两部分;
(1)构建图编码器,具体包括:
步骤4-1,输入步骤3-1得到的缺陷代码图,添加全局结点global并初始化,该结点与图中所有结点直接相连;
步骤4-2,将上述代码图转化为最短路径图:对于任意两个结点i、j,计算两者之间的最短路径,得到结点之间的路径图;
步骤4-3,结点i、j之间的关系定义为两个结点之间的路径,将路径图中的边表示为边结点,用边结点插入到原结点之间替换原有的边,则结点i和结点j之间的最短关系路径表示为:
spi→j=[e(i,k1),e(k1,k2),...,e(kn,j)]
或spj→i=[e(j,k1),e(k1,k2),...,e(kn,i)]
式中,spi→j表示结点i到结点j之间的关系路径,spj→i表示结点j到结点i之间的关系路径,若记spi→j为结点i和结点j之间的正向最短关系路径,则spj→i为结点i和结点j之间的正向最短关系路径,e(·,·)代表边的标签即两个结点之间相连的边的类型,k表示中继结点,ki表示第i个中继结点,i=1,2,...,n,n表示结点i和结点j关系路径上结点数量;
步骤4-4,进行关系编码;
利用双向GRU模型对关系路径信息进行序列编码:
Figure BDA0002776135800000081
Figure BDA0002776135800000082
式中,t为当前时间步,
Figure BDA0002776135800000083
为t时刻正向状态向量,
Figure BDA0002776135800000084
为t时刻反向状态向量,f代表正向路径,b代表反向路径,spt指t时刻的最短关系路径;GRU为门控循环单元,其能根据前一时刻结点状态向量和当前时刻的输入计算得出当前时刻的结点状态向量;
则结点i、j之间的关系编码表示为:
Figure BDA0002776135800000085
即在运行n个时间步后,n时刻的正向状态向量和0时刻的反向状态向量拼接组成结点之间的关系向量;
步骤4-5,结点位置信息嵌入,计算每一个结点与其所在AST树中根结点之间的距离,使用位置编码对距离信息进行编码,与步骤3-3中得到的结点词向量连接,得到初始结点向量表示;
步骤4-6,结合步骤4-4得到的结点间关系向量rij和步骤4-6得到的初始结点向量表示,计算结点之间全局注意力得分sij
Figure BDA0002776135800000091
将上述公式展开得:
Figure BDA0002776135800000092
式中,xi、xj分别为结点i和结点j的初始结点向量表示,ri→j和rj→i分别表示结点间关系向量rij的正向部分和反向部分,
Figure BDA0002776135800000093
为查询向量的转置,Wk为键向量,查询向量和键向量由词嵌入和对应的权重矩阵相乘后创建;该公式中四个子式从左至右分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置,通过这种计算方式可以更好地对结点间的关系进行表征;
拆分出的四个子式分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
(2)构建序列解码器:解码器根据编码器学习所得向量表示预测生成的序列中当前位置可能出现的token及其出现概率,顺序进行这个过程得到候选token序列及其生成概率,具体包括:
步骤4-7,根据步骤4-6得到的全局注意力得分sij和当前预测位置之前生成的token序列,预测当前位置可能出现的token;
步骤4-8,重复进行步骤4-7的token预测过程,通过步骤2-2中插入的特殊标记控制token预测过程的起止,序列解码器的输出是候选token序列及其对应的概率;
(3)训练Graph2Seq模型
步骤4-10,计算概率最大的候选token序列与训练集中真实值的损失值loss,根据损失值loss,利用梯度下降法更新上述步骤所构建的Graph2Seq模型中的参数。
采用本实施例的方案,其中引入关系编码的方法和注意力机制,编码器参数更少,速度更快,对距离较远的结点之间使用关系编码的方法将距离信息编码使编码器对于结点之间的长距离依赖关系有更强的学习能力。
进一步地,在其中一个实施例中,步骤5所述利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性,具体过程包括:
步骤5-1,针对存在缺陷并定位到问题语句的程序,重复步骤2-1进行程序切片,得到与缺陷相关代码语句;重复步骤3-1,将缺陷相关代码语句转化为图;重复步骤3-3,将得到的图进行嵌入,之后输入到训练后的Graph2Seq模型,输出与问题语句相对应的候选修复token序列,并根据预测概率对候选序列进行降序排序形成token列表;
步骤5-2,根据token列表还原token序列得到候选修复语句列表;
步骤5-3,验证候选补丁正确性:将每个候选修复语句返回程序并替换缺陷代码语句,之后通过给定的测试用例集计算测试通过率,将通过率高于预设阈值修复语句保留,返回可用修复语句列表。
作为一种具体示例,在其中一个实施例中,对本发明基于图神经网络的缺陷自动修复方法进行进一步验证说明,包括以下内容:
1、构建缺陷数据集,从开源软件存储库GitHub采集代码文件,从项目的提交历史中提取关键词为“fix”、“bug”和“patch”的提交,提取出缺陷代码与修复补丁对并进行预处理,选取仅修改单行语句的修复补丁,保留当前修改语句所在的函数上下文,删除多余语句,对相应的缺陷代码进行同样的处理,获得数据集,随机选取数据集中80%的缺陷代码与修复补丁对作为训练集,剩余的20%作为测试集。数据集中的一个样本如下表1所示。
表1训练集中某一样本
Figure BDA0002776135800000101
Figure BDA0002776135800000111
2、缺陷程序切片,提取与缺陷语句相关的上下文。对所有程序进行程序切片,通过工具Checkmarx将代码数据切片,并在缺陷代码语句首尾插入特殊标记。如图2,通过程序切片可以删除与缺陷和修复无关的代码行,仅保留与缺陷和修复有语义关联的代码行。
3、缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构,根据程序语法和语义,使用不同类型的边连接AST树中的结点,构建不同类型的图。其中,如图3所示,根据程序数据流使用LastRead、LastWrite、ComputedFrom三种边连接相关结点构成数据流图DataFlowGraph。其余的图构建方式如下:根据程序表达式结构使用GuardedBy、GuardedByNegation两种边连接相关结点构建参数闭合图GuardedByGraph,根据程序语句顺序结构使用NextToken边连接相关结点构成顺序图NextTokenGraph,根据程序中函数与变量的调用关系使用Returns To、FormalArgName两种边连接相关结点构成调用图CallGraph。将程序代码表示为图之后,构建语料库,提取上述生成的AST树和不同类型的图中的结点标记为token构建语料库。将出现频率较低而长字符token进行拆解,将使用驼峰命名法和下划线命名法的标记token拆分为多个子token,限制语料库中词汇量。拆分完成后利用Word2vec,对语料库中的tokens进行词向量学习,最终获得一组词向量。
4、构建和训练Graph2Seq模型,如图4所示,模型能够学习图中的程序缺陷特征。模型的构建和训练过程如下:
所述Graph2Seq模型,包括图编码器和序列解码器两部分;
(1)构建图编码器,具体包括:
步骤4-1,输入步骤3-1得到的缺陷代码图,添加全局结点global并初始化,该结点与图中所有结点直接相连;
步骤4-2,将上述代码图转化为最短路径图:对于任意两个结点i、j,计算两者之间的最短路径,得到结点之间的路径图;
步骤4-3,结点i、j之间的关系定义为两个结点之间的路径,将路径图中的边表示为边结点,用边结点插入到原结点之间替换原有的边,则结点i和结点j之间的最短关系路径表示为:
spi→j=[e(i,k1),e(k1,k2),...,e(kn,j)]
或spj→i=[e(j,k1),e(k1,k2),...,e(kn,i)]
式中,spi→j表示结点i到结点j之间的关系路径,spj→i表示结点j到结点i之间的关系路径,若记spi→j为结点i和结点j之间的正向最短关系路径,则spj→i为结点i和结点j之间的正向最短关系路径,e(·,·)代表边的标签即两个结点之间相连的边的类型,k表示中继结点,ki表示第i个中继结点,i=1,2,...,n,n表示结点i和结点j关系路径上结点数量;
步骤4-4,进行关系编码;
利用双向GRU模型对关系路径信息进行序列编码:
Figure BDA0002776135800000121
Figure BDA0002776135800000122
式中,t为当前时间步,
Figure BDA0002776135800000123
为t时刻正向状态向量,
Figure BDA0002776135800000124
为t时刻反向状态向量,f代表正向路径,b代表反向路径,spt指t时刻的最短关系路径;GRU为门控循环单元,其能根据前一时刻结点状态向量和当前时刻的输入计算得出当前时刻的结点状态向量;
则结点i、j之间的关系编码表示为:
Figure BDA0002776135800000125
即在运行n个时间步后,n时刻的正向状态向量和0时刻的反向状态向量拼接组成结点之间的关系向量;
步骤4-5,结点位置信息嵌入,计算每一个结点与其所在AST树中根结点之间的距离,使用位置编码对距离信息进行编码,与步骤3-3中得到的结点词向量连接,得到初始结点向量表示;
步骤4-6,结合步骤4-4得到的结点间关系向量rij和步骤4-6得到的初始结点向量表示,计算结点之间全局注意力得分sij
Figure BDA0002776135800000126
将上述公式展开得:
Figure BDA0002776135800000127
式中,xi、xj分别为结点i和结点j的初始结点向量表示,ri→j和rj→i分别表示结点间关系向量rij的正向部分和反向部分,Wq T为查询向量的转置,Wk为键向量,查询向量和键向量由词嵌入和对应的权重矩阵相乘后创建;该公式中四个子式从左至右分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
拆分出的四个子式分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
(2)构建序列解码器:解码器根据编码器学习所得向量表示预测生成的序列中当前位置可能出现的token及其出现概率,顺序进行这个过程得到候选token序列及其生成概率,具体包括:
步骤4-7,根据步骤4-6得到的全局注意力得分sij和当前预测位置之前生成的token序列,预测当前位置可能出现的token;
步骤4-8,重复进行步骤4-7的token预测过程,通过步骤2-2中插入的特殊标记控制token预测过程的起止,序列解码器的输出是候选token序列及其对应的概率;
(3)训练Graph2Seq模型
步骤4-10,计算概率最大的候选token序列与训练集中真实值的损失值loss,根据损失值loss,利用梯度下降法更新上述步骤所构建的Graph2Seq模型中的参数。
5、利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性。将存在缺陷并定位到问题语句的程序进行切片、表示和嵌入后输入到训练后的Graph2Seq模型,输出与问题语句相对应的候选修复token序列,根据预测概率对候选序列进行降序排序。然后根据token列表还原token序列得到候选修复语句列表,将候选修复语句返回程序并替换缺陷代码语句,最后通过给定测试用例集计算测试通过率,根据通过率返回可用修复补丁列表,达到修复效果。
本发明提出的方法采用程序切片的方法精简缺陷语句上下文,并采用较之序列表示方法语义表达更为精准的图表示的方法表示缺陷程序,同时选取与输入相匹配的Graph2Seq模型进行训练,很好地达到了自动给出修复补丁的目的,极大提升程序缺陷修复的准确性。
以上显示和描述了本发明的基本原理、主要特征及优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

Claims (8)

1.一种基于图的端到端程序修复方法,其特征在于,所述方法包括以下步骤:
步骤1,构建缺陷数据集;
步骤2,进行缺陷程序切片,提取与缺陷语句相关的上下文;
步骤3,进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构;
步骤4,构建并训练Graph2Seq模型;
步骤5,利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性。
2.根据权利要求1所述的基于图的端到端程序修复方法,其特征在于,步骤1所述构建缺陷数据集具体过程包括:
步骤1-1,从开源软件存储库中获取缺陷数据及修复补丁对;
步骤1-2,对成对的代码数据进行预处理:选取仅修改单行语句的修复补丁,保留当前修改语句所在的函数上下文,删除多余语句,对该修复补丁对应的进行同样的处理,获得数据集;
步骤1-3,随机选取数据集中80%的缺陷代码与修复补丁对作为训练集,剩余的20%作为测试集。
3.根据权利要求2所述的基于图的端到端程序修复方法,其特征在于,步骤2所述进行缺陷程序切片,提取与缺陷语句相关的上下文,具体包括:
步骤2-1,利用工具Checkmarx将代码数据切片,删除与缺陷和修复无关的代码行,保留与缺陷和修复有语义关联的代码行;
步骤2-2,在缺陷语句首尾插入特殊单词标记,该标记用来控制生成补丁过程的起止。
4.根据权利要求3所述的基于图的端到端程序修复方法,其特征在于,步骤3所述进行缺陷代码图嵌入,将缺陷语句及其上下文转化为可供学习的图形结构,具体过程包括:
步骤3-1,对经上述处理后的代码进行表征,具体包括:将程序代码转换为AST树,并根据程序语法和语义,利用不同类型的边连接AST树中的结点,形成不同类型的图;
步骤3-2,基于所述AST树和不同类型的图,构建语料库;
步骤3-3,利用Word2vec,对语料库中的tokens进行词向量学习,获得一组词向量。
5.根据权利要求4所述的基于图的端到端程序修复方法,其特征在于,步骤3-1中所述利用不同类型的边连接AST树中的结点,形成不同类型的图,具体包括:
(1)根据程序数据流使用LastRead、LastWrite、ComputedFrom三种边连接相关结点构成数据流图DataFlowGraph;
(2)根据程序表达式结构使用GuardedBy、GuardedByNegation两种边连接相关结点构建参数闭合图GuardedByGraph;
(3)根据程序语句顺序结构使用NextToken边连接相关结点构成顺序图NextTokenGraph;
(4)根据程序中函数与变量的调用关系使用Returns To、FormalArgName两种边连接相关结点构成调用图CallGraph。
6.根据权利要求5所述的基于图的端到端程序修复方法,其特征在于,步骤3-2所述基于所述AST树和不同类型的图,构建语料库,具体过程包括:
步骤3-2-1,提取所述AST树和不同类型的图中的结点,标记为token,构建语料库;
步骤3-2-2,将使用驼峰命名法和下划线命名法的标记token拆分为多个子token。
7.根据权利要求6所述的基于图的端到端程序修复方法,其特征在于,步骤4所述构建并训练Graph2Seq模型,具体过程包括:
所述Graph2Seq模型,包括图编码器和序列解码器两部分;
(1)构建图编码器,具体包括:
步骤4-1,输入步骤3-1得到的缺陷代码图,添加全局结点global并初始化,该结点与图中所有结点直接相连;
步骤4-2,将上述代码图转化为最短路径图:对于任意两个结点i、j,计算两者之间的最短路径,得到结点之间的路径图;
步骤4-3,结点i、j之间的关系定义为两个结点之间的路径,将路径图中的边表示为边结点,用边结点插入到原结点之间替换原有的边,则结点i和结点j之间的最短关系路径表示为:
spi→j=[e(i,k1),e(k1,k2),...,e(kn,j)]
或spj→i=[e(j,k1),e(k1,k2),...,e(kn,i)]
式中,spi→j表示结点i到结点j之间的关系路径,spj→i表示结点j到结点i之间的关系路径,若记spi→j为结点i和结点j之间的正向最短关系路径,则spj→i为结点i和结点j之间的正向最短关系路径,e(·,·)代表边的标签即两个结点之间相连的边的类型,k表示中继结点,ki表示第i个中继结点,i=1,2,...,n,n表示结点i和结点j关系路径上结点数量;
步骤4-4,进行关系编码;
利用双向GRU模型对关系路径信息进行序列编码:
Figure FDA0002776135790000031
Figure FDA0002776135790000032
式中,t为当前时间步,
Figure FDA0002776135790000033
为t时刻正向状态向量,
Figure FDA0002776135790000034
为t时刻反向状态向量,f代表正向路径,b代表反向路径,spt指t时刻的最短关系路径;GRU为门控循环单元,其能根据前一时刻结点状态向量和当前时刻的输入计算得出当前时刻的结点状态向量;
则结点i、j之间的关系编码表示为:
Figure FDA0002776135790000035
即在运行n个时间步后,n时刻的正向状态向量和0时刻的反向状态向量拼接组成结点之间的关系向量;
步骤4-5,结点位置信息嵌入,计算每一个结点与其所在AST树中根结点之间的距离,使用位置编码对距离信息进行编码,与步骤3-3中得到的结点词向量连接,得到初始结点向量表示;
步骤4-6,结合步骤4-4得到的结点间关系向量rij和步骤4-6得到的初始结点向量表示,计算结点之间全局注意力得分sij
Figure FDA0002776135790000036
将上述公式展开得:
Figure FDA0002776135790000037
式中,xi、xj分别为结点i和结点j的初始结点向量表示,ri→j和rj→i分别表示结点间关系向量rij的正向部分和反向部分,
Figure FDA0002776135790000038
为查询向量的转置,Wk为键向量,查询向量和键向量由词嵌入和对应的权重矩阵相乘后创建;该公式中四个子式从左至右分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
拆分出的四个子式分别表征了结点内容相关性、源导向的关系偏置、目标导向的关系偏置、一般关系偏置;
(2)构建序列解码器:解码器根据编码器学习所得向量表示预测生成的序列中当前位置可能出现的token及其出现概率,顺序进行这个过程得到候选token序列及其生成概率,具体包括:
步骤4-7,根据步骤4-6得到的全局注意力得分sij和当前预测位置之前生成的token序列,预测当前位置可能出现的token;
步骤4-8,重复进行步骤4-7的token预测过程,通过步骤2-2中插入的特殊标记控制token预测过程的起止,序列解码器的输出是候选token序列及其对应的概率;
(3)训练Graph2Seq模型
步骤4-10,计算概率最大的候选token序列与训练集中真实值的损失值loss,根据损失值loss,利用梯度下降法更新上述步骤所构建的Graph2Seq模型中的参数。
8.根据权利要求7所述的基于图的端到端程序修复方法,其特征在于,步骤5所述利用训练好的Graph2Seq模型生成修复补丁并验证补丁的正确性,具体过程包括:
步骤5-1,针对存在缺陷并定位到问题语句的程序,重复步骤2-1进行程序切片,得到与缺陷相关代码语句;重复步骤3-1,将缺陷相关代码语句转化为图;重复步骤3-3,将得到的图进行嵌入,之后输入到训练后的Graph2Seq模型,输出与问题语句相对应的候选修复token序列,并根据预测概率对候选序列进行降序排序形成token列表;
步骤5-2,根据token列表还原token序列得到候选修复语句列表;
步骤5-3,验证候选补丁正确性:将每个候选修复语句返回程序并替换缺陷代码语句,之后通过给定的测试用例集计算测试通过率,将通过率高于预设阈值修复语句保留,返回可用修复语句列表。
CN202011265976.3A 2020-11-13 2020-11-13 一种基于图的端到端程序修复方法 Active CN112463424B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011265976.3A CN112463424B (zh) 2020-11-13 2020-11-13 一种基于图的端到端程序修复方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011265976.3A CN112463424B (zh) 2020-11-13 2020-11-13 一种基于图的端到端程序修复方法

Publications (2)

Publication Number Publication Date
CN112463424A true CN112463424A (zh) 2021-03-09
CN112463424B CN112463424B (zh) 2023-06-02

Family

ID=74826114

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011265976.3A Active CN112463424B (zh) 2020-11-13 2020-11-13 一种基于图的端到端程序修复方法

Country Status (1)

Country Link
CN (1) CN112463424B (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113326187A (zh) * 2021-05-25 2021-08-31 扬州大学 数据驱动的内存泄漏智能化检测方法及系统
CN113741886A (zh) * 2021-08-02 2021-12-03 扬州大学 一种基于图的语句级程序修复方法及系统
CN114416421A (zh) * 2022-01-24 2022-04-29 北京航空航天大学 一种代码缺陷的自动定位与修复方法
CN114490163A (zh) * 2022-03-28 2022-05-13 北京天维信通科技有限公司 一种故障自愈方法、装置及电子设备
CN115686923A (zh) * 2023-01-05 2023-02-03 中国人民解放军军事科学院系统工程研究院 一种软件源代码缺陷自动修复方法及系统
WO2023010916A1 (zh) * 2021-08-06 2023-02-09 中兴通讯股份有限公司 软件自动修复方法、系统、电子设备及存储介质
CN117056940A (zh) * 2023-10-12 2023-11-14 中关村科学城城市大脑股份有限公司 服务器系统漏洞修复方法、装置、电子设备和介质
CN114416421B (zh) * 2022-01-24 2024-05-31 北京航空航天大学 一种代码缺陷的自动定位与修复方法

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231790A (zh) * 2011-06-23 2011-11-02 上海大学 视频序列中条带损伤的修复方法
CN104750563A (zh) * 2013-12-26 2015-07-01 北京大学 一种基于控制流图的内存泄漏自动修复方法
US20150363294A1 (en) * 2014-06-13 2015-12-17 The Charles Stark Draper Laboratory Inc. Systems And Methods For Software Analysis
CN105335246A (zh) * 2015-10-27 2016-02-17 北京大学 一种基于问答网站分析的程序崩溃缺陷自动修复方法
CN108228232A (zh) * 2018-01-12 2018-06-29 扬州大学 一种针对程序中循环问题的自动修复方法
CN109918127A (zh) * 2019-03-07 2019-06-21 扬州大学 一种基于代码修改模式差异的缺陷纠错方法
CN110178019A (zh) * 2016-12-07 2019-08-27 奥博泰克有限公司 用于判断缺陷质量的方法和设备
CN111309607A (zh) * 2020-02-12 2020-06-19 扬州大学 一种代码方法级别的软件缺陷定位方法
CN111460132A (zh) * 2020-03-10 2020-07-28 哈尔滨工业大学 一种基于图卷积神经网络的生成式会议摘要方法

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102231790A (zh) * 2011-06-23 2011-11-02 上海大学 视频序列中条带损伤的修复方法
CN104750563A (zh) * 2013-12-26 2015-07-01 北京大学 一种基于控制流图的内存泄漏自动修复方法
US20150363294A1 (en) * 2014-06-13 2015-12-17 The Charles Stark Draper Laboratory Inc. Systems And Methods For Software Analysis
CN105335246A (zh) * 2015-10-27 2016-02-17 北京大学 一种基于问答网站分析的程序崩溃缺陷自动修复方法
CN110178019A (zh) * 2016-12-07 2019-08-27 奥博泰克有限公司 用于判断缺陷质量的方法和设备
CN108228232A (zh) * 2018-01-12 2018-06-29 扬州大学 一种针对程序中循环问题的自动修复方法
CN109918127A (zh) * 2019-03-07 2019-06-21 扬州大学 一种基于代码修改模式差异的缺陷纠错方法
CN111309607A (zh) * 2020-02-12 2020-06-19 扬州大学 一种代码方法级别的软件缺陷定位方法
CN111460132A (zh) * 2020-03-10 2020-07-28 哈尔滨工业大学 一种基于图卷积神经网络的生成式会议摘要方法

Non-Patent Citations (7)

* Cited by examiner, † Cited by third party
Title
DENG, MX等: "Research on selective disassembly sequence planning for Repair", 《WEB OF SCIENCE》 *
XIAOBING SUN等: "Bug Localization for Version Issues With Defect Patterns", 《IEEE》 *
XULIANG LIU等: "Mining StackOverflow for Program Repair", 《IEEE》 *
YUKUN DONG等: "Automatic Repair of Semantic Defects Using Restraint Mechanisms", 《SYMMETRY》 *
ZHEN NI等: "Analyzing bug fix for automatic bug cause classification", 《SCIENCEDIRECT》 *
李珍等: "面向源代码的软件漏洞静态检测综述", 《网络与信息安全学报》 *
窦秋明: "基于布尔程序的代码修复及逆向转换", 《信息科技》 *

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113326187A (zh) * 2021-05-25 2021-08-31 扬州大学 数据驱动的内存泄漏智能化检测方法及系统
CN113326187B (zh) * 2021-05-25 2023-11-24 扬州大学 数据驱动的内存泄漏智能化检测方法及系统
CN113741886A (zh) * 2021-08-02 2021-12-03 扬州大学 一种基于图的语句级程序修复方法及系统
CN113741886B (zh) * 2021-08-02 2023-09-26 扬州大学 一种基于图的语句级程序修复方法及系统
WO2023010916A1 (zh) * 2021-08-06 2023-02-09 中兴通讯股份有限公司 软件自动修复方法、系统、电子设备及存储介质
CN114416421A (zh) * 2022-01-24 2022-04-29 北京航空航天大学 一种代码缺陷的自动定位与修复方法
CN114416421B (zh) * 2022-01-24 2024-05-31 北京航空航天大学 一种代码缺陷的自动定位与修复方法
CN114490163A (zh) * 2022-03-28 2022-05-13 北京天维信通科技有限公司 一种故障自愈方法、装置及电子设备
CN114490163B (zh) * 2022-03-28 2022-08-05 北京天维信通科技有限公司 一种故障自愈方法、装置及电子设备
CN115686923A (zh) * 2023-01-05 2023-02-03 中国人民解放军军事科学院系统工程研究院 一种软件源代码缺陷自动修复方法及系统
CN117056940A (zh) * 2023-10-12 2023-11-14 中关村科学城城市大脑股份有限公司 服务器系统漏洞修复方法、装置、电子设备和介质
CN117056940B (zh) * 2023-10-12 2024-01-16 中关村科学城城市大脑股份有限公司 服务器系统漏洞修复方法、装置、电子设备和介质

Also Published As

Publication number Publication date
CN112463424B (zh) 2023-06-02

Similar Documents

Publication Publication Date Title
CN112463424B (zh) 一种基于图的端到端程序修复方法
CN112214610B (zh) 一种基于跨度和知识增强的实体关系联合抽取方法
CN113064586B (zh) 一种基于抽象语法树增广图模型的代码补全方法
CN108710704B (zh) 对话状态的确定方法、装置、电子设备及存储介质
CN113761893B (zh) 一种基于模式预训练的关系抽取方法
CN111309607B (zh) 一种代码方法级别的软件缺陷定位方法
CN109063164A (zh) 一种基于深度学习的智能问答方法
CN111427775B (zh) 一种基于Bert模型的方法层次缺陷定位方法
CN112800203B (zh) 一种融合文本和知识表征的问答匹配方法及系统
CN110442880B (zh) 一种机器翻译译文的翻译方法、装置及存储介质
CN113127339B (zh) 一种Github开源平台数据的获取方法及源代码缺陷修复系统
CN113076133B (zh) 基于深度学习的Java程序内部注释的生成方法及系统
CN114816497B (zh) 基于bert预训练模型的链接生成方法
CN113741886B (zh) 一种基于图的语句级程序修复方法及系统
CN112394973B (zh) 一种基于伪孪生网络的多语言代码剽窃检测方法
CN108664237B (zh) 一种基于启发式和神经网络的非api成员推荐方法
CN111651765B (zh) 基于生成式对抗网络的程序执行路径生成方法
CN114492460B (zh) 基于衍生提示学习的事件因果关系抽取方法
CN113868432A (zh) 一种用于钢铁制造企业的知识图谱自动构建方法和系统
CN114547619A (zh) 一种基于树的漏洞修复系统及修复方法
CN116627490A (zh) 一种智能合约字节码相似性检测方法
Li et al. Toward less hidden cost of code completion with acceptance and ranking models
CN114385491A (zh) 一种基于深度学习的js转译器缺陷检测方法
CN116702160B (zh) 一种基于数据依赖增强程序切片的源代码漏洞检测方法
CN116578336A (zh) 一种基于抄袭者-检测器对抗的软件克隆检测方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant