多模态程序自动修复方法、系统、设备及存储介质技术方案

技术编号:38037345 阅读:7 留言:0更新日期:2023-06-30 11:03
本发明专利技术公开了一种多模态程序自动修复方法、系统、设备及存储介质,方法包括:通过现有工具将源代码转换为抽象语法树AST;匿名变量和编码节点;构建程序修复模型,所述程序修复模型;对所述程序修复模型进行预训练,所述预训练包括两个训练任务,一是遮盖语言模型MLM任务,让程序修复模型关注到AST节点级别的信息;二是节点顺序判断NOJ任务;在得到训练好的程序修复模型后,利用训练好的程序修复模型对待修复的多模态程序进行修复。本发明专利技术采用了融合多模态信息的技术方案,解决了模型无法充分学习到代码的语义、结构信息的技术问题,从而达到了充分利用代码的辅助信息并最终让模型学习到更丰富的语义、结构信息的技术效果。结构信息的技术效果。结构信息的技术效果。

【技术实现步骤摘要】
多模态程序自动修复方法、系统、设备及存储介质


[0001]本专利技术属于程序修复的
,具体涉及一种多模态程序自动修复方法、系统、设备及存储介质。

技术介绍

[0002]程序自动修复是针对修复代码中的语法、逻辑错误的修复。现有的程序修复方法主要分为两种:一种是静态分析,即人为规定代码修复模板,直接对程序进行修复;第二种是采用深度学习的方式,通过使用代码上下文、测试套件等相关辅助信息让模型自己学习代码的语法、语义信息,并以此来进行程序修复。现有技术中,采用深度学习进行程序修复主要存在下述问题:
[0003]1、辅助信息的缺陷:现有代码多使用抽象语法树AST、注释、缺陷代码周围代码作为辅助信息,但这些还不足以描述整个代码的语义信息。
[0004]2、OOV:Out of Vocabulary,即验证集中出现了训练集中没有学习过的标识符。

技术实现思路

[0005]本专利技术的主要目的在于克服现有技术的缺点与不足,提供一种多模态程序自动修复方法、系统、设备及存储介质,更全面的待修复的程序进行修复。
[0006]为了达到上述目的,本专利技术采用以下技术方案:
[0007]第一方面,本专利技术提供了一种多模态程序自动修复方法,包括下述步骤:
[0008]将源代码使用现有工具转换成抽象语法树AST,遍历整个AST,对于节点信息仅保留变量名、方法名和语句类型信息,对于节点间信息仅保留节点间关系,通过这种方式生成简化的AST;
[0009]把源代码中的变量按照出现的先后顺序重新命名,同时将源代码中的变量名、方法名、参数信息保存至“变量桶”中,同时修改简化后的AST;遍历整个简化的AST得到路径信息,采用节点编码和叶子结点的位置编码对每条路径进行编码;构建程序修复模型,所述程序修复模型包括12层transformer Encoder层,并采用12头的attention head机制;每一层transformer Encoder层由Encoder模块和Decoder模块组成,数据首先进入Encoder层进行编码操作,在经过多头注意力机制层、归一化层、前馈神经网络、归一化层后进入Decoder层进行解码操作,再经过多头注意力机制层、归一化层、前馈神经网络、归一化层后得到最终结果,其中,层与层之间使用残差网络连接;
[0010]对所述程序修复模型进行预训练,所述预训练包括两个训练任务,一是遮盖语言模型MLM任务,让程序修复模型关注到AST节点级别的信息;二是节点顺序判断NOJ任务;使用多模态信息预训练程序修复模型,所述多模态信息由融合注释信息、代码上下文、错误信息和调试信息组成,具体为:
[0011]使用错误行代码所在的整个函数体作为代码的上下文,将整个函数体使用简化的AST表示;
[0012]将编译器返回的错误信息分为两部分,第一部分是报错的位置,第二部分是报错的类型;
[0013]将编译器返回的调试信息分为两部分,第一部分是变量名,第二部分是变量的值;
[0014]将注释信息、错误信息和调试信息使用BEP编码,代码上下文使用简化后的AST表示,每种数据之间使用[SEP]标志分割,组成多模态信息;
[0015]使用多模态信息并采用测试反馈的方法进一步训练程序自动修复模型,将多模态信息输入到程序自动修复模型中,输出新的错误信息和通过测试用例的数量,循环这一步骤直到修复后的代码通过全部测试用例;
[0016]在得到训练好的程序修复模型后,利用训练好的程序修复模型对待修复的多模态程序进行修复。
[0017]作为优选的技术方案,在删除AST的冗余信息时,每一条路径都是从AST根节点到AST的叶子结点,并且还包含路径的位置信息,将AST分割成一个一个的节点,并对这些节点进行编码。
[0018]作为优选的技术方案,所述将源代码使用现有工具转换成抽象语法树AST,具体为:
[0019]一个程序由多个函数组成,使用现有的AST生成工具把每一个函数转换为AST;
[0020]对于每一个函数,遍历整个AST,如果某个节点的类型是标识符,那么就把该节点的值保存到局部变量桶里并匿名变量;匿名变量的方法是按照变量名出现顺序赋予变量规范法的名字,同时还要保存该方法的参数信息,以及匿名变量和原变量的对应关系;
[0021]在遍历整个程序之后,将局部变量桶合并至全局方法桶。
[0022]作为优选的技术方案,所述对所述程序修复模型进行预训练,具体为:
[0023]预处理源代码,使用现有工具生成AST,删除冗余数据后按照源代码中变量出现的前后次序重命名变量,生成简化后的AST,同时将变量的附加信息保存起来,如果变量的类型是方法,那么就保存其方法名,如果变量的类型是其他,那么就保存其变量名和值
[0024]遮盖语言模型MLM任务,让程序修复模型学习代码的语义信息,使用动态概率随机遮盖掉简化AST中的节点,动态概率与节点在AST中的位置有关;
[0025]节点顺序判断NOJ任务,让程序修复模型学习代码的结构信息,即在简化的AST中随机挑选两个节点A、B,训练程序修复模型判断节点对(A,B)是否有序。
[0026]作为优选的技术方案,在遮盖语言模型MLM任务中,使用动态概率去遮盖token,在程序修复模型中,每个token都会计算和其他全部token的attention值,如果attention的值越大,则说明该token和目标token关系越紧密,计算公式如下:
[0027][0028]q
i
代表第i个token被遮盖的概率,n表示该代码片段中包含n个token,attention(t
a
,t
b
)代表计算t
a
和t
b
的attention的值,t
a
和t
b
表示第a个token和第b个token;
[0029][0030]表示进行遮盖操作后的第i条路径,REPLACE(p
i
,q
i
,[mask])表示使用[mask]标志按照概率q
i
进行遮盖的操作;
[0031][0032]A
masked
表示进行遮盖操作后的代码片段的抽象语法树AST;
[0033]使用如下损失函数:
[0034][0035]其中N代表代码片段长度,x代表token,C表示整个源代码中的所有token,x
t
表示第t个token。
[0036]作为优选的技术方案,所述注释信息是指错误行所在函数体内的注释数据,使用BPE编码表示;
[0037]所述代码上下文是指错误行所在的整个函数体,使用简化AST表示;
[0038]所述错误信息由编译器生成,包括报错位置和报错类型,使用BPE编码表示;
[0039]所述调试信息由编译器生成,包括变量名和变量值,使用BPE编码表示;...

【技术保护点】

【技术特征摘要】
1.多模态程序自动修复方法,其特征在于,包括下述步骤:将源代码使用现有工具转换成抽象语法树AST,遍历整个AST,对于节点信息仅保留变量名、方法名和语句类型信息,对于节点间信息仅保留节点间关系,通过这种方式生成简化的AST;把源代码中的变量按照出现的先后顺序重新命名,同时将源代码中的变量名、方法名、参数信息保存至“变量桶”中,同时修改简化后的AST;遍历整个简化的AST得到路径信息,采用节点编码和叶子结点的位置编码对每条路径进行编码;构建程序修复模型,所述程序修复模型包括12层transformer Encoder层,并采用12头的attention head机制;每一层transformer Encoder层由Encoder模块和Decoder模块组成,数据首先进入Encoder层进行编码操作,在经过多头注意力机制层、归一化层、前馈神经网络、归一化层后进入Decoder层进行解码操作,再经过多头注意力机制层、归一化层、前馈神经网络、归一化层后得到最终结果,其中,层与层之间使用残差网络连接;对所述程序修复模型进行预训练,所述预训练包括两个训练任务,一是遮盖语言模型MLM任务,让程序修复模型关注到AST节点级别的信息;二是节点顺序判断NOJ任务;使用多模态信息预训练程序修复模型,所述多模态信息由融合注释信息、代码上下文、错误信息和调试信息组成,具体为:使用错误行代码所在的整个函数体作为代码的上下文,将整个函数体使用简化的AST表示;将编译器返回的错误信息分为两部分,第一部分是报错的位置,第二部分是报错的类型;将编译器返回的调试信息分为两部分,第一部分是变量名,第二部分是变量的值;将注释信息、错误信息和调试信息使用BEP编码,代码上下文使用简化后的AST表示,每种数据之间使用[SEP]标志分割,组成多模态信息;使用多模态信息并采用测试反馈的方法进一步训练程序自动修复模型,将多模态信息输入到程序自动修复模型中,输出新的错误信息和通过测试用例的数量,循环这一步骤直到修复后的代码通过全部测试用例;在得到训练好的程序修复模型后,利用训练好的程序修复模型对待修复的多模态程序进行修复。2.根据权利要求1所述的多模态程序自动修复方法,其特征在于,在删除AST的冗余信息时,每一条路径都是从AST根节点到AST的叶子结点,并且还包含路径的位置信息,将AST分割成一个一个的节点,并对这些节点进行编码。3.根据权利要求1所述的多模态程序自动修复方法,其特征在于,所述将源代码使用现有工具转换成抽象语法树AST,具体为:一个程序由多个函数组成,使用现有的AST生成工具把每一个函数转换为AST;对于每一个函数,遍历整个AST,如果某个节点的类型是标识符,那么就把该节点的值保存到局部变量桶里并匿名变量;匿名变量的方法是按照变量名出现顺序赋予变量规范法的名字,同时还要保存该方法的参数信息,以及匿名变量和原变量的对应关系;在遍历整个程序之后,将局部变量桶合并至全局方法桶。4.根据权利要求1所述的多模态程序自动修复方法,其特征在于,所述对所述程序修复
模型进行预训练,具体为:预处理源代码,使用现有工具生成AST,删除冗余数据后按照源代码中变量出现的前后次序重命名变量,生成简化后的AST,同时将变量的附加信息保存起来,如果变量的类型是方法,那么就保存其方法名,如果变量的类型是其他,那么就保存其变量名和值遮盖语言模型MLM任务,让程序修复模型学习代码的语义信息,使用动态概率随机遮盖掉简化AST中的节点,动态概率与节点在AST中的位置有关;节点顺序判断NOJ任务,让程序修复模型学习代码的结构信息,即在简化的AST中随机挑选两个节点A、B,训练程序修复模型判断节点对(A,B)是否有序。5.根据权利要求1所述的多模态程序自动修复方法,其特征在于,在遮盖语言模型MLM任务中,使用动态概率去遮盖token,在程序修复模型中,每个token都会计算和其他全部token的attention值,如果attention的值越大,则说明该token和目标token关系越紧密,计算公式如下:q
i
代表第i个token被遮盖的概率,n表示该代码片段中包含n个token,attention(t
a
,t
b
)代表计算t
a
和t
b
的attention的值,t

【专利技术属性】
技术研发人员:张兆旭王鸿鹏高翠芸
申请(专利权)人:哈尔滨工业大学深圳
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1