【技术实现步骤摘要】
一种基于编译器中间表示的软件缺陷预测模型构建方法
[0001]本专利技术涉及软件工程和软件缺陷预测
,具体涉及一种基于编译器中间表示的软件缺陷预测模型构建方法。
技术介绍
[0002]随着人们对软件需求的日益增强,其功能越来越多,复杂度也越来越高,软件在便利人们生活的同时,也带来了诸多隐患,软件缺陷已经成为许多系统出错、失效、崩溃甚至机毁人亡的潜在根源。软件缺陷预测技术通过构建软件缺陷模型,将软件缺陷与各种软件度量向量进行关联,实现对软件中可能存在缺陷的模块进行初步定位,从而优化软件测试资源分配,提升软件缺陷定位的速度,对软件的可靠性提供保障。
[0003]但目前大部分软件缺陷预测模型使用的样本数据主要是源代码级别的数据,即使是目前研究较热的基于深度学习的软件缺陷预测技术,仍然主要以源代码级别的AST树为样本数据。虽然软件的开源运动丰富了软件缺陷样本的来源,研究人员可以从托管网站(如Google Code、GitHub、SourceForge等)获得其源代码及历史开发信息,但不同项目使用的编程语言可能大不相同,有的领域(如移动嵌入式系统等)为提升性能或降低功耗,甚至直接使用体系架构相关的汇编语言进行编程。若按照编程语言及体系架构对搜集的样本进行分类分析,将分割缺陷样本之间的相关性,使得原本有限的缺陷样本利用率大幅度降低。同时,受限于商业隐私,对于实际应用中的源代码,研究人员仍然很难获得,而这些商业应用中的软件缺陷又是极为重要的样本数据。
[0004]因此,如何构建一种不依赖于源程序,综合更多维度 ...
【技术保护点】
【技术特征摘要】
1.一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:包括以下步骤:步骤(A),利用编译器,将源代码或二进制程序转换为编译器的中间表示,即IR指令序列;步骤(B),通过对IR指令序列的语义分析,构建基于IR指令序列的程序控制流图CFG(CV,CE);步骤(C),在CFG(CV,CE)的基础上,根据IR指令序列数据之间的依赖关系,以IR指令为节点,构建程序的数据依赖关系图DDG;步骤(D),解析DDG,将每个DDG节点转换为一个token;步骤(E),通过对样本数据进行步骤(A)
‑
(D)处理,获得token数据,将出现次数大于阈值τ的token存入词列表L,并采用词嵌入方法,对词列表L中的token进行实数向量编码,使得每个token对应一个实数向量;步骤(F),基于步骤(E)的实数向量编码,将DDG转换为带权邻接矩阵;步骤(G),以2
‑
D深度卷积神经网络为基础模型结构,以步骤(F)获得的带权邻接矩阵为输入,通过带标签样本的训练,形成软件缺陷预测模型。2.根据权利要求1所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:步骤(A),利用编译器,将源代码或二进制程序转换为编译器的中间表示,即IR指令序列,其中编译器可由反编译工具替代,源代码或二进制程序是以函数为单位进行转换。3.根据权利要求1所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:步骤(B)中所述CFG(CV,CE)的CV与CE分别表示为:CV表示CFG中节点的集合,其中每个节点cv对应一个基本块Block,每个基本块Block由一组不存在分支的顺次执行的IR指令序列构成;CE表示CFG中边的集合,其中每条边ce表示节点cv之间的依赖关系。4.根据权利要求1所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:步骤(C)中所述DDG具有一个有向图,表示为DDG(DV,DE),其中DV与DE分别表示为:DV表示DDG中节点的集合,每一条IR指令都是一个DDG节点;DE分为DE
I
和DE
E
;DE
I
是CFG的节点内部,即基本块Block内部构建的DDG节点之间的边构成的集合;DE
E
是指根据CFG的边构建的跨基本块的边构成的集合。5.根据权利要求1所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:步骤(C),在CFG(CV,CE)的基础上,根据IR指令序列数据之间的依赖关系,以IR指令为节点,构建程序的数据依赖关系图DDG,其中数据依赖关系图DDG的构建,包括以下步骤:(C1),构建一个空的DDG节点root,作为DDG的根节点,加入到DV集合中;(C2),将CFG节点k内部的每条封装为DDG中一个对应节点并加入到DV集合中;其中,表示CFG节点k内部的第i条IR指令,IR指令是指的IR指令序列中的某一条指令,的上标表示IR指令所属的CFG节点编号,的下标表示IR指令在所属CFG节点IR指令序列中的序列号,中dv表示DDG节点,的上标表示DDG节点所属的CFG节点编号,下标表示DDG节点在所属的CFG节点中的编号;
(C3),依次分析CFG的每个节点k内部的每条IR指令若需要使用定义的数据,同时x与k相同,即两条IR指令在CFG的同一节点中,则构建一条从对应节点到对应节点的边,并加入到DE
I
;(C4),再次遍历CFG的每个节点k内部的每条IR指令若不为且对应节点的出度为0,则添加一条从到的边到DE
I
;其中,表示CFG节点k中的最后一条IR指令,是对应的DDG节点,节点的出度为0表示DE
I
中没有以dv
i
为起始节点边;(C5),依次遍历DV中的每个节点若未入边,即DE
I
中未以dv为终结点的边,则搜索CFG中以k为终结点的边的集合TE,若TE不为空集合,则对于TE中的所有边te<u,k>,构建从指向的边,加入到DDG的DE
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。