一种基于代码语言模型的程序缺陷自动修复方法及系统
未命名
09-17
阅读:113
评论:0

1.本发明属于计算机软件与人工智能技术领域,具体涉及一种基于代码语言模型的程序缺陷自动修复方法及系统。
背景技术:
2.程序缺陷是计算机软件开发中不可避免的问题,随着计算机技术的快速发展,软件的功能和规模不断增加,软件中程序缺陷的数量也越来越多。程序缺陷将导致软件的运行失败,使其无法正常完成既定功能。由于软件在现代社会的广泛应用,程序缺陷会对人们的财产安全和人身安全形成极大的威胁。因此,如何高效修复程序缺陷对计算机软件有着重大意义。
3.传统的程序缺陷主要是通过软件开发人员使用手动方式进行人工修复的,开发人员通过断点测试的方式对程序进行反复编译调试,这种方式修复的效果严重依赖开发人员的专业水平,修复时间长,修复成本高。
4.现有的程序缺陷自动修复方法主要分为以下两种:一种是启发式规则方法,基于研究人员预先定义的策略模板对程序缺陷部分进行匹配。这种方法适用于修复软件中特定种类的程序缺陷,然而对于其他类型的程序缺陷则无法有效修复,缺乏普适性。另一种是基于神经网络的程序自动修复方法,利用长短期记忆网络(long short-term memory network,lstm)或transformer架构训练程序自动修复模型,以生成程序缺陷部分对应的补丁。相比启发式规则方法,该方法能够同时修复多种类型的程序缺陷,然而生成的补丁质量差,修复的成功率低。
技术实现要素:
5.本发明为解决现有程序缺陷修复时间长、成本高、缺乏普适性的问题,进而提出一种基于代码语言模型的程序缺陷自动修复方法。
6.本发明一种基于代码语言模型的程序缺陷自动修复方法,其包括如下步骤:
7.步骤一、利用开源程序项目源代码语料库,构建代码语言模型;
8.步骤二、利用程序缺陷代码样本和正确代码样本,构建缺陷-修复代码数据集;
9.步骤三、构建基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,对数据集样本进行评估并划分缺陷修复难度等级;
10.步骤四、建立基于样本调度函数的代码语言模型微调调度器,构建基于缺陷-修复代码数据集的多批次缺陷-修复代码数据样本;
11.步骤五、建立基于课程学习机制的代码语言模型微调训练器,通过多批次缺陷-修复代码数据样本对代码语言模型进行多轮迭代微调训练;
12.步骤六、将目标程序中的缺陷代码输入至微调训练后的代码语言模型中,输出程序缺陷代码对应的候选补丁序列;
13.步骤七、基于测试用例对生成的候选补丁序列进行验证,输出通过测试的正确代
修复代码数据对样本进行难度分数标记,进而对缺陷-修复代码数据集中的所有样本进行缺陷修复难度标注;
33.建立基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,对缺陷-修复代码数据集中的所有样本按标注的难度分数进行缺陷修复难度分类,得到各样本缺陷修复难度等级。
34.进一步地,步骤三中,基于交叉评估的缺陷修复难度判别流程如下:
35.初始状态,输入缺陷-修复代码数据集s和代码语言模型m;
36.将数据集s平均分为n份,n为大于2的整数;
37.对n份数据子集中的每一个数据子集分别执行以下操作:首先,从n份数据子集中选取该数据子集作为训练数据集对代码语言模型m进行训练,得到训练后的代码语言模型m’;其次,将除去该数据子集的其余n-1个子集分别作为测试集,依次对代码语言模型m’进行测试,得到n-1个测试分数。最后,对得到n-1个测试分数取平均值,记为该数据子集对应的测试结果;
38.直至遍历所有n份数据子集,得到对应的n份测试结果;
39.对n份测试结果从高到低进行排序,根据测试结果排名得到数据子集的缺陷修复相对难度分数,排名越高的测试结果对应的数据子集缺陷修复相对难度分数越低。
40.进一步地,步骤四具体操作如下:
41.构建基于等比级数序列的样本调度函数:
[0042][0043]
其中,t为代码语言模型当前训练轮次,f表示用于当前轮次训练的缺陷-修复代码数据样本比例,u为初始训练样本比例,t为总训练轮次;
[0044]
将缺陷-修复代码数据集根据缺陷-修复代码样本分类器划分的各样本缺陷修复难度等级由低到高进行重新排列,作为代码语言模型训练调度器的输入数据;
[0045]
建立基于样本调度函数的代码语言模型训练调度器,使用基于等比级数序列的样本调度函数对输入数据进行调度解算分析,输出满足当前训练轮次的缺陷-修复代码数据样本数据批次。
[0046]
进一步地,步骤五具体操作如下:
[0047]
使用缺陷-修复代码数据样本数据批次输入至代码语言模型,对其进行微调训练;
[0048]
构建基于反馈响应的课程学习机制,根据微调训练的结果是否收敛判断本轮次训练是否完成;如果结果不收敛,表明本轮次训练尚未完成,需继续进行微调训练;如果结果收敛,表明本轮次训练已完成,此时需更新训练轮次t,令t=t+1,将更新后的t值重新输入基于样本调度函数的代码语言模型训练调度器,构建下一批次缺陷-修复代码数据样本,并使用得到的缺陷-修复代码数据样本对代码语言模型进行下一轮迭代微调训练,直到满足终止条件t=t;
[0049]
当所有批次缺陷-修复代码数据样本数据均完成微调训练后,输出经过多轮迭代微调训练的代码语言模型。
[0050]
进一步地,步骤七具体操作如下:
[0051]
构建基于目标程序代码缺陷的测试用例集合,输入生成的程序缺陷代码候选补丁序列,对其进行单元测试和系统测试;
[0052]
对测试用例的测试结果进行分析,输出通过全部测试的正确代码补丁,完成程序缺陷修复。
[0053]
本发明还涉及一种基于代码语言模型的程序缺陷自动修复系统,所述系统包括上述基于代码语言模型的程序缺陷自动修复方法的计算模块。
[0054]
有益效果
[0055]
本发明基于课程学习机制的微调训练框架对数据集进行缺陷修复难度划分,使用处理后的数据集对代码语言模型进行多轮迭代微调训练,能够有效提升模型生成补丁的质量,提高程序缺陷修复成功率。
[0056]
对于实验数据集中所包含的多类型程序缺陷,本发明的方法能够对不同类型程序缺陷进行统一修复,具有良好的普适性。此外,训练后的代码语言模型能够实现对程序缺陷代码的自动修复,可以作为开发人员进行软件维护的辅助工具,节约了人工修复缺陷的时间。
附图说明
[0057]
图1为本发明基于代码语言模型的程序缺陷自动修复方法的流程图。
[0058]
图2为本发明基于交叉评估的缺陷修复难度判别策略的流程图。
[0059]
图3为本发明基于代码语言模型的程序缺陷自动修复方法的工作原理图。
具体实施方式
[0060]
以下结合图1至3对本实施方式进行具体说明。
[0061]
图1为本发明基于代码语言模型的程序缺陷自动修复方法的流程图,如图所示,包括如下步骤:
[0062]
步骤一、利用开源程序项目源代码语料库,构建代码语言模型。
[0063]
步骤1-1:从开源程序项目源代码语料库中获取包含自然语言注释和编程语言代码的双模态语料数据。
[0064]
步骤1-2:对于给定双模态语料数据对x={w,c},其中w为自然语言序列,c为编程语言序列,分别对这两部分随机选择掩码位置,记为mw和mc,其中选择的掩码位置在对应序列中需服从均匀分布。
[0065]
步骤1-3:使用预定义标识符对选定掩码位置中的字符进行掩码处理,将处理后的自然语言序列样本记为w
masked
,将处理后的编程语言序列样本记为c
masked
[0066]
步骤1-4:对于输入样本序列x=[x1,
…
,xn],分别进行生成式向量编码和判别式向量编码。
[0067]
步骤1-4-1:生成式向量编码使用softmax函数对其进行处理,则在样本序列位置t上输出字符x的概率为pg(x|x)=softmax(e(x)h
tg
),其中e(
·
)表示字符的向量表征。
[0068]
步骤1-4-2:判别式向量编码使用sigmoid函数对其进行处理,则在样本序列位置t上的字符被替换的概率为pd(x,t)=sigmoid(wh
td
),将替换后的序列样本记为x
corrupt
。
[0069]
步骤1-5:构建标准遮蔽语言建模函数
[0070][0071]
构建替换序列检测函数
[0072][0073]
其中,
[0074]
步骤1-6:使用标准遮蔽语言建模函数和替换序列检测函数构建代码语言模型,其目标损失函数满足约束
[0075]
步骤二、利用程序缺陷代码样本和正确代码样本,构建缺陷-修复代码数据集。
[0076]
步骤2-1:从开源项目仓库中收集包含错误提交版本和修正提交版本的程序文件,根据提交记录提取存在程序缺陷的代码样本和其对应的正确代码样本,组成缺陷-修复代码数据对。
[0077]
步骤2-2:对程序代码样本数据进行预处理,将提取的缺陷-修复代码数据进行代码长度分析,按程序缺陷代码样本的长度统计收集的代码数据对的概率密度分布,剔除超过预定长度标准的代码样本数据。
[0078]
步骤三、建立基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,对数据集样本进行评估并划分缺陷修复难度等级。
[0079]
步骤3-1:构建基于交叉评估的缺陷修复难度判别策略
[0080]
基于交叉评估的缺陷修复难度判别策略如图2所示。具体流程如下:
[0081]
步骤3-1-1:初始状态,输入缺陷-修复代码数据集s和代码语言模型m。
[0082]
步骤3-1-2:将数据集s平均分为n份,n为大于2的整数。
[0083]
步骤3-1-3:从n份数据子集中选取第i个数据子集di作为训练数据集对代码语言模型m进行训练,得到训练后的代码语言模型mi,其中i为大于等于1且小于等于n的整数。
[0084]
步骤3-1-4:基于步骤3-1-3,将除第i个子集的其余n-1个子集分别作为测试集,依次对代码语言模型mi进行测试,得到n-1个测试分数。对得到n-1个测试分数取平均值,得到测试结果ci。
[0085]
步骤3-1-5:重复执行步骤3-1-3和步骤3-1-4,直至遍历所有n份数据子集,得到对应的n份测试结果c1,c2,
…
,cn。
[0086]
步骤3-1-6:对n份测试结果从高到低进行排序,根据测试结果排名得到数据子集di的缺陷修复相对难度分数,排名越高的测试结果对应的数据子集缺陷修复相对难度分数越低。
[0087]
步骤3-2:获取所有数据子集的缺陷修复相对难度分数,并对各数据子集中的每一组缺陷-修复代码数据对样本进行难度分数标记,进而对缺陷-修复代码数据集中的所有样本进行缺陷修复难度标注。
[0088]
步骤3-3:建立基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,对缺陷-修复代码数据集中的所有样本按标注的难度分数进行缺陷修复难度分类,得到各样本缺陷修复难度等级。
[0089]
步骤四、建立基于样本调度函数的代码语言模型微调调度器,构建基于缺陷-修复代码数据集的多批次缺陷-修复代码数据样本。
[0090]
步骤4-1:构建基于等比级数序列的样本调度函数:
[0091][0092]
其中,t为代码语言模型当前训练轮次,f表示用于当前轮次训练的缺陷-修复代码数据样本比例,u为初始训练样本比例,t为总训练轮次。
[0093]
例如,当总训练轮次为100,初始训练样本比例为0.1,当前训练轮次为50时,用于当前轮次训练的缺陷-修复代码数据样本比例为0.32。
[0094]
步骤4-2:将缺陷-修复代码数据集根据缺陷-修复代码样本分类器划分的各样本缺陷修复难度等级由低到高进行重新排列,作为代码语言模型训练调度器的输入数据。
[0095]
步骤4-3:建立基于样本调度函数的代码语言模型训练调度器,使用基于等比级数序列的样本调度函数对输入数据进行调度解算分析,输出满足当前训练轮次的缺陷-修复代码数据样本数据批次。
[0096]
步骤五、建立基于课程学习机制的代码语言模型微调训练器,通过多批次缺陷-修复代码数据样本对代码语言模型进行多轮迭代微调训练,如图3所示。
[0097]
步骤5-1:使用基于步骤4-3输出的缺陷-修复代码数据样本数据批次输入至代码语言模型,对其进行微调训练。
[0098]
步骤5-2:构建基于反馈响应的课程学习机制,根据微调训练的结果是否收敛判断本轮次训练是否完成。如果结果不收敛,表明本轮次训练尚未完成,需继续进行微调训练;如果结果收敛,表明本轮次训练已完成,此时需更新训练轮次t,令t=t+1,将更新后的t值重新输入基于样本调度函数的代码语言模型训练调度器,重复步骤4-1至步骤5-1,直到满足终止条件t=t。
[0099]
步骤5-3:当所有批次缺陷-修复代码数据样本数据均完成微调训练后,输出经过多轮迭代微调训练的代码语言模型。
[0100]
步骤六、将目标程序代码中的缺陷部分输入至微调训练后的代码语言模型中,模型对目标程序代码中的缺陷部分进行映射,生成程序缺陷代码对应的候选补丁序列。
[0101]
步骤七、基于测试用例对生成的候选补丁序列进行验证,输出通过测试的正确代码补丁。
[0102]
步骤7-1:构建基于目标程序代码缺陷的测试用例集合,输入生成的程序缺陷代码候选补丁序列,对其进行单元测试和系统测试。
[0103]
步骤7-2:对测试用例的测试结果进行分析,输出通过全部测试的正确代码补丁,完成程序缺陷修复。
[0104]
本发明的一种基于代码语言模型的程序缺陷自动修复方法,基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,能够对存在缺陷的代码样本数据进行修复难度等级划分。基于样本调度函数的代码语言模型微调调度器,能够基于分类器划分的修复难度等级构建多批次缺陷-修复代码数据样本。基于课程学习机制的代码语言模型微调训练器,能够基于调度器输出的多批次缺陷-修复代码数据样本对代码语言模型进行多轮迭代微调训练,有效提高代码语言模型生成程序补丁的正确率,从而实现软件程序缺陷的高效自动修复。
[0105]
效果验证
[0106]
为验证本发明提出的基于课程学习机制的微调训练框架性能,与现有典型技术进行对比实验。选取46680条代码样本数据作为训练样本,5835条代码样本数据作为测试样本,这些样本中均含有多种类型的程序缺陷。所比较的现有典型技术为lstm模型和transformer模型。使用bleu和修复成功率为实验评估指标,bleu分数是一种衡量生成结果与期望结果相似度的评价指标,能够反映模型生成补丁的平均质量,分数越高表明生成补丁与正确补丁越接近,平均质量越高。实验结果如表1所示:
[0107]
表1
[0108]
方法bleu修复成功率(%)lstm76.7610.0transformer77.2114.7所提方法77.8517.4
[0109]
从表1可知,本发明所提方法的bleu分数和修复成功率均高于现有技术lstm模型和transformer模型,这表明本发明的方法能够有效提升生成补丁的质量,提高程序缺陷修复成功率。
[0110]
本发明的上述内容仅为本发明的较佳实施例,并非用于限制本发明的实施方案,本领域普通技术人员根据本发明的主要构思和精神,可以十分方便地进行相应的变通或修改,故本发明的保护范围应以权利要求书所要求的保护范围为准。
技术特征:
1.一种基于代码语言模型的程序缺陷自动修复方法,其特征在于,包括如下步骤:步骤一、利用开源程序项目源代码语料库,构建代码语言模型;步骤二、利用程序缺陷代码样本和正确代码样本,构建缺陷-修复代码数据集;步骤三、构建基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,对数据集样本进行评估并划分缺陷修复难度等级;步骤四、建立基于样本调度函数的代码语言模型微调调度器,构建基于缺陷-修复代码数据集的多批次缺陷-修复代码数据样本;步骤五、建立基于课程学习机制的代码语言模型微调训练器,通过多批次缺陷-修复代码数据样本对代码语言模型进行多轮迭代微调训练;步骤六、将目标程序中的缺陷代码输入至微调训练后的代码语言模型中,输出程序缺陷代码对应的候选补丁序列;步骤七、基于测试用例对生成的候选补丁序列进行验证,输出通过测试的正确代码补丁。2.根据权利要求1所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,步骤一具体操作为:从开源程序项目源代码语料库中获取包含自然语言注释和编程语言代码的双模态语料数据;对于给定双模态语料数据对x={w,c},其中w为自然语言序列,c为编程语言序列,分别对这两部分随机选择掩码位置,记为m
w
和m
c
,其中选择的掩码位置在对应序列中需服从均匀分布;使用预定义标识符对选定掩码位置中的字符进行掩码处理,将处理后的自然语言序列样本记为w
masked
,将处理后的编程语言序列样本记为c
masked
;对于输入样本序列x=[x1,
…
,x
n
],分别进行生成式向量编码和判别式向量编码构建标准遮蔽语言建模函数:构建替换序列检测函数:其中,使用标准遮蔽语言建模函数和替换序列检测函数构建代码语言模型,其目标损失函数满足约束3.根据权利要求2所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,生成式向量编码使用softmax函数对其进行处理,则在样本序列位置t
上输出字符x的概率为其中e(
·
)表示字符的向量表征;判别式向量编码使用sigmoid函数对其进行处理,则在样本序列位置t上的字符被替换的概率为将替换后的序列样本记为x
corrupt
。4.根据权利要求1所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,步骤二具体操作为:从开源项目仓库中收集包含错误提交版本和修正提交版本的程序文件,根据提交记录提取存在程序缺陷的代码样本和其对应的正确代码样本,组成缺陷-修复代码数据对;对程序代码样本数据进行预处理,将提取的缺陷-修复代码数据进行代码长度分析,按程序缺陷代码样本的长度统计收集的代码数据对的概率密度分布,剔除超过预定长度标准的代码样本数据。5.根据权利要求1所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,步骤三具体操作为:构建基于交叉评估的缺陷修复难度判别策略;获取所有数据子集的缺陷修复相对难度分数,并对各数据子集中的每一组缺陷-修复代码数据对样本进行难度分数标记,进而对缺陷-修复代码数据集中的所有样本进行缺陷修复难度标注;建立基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,对缺陷-修复代码数据集中的所有样本按标注的难度分数进行缺陷修复难度分类,得到各样本缺陷修复难度等级。6.根据权利要求5所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,步骤三中,基于交叉评估的缺陷修复难度判别流程如下:初始状态,输入缺陷-修复代码数据集s和代码语言模型m;将数据集s平均分为n份,n为大于2的整数;对n份数据子集中的每一个数据子集分别执行以下操作:首先,从n份数据子集中选取该数据子集作为训练数据集对代码语言模型m进行训练,得到训练后的代码语言模型m’;其次,将除去该数据子集的其余n-1个子集分别作为测试集,依次对代码语言模型m’进行测试,得到n-1个测试分数。最后,对得到n-1个测试分数取平均值,记为该数据子集对应的测试结果;完成遍历所有n份数据子集,得到对应的n份测试结果;对n份测试结果从高到低进行排序,根据测试结果排名得到每一个数据子集的缺陷修复相对难度分数,排名越高的测试结果对应的数据子集缺陷修复相对难度分数越低。7.根据权利要求1所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,步骤四具体操作如下:构建基于等比级数序列的样本调度函数:
其中,t为代码语言模型当前训练轮次,f表示用于当前轮次训练的缺陷-修复代码数据样本比例,u为初始训练样本比例,t为总训练轮次;将缺陷-修复代码数据集根据缺陷-修复代码样本分类器划分的各样本缺陷修复难度等级由低到高进行重新排列,作为代码语言模型训练调度器的输入数据;建立基于样本调度函数的代码语言模型训练调度器,使用基于等比级数序列的样本调度函数对输入数据进行调度解算分析,输出满足当前训练轮次的缺陷-修复代码数据样本数据批次。8.根据权利要求1所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,步骤五具体操作如下:使用缺陷-修复代码数据样本数据批次输入至代码语言模型,对其进行微调训练;构建基于反馈响应的课程学习机制,根据微调训练的结果是否收敛判断本轮次训练是否完成;如果结果不收敛,表明本轮次训练尚未完成,继续进行微调训练;如果结果收敛,表明本轮次训练已完成,此时更新训练轮次t,令t=t+1,将更新后的t值重新输入基于样本调度函数的代码语言模型训练调度器,构建下一批次缺陷-修复代码数据样本,并使用得到的缺陷-修复代码数据样本对代码语言模型进行下一轮迭代微调训练,直到满足终止条件t=t;当所有批次缺陷-修复代码数据样本数据均完成微调训练后,输出经过多轮迭代微调训练的代码语言模型。9.根据权利要求1所述的基于代码语言模型的程序缺陷自动修复方法,其特征在于,步骤七具体操作如下:构建基于目标程序代码缺陷的测试用例集合,输入生成的程序缺陷代码候选补丁序列,对其进行单元测试和系统测试;对测试用例的测试结果进行分析,输出通过全部测试的正确代码补丁,完成程序缺陷修复。10.一种基于代码语言模型的程序缺陷自动修复系统,所述系统包括如权利要求1至9任一项所述基于代码语言模型的程序缺陷自动修复方法的计算模块。
技术总结
本发明涉及一种基于代码语言模型的程序缺陷自动修复方法,包括如下步骤:步骤一、利用开源程序项目源代码语料库,构建代码语言模型;步骤二、利用程序缺陷代码样本和正确代码样本,构建缺陷-修复代码数据集;步骤三、构建基于缺陷修复难度判别策略的缺陷-修复代码样本分类器,对数据集样本进行评估并划分缺陷修复难度等级。本发明基于课程学习机制的微调训练框架对数据集进行缺陷修复难度划分,使用处理后的数据集对代码语言模型进行多轮迭代微调训练,能够有效提升模型生成补丁的质量,提高程序缺陷修复成功率。高程序缺陷修复成功率。高程序缺陷修复成功率。
技术研发人员:郝思冲 刘宏伟 史先俊 舒燕君
受保护的技术使用者:哈尔滨工业大学
技术研发日:2023.06.19
技术公布日:2023/9/16
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
上一篇:一种背包加工用打孔装置的制作方法 下一篇:一种船舶制造用安全固定结构的制作方法