知识驱动的软件缺陷检测与分析方法及系统

文档序号:26748289发布日期:2021-09-25 01:34阅读:216来源:国知局
知识驱动的软件缺陷检测与分析方法及系统

1.本发明属于软件安全领域,特别涉及一种知识驱动的软件缺陷检测与分析方法及系统。


背景技术:

2.软件缺陷是指软件产品的结果不符合软件要求或最终用户期望。它通常会以非预期的方式产生不正确或意外的结果和行为。软件日益增加的复杂性和依赖性增加了软件高质量、低成本和可维护的难度,以及创建软件缺陷的可能性。传统的缺陷检测方法大多针对某种特定类型的缺陷,通过正则表达式来匹配代码中可能存在缺陷的语句。然而,完全依靠人工专家制定的缺陷规则来涵盖日益增长的软件缺陷是不切实际的。
3.目前已有一些工作使用机器学习的方法来检测软件缺陷。何吉元等人提出一种基于搜索的半监督集成方法,通过具有全局搜索能力的遗传算法,基于少量已标记目标实例对基分类器进行集成,显著提高了项目间缺陷检测的性能。陈曙等人提出将实例加权的领域适配与机器学习的预测模型训练过程相结合,通过构造目标项目样本相关的权重,以实例权重去影响预测模型的参数学习过程,将来自目标项目中缺陷数据集的分布特性适配到训练数据集中,从而实现缺陷数据样本的复用和跨项目软件缺陷预测。然而,目前大多数基于机器学习的软件缺陷检测方法的粒度均为文件级,使得当部署到实际的应用场景下时,用户难以根据粗粒度的检测结果来辅助代码的维护与保障。


技术实现要素:

4.发明目的:本发明的目的在于针对上述现有技术存在的问题,提供一种具有应用领域更广、精度更高、可解释性更强等特点的知识驱动的软件缺陷检测与分析方法及系统。
5.技术方案:为实现本发明目的所采用的技术方案为:一种知识驱动的软件缺陷检测与分析方法,所述方法包括以下步骤:
6.步骤1,采集公开的缺陷数据,构建缺陷数据集;
7.步骤2,对缺陷代码进行预处理,通过代码特征图对代码进行建模并嵌入到向量空间;其中代码特征图根据抽象语法树ast、控制流图cfg和程序依赖图pdg构造,图的边类型由ast、cfg和pdg构成,节点集由抽象语法树ast的节点集构成;从代码特征图中提取与缺陷代码行相关的缺陷特征子图进行图嵌入;
8.步骤3,通过图神经网络学习缺陷代码隐式特征,训练缺陷检测模型;
9.步骤4,对待检测项目进行处理,输入最优的检测模型中,检测项目中存在的缺陷,并将检测到的缺陷依据其缺陷类型与缺陷数据集中的同类型已知缺陷进行相似度计算,匹配相似度最高的已知缺陷;
10.步骤5,提取相似缺陷报告中有语义价值的缺陷知识,进行知识融合与检测,构建软件缺陷知识图谱,通过挖掘相似缺陷报告中的关键信息以辅助开发者理解检测出的缺陷;
11.进一步地,步骤1所述采集公开的缺陷数据,构建缺陷数据集,具体过程包括:
12.步骤1

1,从缺陷追踪库和开源代码库中采集公开的缺陷数据,包括缺陷报告以及缺陷代码;
13.步骤1

2,对采集到的缺陷数据进行预处理,从函数级别提取缺陷代码,对函数级缺陷代码进行清洗,去除包括代码注释、声明的全局参数在内的多余信息,得到缺陷数据集。
14.进一步地,步骤2所述对缺陷代码进行预处理,通过代码特征图对代码进行建模并嵌入到向量空间,具体过程包括:
15.步骤2

1,依据缺陷报告中的描述信息,结合缺陷发生的原因,对缺陷进行分类,并通过抽象关系,对缺陷子类型进行归并,获得缺陷类型表,其中缺陷类型包括功能缺陷、接口缺陷、逻辑缺陷、计算缺陷和数据缺陷;
16.步骤2

2,对缺陷数据集中的缺陷数据进行分类,构建语料库,并划分训练集和验证集;
17.步骤2

3,对训练集中的缺陷代码进行代码表征,将缺陷代码表示为抽象语法树ast、控制流图cfg和程序依赖图pdg,并将三种图进行合成,构造代码特征图,其中图的边类型由ast、cfg和pdg构成,节点集由抽象语法树ast的节点集构成;
18.步骤2

4,通过程序切片对步骤2

3得到的缺陷代码特征图进行切分,得到与缺陷代码行相关的缺陷特征子图;
19.步骤2

5,识别缺陷特征子图中的变量名和函数名,依据在单个函数内的出现顺序重命名,以对代码进行标准化,剔除人为命名带来的噪声;
20.步骤2

6,使用word2vec和doc2vec分别对缺陷特征子图中的叶子节点和语句节点进行图嵌入,获得可作为图神经网络输入的向量表示。
21.进一步地,步骤3所述通过图神经网络学习缺陷代码隐式特征,训练缺陷检测模型,具体过程包括:
22.步骤3

1,将缺陷特征子图输入到关系图卷积网络中,进行训练;其中,步骤2得到的图嵌入向量表示作为关系图卷积网络迭代所需的初始节点向量;
23.步骤3

2,通过关系图卷积网络,对节点特征进行迭代聚合,第l次聚合过程通过下述公式计算得到:
[0024][0025]
其中,表示节点i在关系r∈r(即边类型ast、cfg和pdg)下的邻居节点集合,r是关系集合。c
i,r
是一个用于计算与节点i存在关系r的邻居节点个数。w
r(l)
表示对于关系r的转移矩阵。w
s(l)
是一个自连接项,用于确保节点在l次迭代的特征表示也可以对l+1次迭代的特征表示产生影响。σ(
·
)是激活函数;
[0026]
步骤3

3,基于得到的节点特征,通过对特征嵌入向量进行求和,在图级进行节点聚合,并利用多类别交叉熵损失函数softmax训练分类器,以得到缺陷检测模型,并将步骤2

2中验证集中的缺陷代码结合步骤2

3至步骤2

6的代码表征处理输入训练得到的缺陷检测模型中进行模型调优。
[0027]
进一步地,步骤4所述对待检测项目进行处理,输入最优的检测模型中,检测项目
中存在的缺陷,并将检测到的缺陷依据其缺陷类型与缺陷数据集中的同类型已知缺陷进行相似度计算,匹配相似度最高的已知缺陷,具体过程包括:
[0028]
步骤4

1,将待测项目进行切分,得到多个函数级别的代码,并结合步骤2的代码表征处理,将其输入到步骤3训练好的最优检测模型中进行检测,输出存在缺陷的函数及其对应的缺陷类型;
[0029]
步骤4

2,将步骤4

1中得到的缺陷类型与缺陷数据集中的缺陷类型进行比对,从数据集中选择出与被检测到的缺陷代码类型一致的缺陷代码集作为搜索空间,并将两者经过代码表征得到的代码特征图输入到图相似函数中;
[0030]
步骤4

3,通过图相似函数,利用如下公式计算图间相似度:
[0031][0032]
其中,s(g,g')表示图g与g'的相似度,φ(g)、φ(g')表示代码特征图的图嵌入,d(φ(g),φ(g'))表示φ(g)与φ(g')的空间距离;
[0033]
步骤4

4,将计算得到的图间相似度进行排名,选择相似度最高的数据集中的已知缺陷作为相似缺陷进行匹配,并输出相似缺陷id。
[0034]
进一步地,步骤5所述提取相似缺陷报告中有语义价值的缺陷知识,进行知识融合与检测,构建软件缺陷知识图谱,具体过程包括:
[0035]
步骤5

1:根据相似缺陷id,获取对应的缺陷报告并进行预处理,提取有重要语义价值的信息,包括缺陷号、缺陷标题、产品、组件、严重性、改动状态、缺陷处理人、缺陷报告人、缺陷描述信息中的多种;
[0036]
步骤5

2,知识抽取,从步骤5

1中已经提取出的缺陷标题和缺陷描述信息中应用命名实体识别网络进行缺陷实体分类及实体关系识别,再从缺陷数据集对应的知识图谱中抽取出缺陷实体、属性以及实体间的相互关系。
[0037]
步骤5

3,在获得缺陷知识之后,进行知识融合来消除实体歧义;将语义不产生矛盾的缺陷知识实体加入到缺陷知识图谱中。
[0038]
进一步地,所述方法还包括步骤6,根据用户提问的软件缺陷领域相关问题,构建用户画像,并进行问题的语义理解,依据问题中实体知识在构建好的缺陷知识图谱进行图谱搜索,生成答案列表,并结合用户画像输出结果,具体过程包括:
[0039]
步骤6

1,进行用户提问的预处理:结合问答上下文信息,进行问句的解析、补全和规范操作,并提取用户问句中缺陷实体和关系;
[0040]
步骤6

2,图谱搜索与推理:将所述提取的缺陷实体与关系映射成neo4j图数据库的结构化查询语句进行知识图谱的图搜索;
[0041]
步骤6

3,答案排序:结合用户画像得到的用户特征与子图搜索得到的候选答案列表,通过ranknet模型对待排序的候选答案进行打分,根据分数的高低对候选答案进行排序。
[0042]
基于相同的发明构思,本发明提供的一种可解释性的软件漏洞检测与推荐系统,所述系统包括:
[0043]
缺陷数据准备模块,用于采集公开的缺陷数据,包括缺陷报告以及缺陷代码,构建缺陷数据集;
[0044]
代码特征建模模块,对缺陷代码进行预处理,通过代码特征图对代码进行建模并嵌入到向量空间;其中代码特征图根据抽象语法树ast、控制流图cfg和程序依赖图pdg构造,图的边类型由ast、cfg和pdg构成,节点集由抽象语法树ast的节点集构成;从代码特征图中提取与缺陷代码行相关的缺陷特征子图进行图嵌入;缺陷检测模型构建模块,用于通过图神经网络学习缺陷代码隐式特征,训练缺陷检测模型;
[0045]
缺陷检测和匹配模块,用于对待检测项目进行处理,输入最优的检测模型中,检测项目中存在的缺陷,并将检测到的缺陷依据其缺陷类型与缺陷数据集中的同类型已知缺陷进行相似度计算,匹配相似度最高的已知缺陷;
[0046]
以及,软件缺陷知识图谱构建模块,用于提取相似缺陷报告中有语义价值的缺陷知识,进行知识融合与检测,构建软件缺陷知识图谱,通过挖掘相似缺陷报告中的关键信息以辅助开发者理解检测出的缺陷。
[0047]
进一步地,所述系统还包括问答构建模块,根据用户提问的软件缺陷领域相关问题,构建用户画像,并进行问题的语义理解,依据问题中实体知识在构建好的缺陷知识图谱进行图谱搜索,生成答案列表,并结合用户画像输出结果。
[0048]
有益效果:本发明与现有技术相比,其显著优点为:1)从图的角度刻画缺陷代码的隐式特征,通过构建代码特征图来更好地利用多维缺陷代码语义特征;2)通过引入关系图卷积神经网络,将边类型也作为一种特殊的属性嵌入到节点特征学习过程中,提高模型的训练效果;3)利用缺陷代码特征子图相似度匹配,最大程度的挖掘缺陷代码间的关联关系;4)结合一些现有的知识图谱与nlp技术,为匹配的相似缺陷提供一些文本化描述与可视化展示,一定程度上为检测的结果提供了细粒度的、可解释的辅助信息,为后续软件缺陷定位和修复的实际应用研究打下基础。
附图说明
[0049]
图1为一个实施例中知识驱动的软件缺陷检测与分析方法的总体流程图。
[0050]
图2为一个实施例中知识驱动的软件缺陷检测与分析方法的详细流程图。
具体实施方式
[0051]
为了使本技术的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本技术进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本技术,并不用于限定本技术。
[0052]
在一个实施例中,结合图1,本发明提出一种知识驱动的软件缺陷检测与分析方法,包括以下步骤:
[0053]
步骤1,采集公开的缺陷数据,构建缺陷数据集;
[0054]
步骤2,对缺陷代码进行预处理,通过代码特征图对代码进行建模并嵌入到向量空间;
[0055]
步骤3,通过图神经网络学习缺陷代码隐式特征,训练缺陷检测模型;
[0056]
步骤4,对待检测项目进行处理,输入最优的检测模型中,检测项目中存在的缺陷,并将检测到的缺陷依据其缺陷类型与缺陷数据集中的同类型已知缺陷进行相似度计算,匹配相似度最高的已知缺陷;
[0057]
步骤5,提取相似缺陷报告中有语义价值的缺陷知识,进行知识融合与检测,构建软件缺陷知识图谱,通过挖掘相似缺陷报告中的关键信息(如缺陷类型、缺陷原因等)以辅助开发者理解检测出的缺陷。
[0058]
进一步地,在其中一个实施例中,如图2,步骤1所述构建缺陷数据集,具体过程包括:
[0059]
步骤1

1,从缺陷追踪库(如bugzilla等)和开源代码库(如github等)中采集公开的缺陷数据,包括缺陷报告(如缺陷描述、缺陷类型等)以及缺陷代码;
[0060]
步骤1

2,对采集到的缺陷数据进行预处理,从函数级别提取缺陷代码,对函数级缺陷代码进行清洗,去除包括代码注释、声明的全局参数等在内的多余信息,得到缺陷数据集。
[0061]
进一步地,在其中一个实施例中,步骤2所述对缺陷代码进行预处理,通过代码特征图对代码进行建模并嵌入到向量空间,具体过程包括:
[0062]
步骤2

1,依据缺陷报告中的描述信息,结合缺陷发生的原因,对缺陷进行分类,并通过抽象关系,对缺陷子类型进行归并,获得缺陷类型表,其中缺陷类型包括功能缺陷、接口缺陷、逻辑缺陷、计算缺陷、数据缺陷;本实施例的缺陷类型表如下表1所示。
[0063]
表1 缺陷类型表
[0064][0065]
步骤2

2,结合表1对缺陷数据集中的缺陷数据进行分类,构建语料库,并按8:2的比例划分训练集和验证集;
[0066]
步骤2

3,对训练集中的缺陷代码进行代码表征,通过开源工具joern将缺陷代码表示为抽象语法树ast、控制流图cfg和程序依赖图pdg,并将三种图进行合成,构造代码特征图,其中图的边类型由ast、cfg和pdg构成,节点集由抽象语法树ast的节点集构成;
[0067]
步骤2

4,识别缺陷代码中的敏感操作,通过程序切片对步骤2

3得到的缺陷代码特征图进行切分,得到与缺陷代码行密切相关的缺陷特征子图;
[0068]
步骤2

5,识别缺陷特征子图中的变量名variable和函数名func,依据在单个函数内的出现顺序,依此重命名为var1、var2和func1、func2等,以对代码进行标准化,剔除人为
命名带来的噪声;
[0069]
步骤2

6,使用word2vec和doc2vec分别对缺陷特征子图中的叶子节点和语句节点进行图嵌入,获得可作为图神经网络输入的向量表示。
[0070]
进一步地,在其中一个实施例中,步骤3所述通过图神经网络学习缺陷代码隐式特征,训练缺陷检测模型,具体过程包括:
[0071]
步骤3

1,将缺陷特征子图输入到关系图卷积网络中,进行训练。其中,步骤2

6得到的图嵌入向量表示作为关系图卷积网络迭代所需的初始节点向量;
[0072]
步骤3

2,通过关系图卷积网络,对节点特征进行迭代聚合,第l次聚合过程通过下述公式计算得到:
[0073][0074]
其中,表示节点i在关系r∈r(即边类型ast、cfg和pdg)下的邻居节点集合,r是关系集合。c
i,r
是一个用于计算与节点i存在关系r的邻居节点个数。w
r(l)
表示对于关系r的转移矩阵。w
s(l)
是一个自连接项,用于确保节点在l次迭代的特征表示也可以对l+1次迭代的特征表示产生影响。σ(
·
)是激活函数;
[0075]
步骤3

3,基于得到的节点特征,通过对特征嵌入向量进行求和,在图级进行节点聚合,并利用多类别交叉熵损失函数softmax训练分类器,以得到缺陷检测模型,并将步骤2

2中验证集中的缺陷代码结合步骤2

3至步骤2

6的代码表征处理输入训练得到的缺陷检测模型中进行模型调优。
[0076]
进一步地,在其中一个实施例中,步骤4所述对待检测项目进行处理,输入最优的检测模型中,检测项目中存在的缺陷,并将检测到的缺陷依据其缺陷类型与缺陷数据集中的同类型已知缺陷进行相似度计算,匹配相似度最高的已知缺陷,具体过程包括:
[0077]
步骤4

1,将待测项目输进行切分,得到多个函数级别的代码,并结合步骤2

3至步骤2

6的代码表征处理,将其输入到步骤3

3中经过调优得到的最优检测模型中进行检测,输出存在缺陷的函数及其对应的缺陷类型;
[0078]
步骤4

2,将步骤4

1中得到的缺陷类型与步骤2

2中的语料库(包括训练集与验证集)的缺陷类型进行比对,从语料库中选择出与被检测到的缺陷代码类型一致的缺陷代码集作为搜索空间,并将两者经过代码表征得到的代码特征图输入到图相似函数中;
[0079]
步骤4

3,通过图相似函数,利用如下公式计算图间相似度:
[0080][0081]
其中,s(g,g')表示图g与g'的相似度,φ(g)、φ(g')表示代码特征图的图嵌入,d(φ(g),φ(g'))表示φ(g)与φ(g')的空间距离;
[0082]
步骤4

4,将计算得到的图间相似度进行排名,选择相似度最高的语料库中的已知缺陷作为相似缺陷进行匹配,并输出相似缺陷id。
[0083]
进一步地,在其中一个实施例中,步骤5所述提取相似缺陷报告中有语义价值的缺陷知识,进行知识融合与检测,构建软件缺陷知识图谱,具体过程包括:
[0084]
步骤5

1:根据相似缺陷id,获取对应的缺陷报告并进行自然语言预处理,从相似
缺陷报告中提取有重要语义价值的信息,包括缺陷号、缺陷标题、产品、组件、严重性、改动状态、缺陷处理人、缺陷报告人、缺陷描述信息等;
[0085]
步骤5

2:缺陷知识抽取,从步骤5

1中已经提取出的缺陷标题和缺陷描述信息中应用命名实体识别网络(如深度神经网络bi

lstm+crf结合attention)进行缺陷实体分类及实体关系识别,再从缺陷数据集对应的知识图谱中抽取出缺陷实体、属性以及实体间的相互关系(即从基于步骤1所采集的缺陷数据构建的完整知识图谱中抽取与相似缺陷报告相关的知识);
[0086]
步骤5

3:知识融合与检测:在获得缺陷知识之后,进行实体对齐来消除实体歧义,利用levenshtein距离,即最小编辑距离,计算两两实体间的相似度,计算公式为:
[0087]
sim1=1

(lev
a,b
(|a|,|b|)/max(|a|,|b|))
[0088]
其中,a,b为两个实体字符串;sim1大于设定的阈值则将两个实体算作同一实体;再经过质量评估后将合格的部分即语义不产生矛盾的缺陷知识实体加入到知识图谱中。
[0089]
采用本实施例的方案,通过将缺陷报告转化为缺陷知识图谱,作为下一阶段缺陷问答的支撑,较传统基于信息检索的方式效果好。
[0090]
进一步地,在其中一个实施例中,本发明方法还包括步骤6,根据用户提问的软件缺陷领域相关问题,构建用户画像,并进行问题的语义理解,依据问题中实体知识在构建好的缺陷知识图谱进行图谱搜索,生成答案列表,并结合用户画像输出结果。该步骤具体包括:
[0091]
步骤6

1,进行用户提问的预处理:结合问答上下文信息,进行问句的解析、补全和规范操作,并提取缺陷实体和关系,删除无意义词汇;
[0092]
步骤6

2,图谱搜索与推理:将所述提取的缺陷实体与关系映射成neo4j图数据库的结构化查询语句cypher进行知识图谱的图搜索;
[0093]
步骤6

3,答案排序:生成用户画像,对用户的情感计算可用三元组表示,表示如下:
[0094]
st=<t,c,i>
[0095]
其中,t表示用户信息所构成的集合,即t={t1,t2,...t
n
}这些信息载体也就是用户所提出的软件缺陷方面的问题。c表示情感类别或者是不同倾向分类所形成的集合。例如,当用户在多次询问时无法得出想要的结果,便会有些“着急”,“失望”,此时,与用户的交互应减少或委婉地告诉用户无法找到答案而不是返回并不相关地答案。即c={c1,c2,...,c
n
}。方法可以表达离散的情感特征,可以使用基本情感来组合一些更复杂的情感,因此,根据应用目的的不同,可以将情感特征分为两个或多个类别,以创建不同的情感分类模型。模型直接反映了对情感粒度的基本理解。i表示不同情感特征强度所形成的集合,即i={i1,i2,...,i
n
},一般的强度可以分为高、中、低这3个等级,也可以分为极高、高、中、低、极低这5个等级,这些强度特征往往与情感特征相结合,构成了情感计算的核心与基础。
[0096]
根据上述定义,用户情感的计算可以表示为对用户输入问题中软件缺陷的知识的获取和识别,从而实现用户情感函数在不同维度上的计算。因此,情感的计算可以表示为由上述三要素的笛卡尔积形成的状态空间组合,即
[0097]
st=t
×
c
×
i
[0098]
经过上述的情感计算,系统可以提取用户情感特征,通过定性、定量分析,利用行
为建模来建立用户画像,从而为问答中候选答案的排序做准备。
[0099]
结合用户画像得到的用户特征与候选答案列表通过ranknet模型对待排序的候选答案进行打分,根据分数的高低对候选答案进行排序;
[0100]
采用本实施例的方案,采用基于缺陷知识图谱的方式结合查询模板,高效可靠地进行对用户缺陷问题的匹配及答案或解决方案的查询,结合用户画像,准确理解用户的问题意图,并给出准确的答案,提高用户的满意度。
[0101]
在一个实施例中,提出了一种知识驱动的软件缺陷检测与分析系统,所述系统包括:
[0102]
缺陷数据准备模块,用于采集公开的缺陷数据,包括缺陷报告以及缺陷代码,构建缺陷数据集;
[0103]
代码特征建模模块,对缺陷代码进行预处理,通过代码特征图对代码进行建模并嵌入到向量空间;其中代码特征图根据抽象语法树ast、控制流图cfg和程序依赖图pdg构造,图的边类型由ast、cfg和pdg构成,节点集由抽象语法树ast的节点集构成;从代码特征图中提取与缺陷代码行相关的缺陷特征子图进行图嵌入;缺陷检测模型构建模块,用于通过图神经网络学习缺陷代码隐式特征,训练缺陷检测模型;
[0104]
缺陷检测和匹配模块,用于对待检测项目进行处理,输入最优的检测模型中,检测项目中存在的缺陷,并将检测到的缺陷依据其缺陷类型与缺陷数据集中的同类型已知缺陷进行相似度计算,匹配相似度最高的已知缺陷;
[0105]
以及,软件缺陷知识图谱构建模块,用于提取相似缺陷报告中有语义价值的缺陷知识,进行知识融合与检测,构建软件缺陷知识图谱,通过挖掘相似缺陷报告中的关键信息以辅助开发者理解检测出的缺陷。
[0106]
进一步地,所述系统还包括问答构建模块,根据用户提问的软件缺陷领域相关问题,构建用户画像,并进行问题的语义理解,依据问题中实体知识在构建好的缺陷知识图谱进行图谱搜索,生成答案列表,并结合用户画像输出结果。
[0107]
上述系统实施例与上述方法实施例属于相同的方法构思,各模块具体实现参见上述方法实施例,此处不再赘述。
[0108]
本发明可以更好地利用缺陷代码的隐式特征,充分挖掘相似缺陷代码间的关联关系,在识别代码中多种缺陷类型的基础上,通过匹配一些已知缺陷,对检测出的缺陷进行进一步分析,普适性和通用性更强,可以缓解传统缺陷检测技术中难以制定有效全面的缺陷模式所导致的高误报率问题,并从知识的角度分析检测出的缺陷,使实际应用领域更广、精度更高、可解释性更强。
[0109]
以上显示和描述了本发明的基本原理、主要特征及优点。本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1