一种基于异质图神经网络的软件缺陷预测方法

    专利查询2022-07-08  137



    1.本发明属于软件缺陷测试领域,具体是一种基于异质图神经网络的软件缺陷预测方法。


    背景技术:

    2.软件开发的过程中,不可避免的会引入软件缺陷,而软件缺陷对于软件质量有重要的影响。
    3.伴随着移动互联网、云计算、区块链和人工智能的兴起,软件质量保证的使用范围也从传统软件行业拓宽至新兴软件领域内,并且对于软件质量保证提出了更高的需求。多样化的软件应用已经覆盖到各行各业,在不断的迭代和更新软件技术的同时,软件的复杂度也越来越高,此时软件系统的可靠性和稳定性是一个不容忽视的问题,它与国防安全、工业生产、人民群众的生命财产安全息息相关。尤其在国防、工业生产等领域,因为软件缺陷导致的事故一般会带来重大的伤亡并伴随着巨额的经济财产损失。如此高昂的代价需要所有的软件从业人员重视软件质量问题,并尽可能的降低由软件质量问题带来的损失。
    4.根据ieee标准,在软件生命周期中,软件缺陷导致软件无法满足需求和规格要求,需要进行修复的瑕疵和问题,是软件程序在开发、执行期间表达的信息与软件需求之间的冲突。软件缺陷预测则是利用已有的软件缺陷领域知识与软件文档、仓库,源代码相关信息结合,通过算法,在软件项目的源代码中预测出尚未被发现的缺陷。
    5.当前的软件缺陷预测技术面对复杂度高的软件开发形势存在局限性。通过数据驱动的方式,缺陷预测技术使用人工设计的度量元或者机器学习特征提取技术,并结合相关的分类算法或者网络模型进行缺陷的预测和等级分类。在实际应用中,基于机器学习驱动的软件缺陷预测技术面临着冷启动和缺少标注数据的问题,这使得人工设计特征或者机器学习方法的软件缺陷预测技术的实际应用价值受到较多的限制。同时,进行跨项目的软件缺陷预测是一个比较困难的点:不同项目间的差异性较大,开发的需求、应用的场景等软件开发背景和实际的开发内容、开发管理流程都无法直接迁移。


    技术实现要素:

    6.针对上述问题,本发明提出了一种基于异质图神经网络的软件缺陷预测方法,以软件代码和缺陷报告数据为基础,将它们转化为图结构,并通过构建异质图神经网络进行代码到缺陷的链接预测,实现了项目内和项目间的软件缺陷预测和定位。
    7.具体步骤如下:
    8.步骤一、针对软件仓库,将该软件仓库的原始源代码转换成抽象语法树,进行数据解析,抽取内容节点并保留各节点在抽象语法树的上下位关系,得到代码精简图;
    9.具体为:
    10.首先,将源代码通过clang编译器的语法分析器转换成对应的抽象语法树结构,忽略抽象语法树内置的相关系统库文件和外部引入的第三方链接库,保留编写的代码内容。
    11.随后,从根节点开始进行代码内容的深度优先遍历,抽取内容中的名字空间、类、结构体、函数、statement等类型节点,并根据抽象语法树的节点上下文信息保留各节点之间对应的具体关联。
    12.步骤二、从软件缺陷追溯系统的问题列表issues list中,获取被标记为bug类型的所有缺陷问题,并解析各缺陷对应的细节信息、缺陷总结、缺陷描述以及修复的补丁,保留缺陷追溯系统中各缺陷与其他已有缺陷的关联信息,从而构建得到缺陷链;
    13.步骤三、将缺陷链中各缺陷节点的描述与代码精简图中各节点的内容匹配,进行跨域的关联链接;
    14.具体过程为:
    15.首先,将代码精简图中各节点的内容分别作为一个模式串,所有模式串构建成代码内容文本的前缀树,在前缀树上通过构建状态机进行失配跳转,跳转回上一个最长前缀节点。
    16.然后,将每个缺陷节点的缺陷描述分别作为一个文本串,在前缀树上对已有的所有模式串分别进行匹配,如果文本串a与模式串b匹配成功,则将文本串a对应的缺陷节点与模式串对应的代码精简图的节点进行跨域的链接;如果文本串a与模式串b匹配不成功,继续选择下一个模式串重新匹配,直至成功;如果整个前缀树中都没有模式串与文本串a匹配成功,则在前缀树中加入新的模式串并建立相应的状态机。
    17.所述在前缀树上构建状态机的步骤如下:
    18.首先,检测前缀树上是否存在已有模式的前缀,如果存在,则记录当前模式的信息到已有模式前缀的结尾;若不存在,利用当前模式的信息创建新的前缀树分支;在构建新的前缀树中,当前分支的叶节点状态机的失配状态连接到上一个最长对称子序列的末端节点;若到达模式串结尾,则在处理好失配状态机后转跳回前缀树的根部。
    19.步骤四、在代码精简图上针对各个节点的代码内容片段构建表示模型,获取各节点对应的表示向量;
    20.具体为:
    21.首先,从代码精简图对应的抽象语法树上,获取从一个叶节点跨越根节点到达另一端叶节点的深度关键路径,获取的关键路径数量与语法树的深度相同;
    22.然后,将抽象语法树的节点类型作为序列的token,给出对应token的初始化表示,并在同一个深度下,将各关键路径之间进行注意力聚合;随后在不同深度内的关键路径之间进行注意力聚合,将多条路径汇聚为该抽象语法树的表示向量信息。
    23.接着,对抽象语法树遍历的各节点抽取时划分的类型进行分类,得到代码节点的表示向量信息。
    24.使用结合softmax的交叉熵函数作为损失函数对分类过程进行训练,损失收敛后得到的表示向量即为各代码节点的表示信息;
    25.步骤五、对缺陷链各个缺陷节点的缺陷描述做seq2seq处理,将得到的总结序列与原有的缺陷总结通过rouge指标进行评估训练,得到各缺陷节点对应的表示向量;
    26.具体为:
    27.首先,对缺陷链各节点的缺陷描述视为各节点的长文本,对应于各缺陷节点的总结信息。
    28.然后,逐个将长文本送入t5模型中,通过自监督的破坏部分内容随后还原的预训练方法,获取各长文本对应的摘要总结文本;
    29.最终,通过rouge将各长文本对应的总结信息的向量表示与摘要总结文本的向量表示进行有监督的学习,获取到摘要文本中[cls]位置的向量作为缺陷描述的表示向量信息,即得到各缺陷节点的表示向量信息;
    [0030]
    步骤六、将代码精简图的各节点表示向量和缺陷链的各节点表示向量,输入面向异质图的神经网络中,进行节点自身的内容信息和节点间的消息传递;利用代码精简图和缺陷链中各节点匹配后跨域的关联,将潜在缺陷的代码节点与缺陷库中的节点连接起来;
    [0031]
    该异质图神经网络从节点端和语义路径端对节点的领域和远端语义路径进行信息的传递。
    [0032]
    节点端:
    [0033]
    通过在邻域进行图采样获取n阶邻居节点,随后逐阶通过自注意力机制将高阶邻居节点的信息汇聚到低阶邻居节点上,对于不同类型的节点,使用线性变换将它们从自身特有的表示空间转换到对应目标节点类型的表示空间中。
    [0034]
    节点端汇聚的函数为:
    [0035][0036]
    对节点vi一共进行阶邻居采样,对第阶上有邻居节点vk进行自注意力的聚合;进行自注意力的聚合;是第阶上的所有邻居节点集合;是节点vk自注意力的查询向量,是节点vk自注意力的键向量,是自注意力的值向量。d是自注意力向量的维度数,σ为激活函数;
    [0037]
    同时,节点端汇聚能够融入多头注意力机制,实现多头自注意力机制,此时对应的汇聚函数为:
    [0038][0039]
    h为多头注意力机制的头数;
    [0040]
    从而得到一个包含节点自身内容及其邻域的汇聚信息的表示向量。
    [0041]
    语义路径端:
    [0042]
    语义路径间聚合是对代码精简图和缺陷链中各节点匹配后跨域的连接边进行聚合,由于存在多种不同类型的连接边,因此通过不同特征空间的边向量空间加以区别。
    [0043]
    将不同的语义路径进行聚合,从语义路径的远端将代码或缺陷的内容信息传递到另一端,利用多头的自注意力将各种不同的语义路径进行聚合,从而为软件缺陷的理解和检测提供了相关数据。
    [0044]
    步骤七、将异质图神经网络作为图编码器,使用dismult表示方法作为解码器,计算连接的潜在缺陷的代码节点与缺陷库中的节点之间连接边的得分,并判断得到是否超过0.5,如果是,则判定两者存在关联,即代码存在当前缺陷,反之,代码不存在当前缺陷;
    [0045]
    得分计算公式为:
    [0046]
    f(h,r,t)=||h
    t
    mrt||
    [0047]
    本发明在此处设计的间距损失函数为:
    [0048][0049]
    γ为对应的预设间隔,mr为特定关系对应的参数矩阵,s

    对应正样本集,s-则对应于构造的负样本集合。
    [0050]
    间隔约束条件如下:
    [0051]
    (1)在正样本得分与负样本得分的差,添加上设定的预定间隔之后,若大于0,则保留原计算值;
    [0052]
    (2)若正样本得分与负样本得分的差,添加上设定的预定间隔后小于0,则统一保留归为0;
    [0053]
    (3)计算得到的得分需要统一进行sigmoid归一化;
    [0054]
    步骤八、对于新输入到代码或软件仓库,返回步骤一进行相关原始数据的处理,得到新的代码图和缺陷图融入到当前的图中。
    [0055]
    本发明的优点在于:
    [0056]
    1)、一种基于异质图神经网络的软件缺陷预测方法,能够帮助程序开发者、软件测试人员和软件管理人员简单高效地了解软件项目中的代码缺陷情况,提高了软件项目的可靠性和稳定性。
    [0057]
    2)、一种基于异质图神经网络的软件缺陷预测方法,将代码转换为较细粒度的精简抽象语法树,通过在代码图中对缺陷节点进行链接预测,做到缺陷预测的同时,能够天然对缺陷的位置进行定位,定位到具体连接的代码节点内容。
    [0058]
    3)、一种基于异质图神经网络的软件缺陷预测方法,将缺陷检测与已有缺陷库关联,使得在给出代码缺陷链接的同时,给出缺陷库内已有的相关缺陷解决方法,有助于开发测试人员快速解决已有缺陷。
    附图说明
    [0059]
    图1是本发明基于异质图神经网络进行软件缺陷预测的整体分层架构图;
    [0060]
    图2是本发明一种基于异质图神经网络的软件缺陷预测方法的流程图;
    [0061]
    图3是本发明中关于代码节点的内容表示向量获取方法示意图;
    [0062]
    图4是本发明中关于异质图神经网络双层聚合示意图;
    [0063]
    图5是本发明实现的编码器-解码器进行软件缺陷预测的结构示意图;
    [0064]
    图6是本发明实现的代码转换图结构工具得到的mesos仓库部分代码图示意图;
    [0065]
    图7是本发明使用两种负采样容量下进行缺陷链接预测实验对比图;
    [0066]
    图8是本发明对比使用异质图神经网络和不使用的情况下进行缺陷链接预测实验对比图;
    具体实施方式
    [0067]
    下面将结合附图和实施示例对本发明作进一步的详细说明,但不构成对本发明的
    限制。
    [0068]
    本发明一种基于异质图神经网络的软件缺陷预测方法,通过对软件仓库的源代码和缺陷报告转化为对应的图结构,基于异质图神经网络计算图中节点的向量表示,进行节点间链接预测的软件缺陷预测;通过包含具体的代码缺陷内容以及语义路径信息,提高软件缺陷检测的信息量及精确性,为复杂的跨软件缺陷检测中的缺陷预测和定位工作提供帮助,以便于后期修复。
    [0069]
    该软件缺陷预测方法的整体架构如图1所示,首先对软件仓库源代码数据进行解析抽取,转为抽象语法树进行树上节点的化简,并解析软件缺陷报告中存在的缺陷内容和缺陷关联,随后通过附有状态机的前缀树,对代码和缺陷进行跨域的关联;
    [0070]
    然后,通过对语法树的深度路径抽取和多层的序列聚合得到代码节点的内容表示,通过缺席描述的摘要生成和原有总结进行有监督训练得到缺陷节点的表示;
    [0071]
    并将计算得到的代码节点表示和缺陷节点表示作为异质图神经网络的输入,通过领域的自注意力聚合和语义路径的聚合,学习到节点的最终表示,并利用解码器对节点对进行解码,得到存在链接的得分,以便软件开发人员和软件测试人员发现程序的缺陷并修复。
    [0072]
    本发明以新的视角进行软件缺陷预测任务,通过代码内容和缺陷的信息传递,提升了软件缺陷预测效果,并天然能够做到对代码的精确定位。
    [0073]
    所述的一种基于异质图神经网络的软件缺陷预测方法,如图2所示,具体步骤如下:
    [0074]
    步骤一、针对软件仓库,将该软件仓库的原始源代码转换成抽象语法树,进行数据解析,抽取内容节点并保留各节点在抽象语法树的上下位关系,得到代码精简图;
    [0075]
    具体为:
    [0076]
    首先,将源代码通过clang编译器的语法分析器转换成对应的抽象语法树结构,忽略抽象语法树内置的相关系统库文件和外部引入的第三方链接库,保留编写的代码内容。
    [0077]
    随后,从根节点开始进行代码内容的深度优先遍历,抽取内容中的名字空间、类、结构体、函数、statement等类型节点,并根据抽象语法树的节点上下文信息保留各节点之间对应的具体关联。
    [0078]
    步骤二、利用软件缺陷追溯系统(issue tracking system)获取问题列表(issues list)中,被标记为bug类型的所有缺陷问题,并解析各缺陷对应的细节信息、缺陷总结、缺陷描述以及修复的补丁,保留缺陷追溯系统中各缺陷的关联信息,例如与其他已有缺陷相关,从而构建得到缺陷链;
    [0079]
    缺陷追溯系统是现有的一类系统,用来管理软件中缺陷维护工作,里面包含问题列表issues list。
    [0080]
    步骤三、将缺陷链中各缺陷节点的描述与代码精简图中各节点的内容匹配,进行跨域的关联链接;
    [0081]
    具体过程为:
    [0082]
    首先,将代码精简图中各节点的内容分别作为一个模式串,所有模式串构建成代码内容文本的前缀树,在前缀树上通过构建状态机进行失配跳转,跳转回上一个最长前缀节点。
    [0083]
    然后,将每个缺陷节点的缺陷描述分别作为一个文本串,在前缀树上对已有的所有模式串分别进行匹配,如果文本串a与模式串b匹配成功,则将文本串a对应的缺陷节点与模式串对应的代码精简图的节点进行跨域的链接;如果文本串a与模式串b匹配不成功,继续选择下一个模式串重新匹配,直至成功;如果整个前缀树中都没有模式串与文本串a匹配成功,则在前缀树中加入新的模式串并建立相应的状态机。
    [0084]
    所述在前缀树上构建状态机的步骤如下:
    [0085]
    检测前缀树上是否存在已有模式的前缀,如果存在,则记录当前模式的信息到已有模式的前缀结尾;若不存在,则利用当前模式的信息创建新的前缀树分支;在构建新的前缀树中,当前分支的叶节点状态机的失配状态连接到上一个最长对称子序列的末端节点;若到达模式串结尾,则在处理好失配状态机后转跳回前缀树的根部。
    [0086]
    步骤四、在步骤一中得到的代码精简图上针对各个节点的代码内容片段构建表示模型,获取各节点对应的表示向量;
    [0087]
    如图3所示,具体为:
    [0088]
    首先,从代码精简图对应的抽象语法树上,获取从一个叶节点跨越根节点到达另一端叶节点的深度关键路径,获取的关键路径数量与语法树的深度相同;
    [0089]
    然后,将抽象语法树的节点类型作为序列的token,给出对应token的初始化表示,并在同一个深度下,将各关键路径内部进行软注意力聚合,得到各个路径自身的表示向量;随后在不同深度内的关键路径之间进行注意力聚合,将多条路径汇聚为该抽象语法数的表示向量,即当前代码节点的表示向量。
    [0090]
    通过对抽象语法树遍历的各节点抽取时划分的类型进行分类,得到代码节点的表示向量信息。代码节点的类型对应于节点的语法含义,例如函数、类等代码语义层面的信息作为节点的类型,共有5种语义标签,而分类则使用结合softmax的交叉熵函数作为损失函数对整个过程进行训练,损失收敛后得到的模型计算出的表示向量即为使用所需的代码节点表示信息;
    [0091]
    步骤五、对缺陷链各个缺陷节点的缺陷描述做seq2seq处理,将得到的总结序列与原有的缺陷总结通过rouge指标进行评估训练,得到各缺陷节点对应的表示向量;
    [0092]
    具体为:
    [0093]
    首先,对缺陷链各节点的描述信息分别视作长文本,对应于各缺陷节点的总结信息。
    [0094]
    然后,逐个选择长文本,并送入t5(text-to-text transfer transformer)模型中,通过自监督的破坏部分内容随后还原的预训练方法,获取该长文本对应的摘要总结文本;
    [0095]
    最终通过rouge将各长文本对应的总结信息的向量表示与摘要总结文本的向量表示,进行有监督的学习,获取到摘要文本中[cls]位置的向量作为缺陷描述的表示向量信息,即得到各缺陷节点的表示向量信息;
    [0096]
    步骤六、将代码精简图的各节点表示向量和缺陷链的各节点表示向量,输入面向异质图的神经网络中,进行节点自身的内容信息和节点间的消息传递;利用代码精简图和缺陷链中各节点匹配后跨域的关联,通过链接预测的任务训练,将潜在缺陷的代码节点与缺陷库中的节点连接起来;
    [0097]
    异质图是指图中节点或边的类型不止一种的图,通过在该图上设计一个能够将代码图和缺陷图之间的语义结构化信息在两边进行传递的图神经网络;该异质图神经网络将从节点端和语义路径端对节点的领域和远端语义路径进行信息的传递,如图4所示。
    [0098]
    在节点端通过在邻域进行图采样获取n阶邻居节点,随后逐阶通过自注意力机制将高阶邻居节点的信息汇聚到低阶邻居节点上,对于不同类型的节点,使用线性变换将它们从自身的特有的表示空间转换到对应目标节点类型的表示空间中。
    [0099]
    在本发明中,节点端汇聚的函数为:
    [0100][0101]
    对节点vi一共进行阶邻居采样,对第阶上有邻居节点vk进行自注意力的聚合;进行自注意力的聚合;是第阶上的所有邻居节点集合;是节点vk自注意力的查询向量,是节点vk自注意力的键向量,是节点vk自注意力的值向量。d是自注意力向量的维度数,σ为激活函数。
    [0102]
    同时,节点端汇聚能够融入多头注意力机制,实现多头自注意力机制,此时对应的汇聚函数为:
    [0103][0104]
    h为多头注意力机制的头数;
    [0105]
    从而得到一个包含节点自身内容及其邻域的汇聚信息的表示向量。
    [0106]
    在语义路径间聚合则是对代码精简图和缺陷链中各节点匹配后,所有的跨域代码和缺陷连接边进行聚合,由于存在多种不同类型的连接边,因此通过不同特征空间的边向量空间加以区别。
    [0107]
    将不同的语义路径进行聚合,从语义路径的远端将代码或缺陷的内容信息传递到另一端,利用多头的自注意力将各种不同的语义路径进行聚合,让模型能够兼容各种类型的节点进行跨域的信息交互,从而为软件缺陷的理解和检测提供了相关数据。
    [0108]
    链接预测的训练通过负样本构造,随后区别正负样本的方式进行。为此,对每一个正样本构造的1000个节点类型相同的负样本,并使用贝叶斯个性化排序作为训练的损失函数:
    [0109][0110]
    γ为对应的预设间隔。
    [0111]
    通过该损失函数进行异质图神经网络的训练,本发明得到一个直推式的图中节点的表示方法。
    [0112]
    步骤七、将异质图神经网络作为图编码器,使用dismult表示方法作为解码器,计算连接的潜在缺陷的代码节点与缺陷库中的节点之间连接边的得分,并判断得到是否超过0.5,如果是,则判定两者存在关联,即代码存在当前缺陷;反之,代码不存在当前缺陷;
    [0113]
    如图5所示,通过负采样进行学习,将该得分作为代码与缺陷之间是否存在连接的依据;
    [0114]
    dismult是从矩阵分解的角度将节点对和对应的边进行分解,它对应的得分函数为:
    [0115]
    f(h,r,t)=||h
    t
    mrt||
    [0116]
    本发明在此处设计的间距损失函数为:
    [0117][0118]
    γ为对应的预设间隔,mr为特定关系对应的参数矩阵,s

    对应正样本集,s-则对应于构造的负样本集合。
    [0119]
    间隔约束条件如下:
    [0120]
    (1)在正样本得分与负样本得分的差,添加上设定的预定间隔之后,若大于0,则保留原计算值;
    [0121]
    (2)若正样本得分与负样本得分的差,添加上设定的预定间隔后小于0,则统一保留归为0;
    [0122]
    (3)计算得到的得分需要统一进行sigmoid归一化;
    [0123]
    步骤八、对于新输入到代码或软件仓库,返回步骤一进行相关原始数据的处理,得到新的代码图和缺陷图融入到当前的图中。
    [0124]
    具体实例:
    [0125]
    使用本发明所述方法对apache组织维护的8个软件仓库进行软件缺陷预测,如图6所示为生成的mesos软件对应的代码图结构,如图7所示为软件缺陷预测方法在小的负样本采样下和较大负样本采样下的预测效果,发现预测的数据能够有效的在大量的缺陷样本中将正确的缺陷样本排在前列,图8所示为对比使用该基于异质图神经网络的方法与不使用异质图神经网络时的预测性能比较。通过结果分析可得本发明的软件缺陷预测方法能够精确、准确地发现软件中潜在的相关缺陷。
    转载请注明原文地址:https://tc.8miu.com/read-2846.html

    最新回复(0)