CN113722218A - 一种基于编译器中间表示的软件缺陷预测模型构建方法 - Google Patents

一种基于编译器中间表示的软件缺陷预测模型构建方法 Download PDF

Info

Publication number
CN113722218A
CN113722218A CN202110968393.5A CN202110968393A CN113722218A CN 113722218 A CN113722218 A CN 113722218A CN 202110968393 A CN202110968393 A CN 202110968393A CN 113722218 A CN113722218 A CN 113722218A
Authority
CN
China
Prior art keywords
node
ddg
instruction
cfg
token
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202110968393.5A
Other languages
English (en)
Other versions
CN113722218B (zh
Inventor
陈勇
徐超
沈凡凡
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NANJING AUDIT UNIVERSITY
Original Assignee
NANJING AUDIT UNIVERSITY
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NANJING AUDIT UNIVERSITY filed Critical NANJING AUDIT UNIVERSITY
Priority to CN202110968393.5A priority Critical patent/CN113722218B/zh
Publication of CN113722218A publication Critical patent/CN113722218A/zh
Application granted granted Critical
Publication of CN113722218B publication Critical patent/CN113722218B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明公开了一种基于编译器中间表示的软件缺陷预测模型构建方法,包括以下步骤:步骤(A),利用编译器,将源代码或二进制程序转换为编译器的中间表示,即IR指令序列;步骤(B),通过对IR指令序列的语义分析,构建基于IR指令序列的程序控制流图CFG(CV,CE)。本发明基于编译器的中间表示构建软件缺陷预测模型,一方面可以摆脱样本数据对源程序的过度依赖,另一方面可以将不同类型的源程序综合起来进行分析,大幅扩大样本数据的广度和深度,这对于大数据驱动的软件缺陷预测模型的构建是极为重要的,基于编译器中间表示构建软件缺陷预测模型,将有望取代基于源代码的软件缺陷预测模型,成为软件缺陷预测研究领域的一个重要突破点。

Description

一种基于编译器中间表示的软件缺陷预测模型构建方法
技术领域
本发明涉及软件工程和软件缺陷预测技术领域,具体涉及一种基于编译器中间表示的软件缺陷预测模型构建方法。
背景技术
随着人们对软件需求的日益增强,其功能越来越多,复杂度也越来越高,软件在便利人们生活的同时,也带来了诸多隐患,软件缺陷已经成为许多系统出错、失效、崩溃甚至机毁人亡的潜在根源。软件缺陷预测技术通过构建软件缺陷模型,将软件缺陷与各种软件度量向量进行关联,实现对软件中可能存在缺陷的模块进行初步定位,从而优化软件测试资源分配,提升软件缺陷定位的速度,对软件的可靠性提供保障。
但目前大部分软件缺陷预测模型使用的样本数据主要是源代码级别的数据,即使是目前研究较热的基于深度学习的软件缺陷预测技术,仍然主要以源代码级别的AST树为样本数据。虽然软件的开源运动丰富了软件缺陷样本的来源,研究人员可以从托管网站(如Google Code、GitHub、SourceForge等)获得其源代码及历史开发信息,但不同项目使用的编程语言可能大不相同,有的领域(如移动嵌入式系统等)为提升性能或降低功耗,甚至直接使用体系架构相关的汇编语言进行编程。若按照编程语言及体系架构对搜集的样本进行分类分析,将分割缺陷样本之间的相关性,使得原本有限的缺陷样本利用率大幅度降低。同时,受限于商业隐私,对于实际应用中的源代码,研究人员仍然很难获得,而这些商业应用中的软件缺陷又是极为重要的样本数据。
因此,如何构建一种不依赖于源程序,综合更多维度、更多类型的软件样本进行缺陷分析,以构建更有效更普适的缺陷预测模型,是软件缺陷预测不容忽视的一个重要问题。
发明内容
为解决上述问题,本发明利用编译器的中间表示,结合编译的程序分析理论以及深度学习模型,提出一种基于编译器中间表示的软件缺陷预测的方法。
为了达到上述目的,本发明所采用的技术方案是:
一种基于编译器中间表示的软件缺陷预测模型构建方法,包括以下步骤:
步骤(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)获得的带权邻接矩阵为输入,通过带标签样本的训练,形成软件缺陷预测模型。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,步骤(A),利用编译器,将源代码或二进制程序转换为编译器的中间表示,即IR指令序列,其中编译器可由反编译工具替代,源代码或二进制程序是以函数为单位进行转换。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,步骤(B)中所述CFG(CV,CE)的CV与CE分别表示为:CV表示CFG中节点的集合,其中每个节点cv对应一个基本块Block,每个基本块Block由一组不存在分支的顺次执行的IR指令序列构成;CE表示CFG中边的集合,其中每条边ce表示节点cv之间的依赖关系。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,步骤(C)中所述DDG具有一个有向图,表示为DDG(DV,DE),其中DV与DE分别表示为:DV表示DDG中节点的集合,每一条IR指令都是一个DDG节点;DE分为DEI和DEE
DEI是CFG的节点内部,即基本块Block内部构建的DDG节点之间的边构成的集合;
DEE是指根据CFG的边构建的跨基本块的边构成的集合。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,步骤(C),在CFG(CV,CE)的基础上,根据IR指令序列数据之间的依赖关系,以IR指令为节点,构建程序的数据依赖关系图DDG,其中数据依赖关系图DDG的构建,包括以下步骤:
((C1),构建一个空的DDG节点root,作为DDG的根节点,加入到DV集合中;
(C2),将CFG节点k内部的每条
Figure BDA0003224759890000031
封装为DDG中一个对应节点
Figure BDA0003224759890000041
并加入到DV集合中;
其中,
Figure BDA0003224759890000042
表示CFG节点k内部的第i条IR指令,R指令是指的IR指令序列中的某一条指令,
Figure BDA0003224759890000043
的上标表示IR指令所属的CFG节点编号,
Figure BDA0003224759890000044
的下标表示IR指令在所属CFG节点IR指令序列中的序列号,
Figure BDA0003224759890000045
中dv表示DDG节点,
Figure BDA0003224759890000046
的上标表示DDG节点所属的CFG节点编号,下标表示DDG节点在所属的CFG节点中的编号;
(C3),依次分析CFG的每个节点k内部的每条IR指令
Figure BDA0003224759890000047
Figure BDA0003224759890000048
需要使用
Figure BDA0003224759890000049
定义的数据,同时x与k相同,即两条IR指令在CFG的同一节点中,则构建一条从
Figure BDA00032247598900000410
对应节点
Figure BDA00032247598900000411
Figure BDA00032247598900000412
对应节点
Figure BDA00032247598900000413
的边,并加入到DEI
(C4),再次遍历CFG的每个节点k内部的每条IR指令
Figure BDA00032247598900000414
Figure BDA00032247598900000415
不为
Figure BDA00032247598900000416
Figure BDA00032247598900000417
对应节点
Figure BDA00032247598900000418
的出度为0,则添加一条从
Figure BDA00032247598900000419
Figure BDA00032247598900000420
的边到DEI
其中,
Figure BDA00032247598900000421
表示CFG节点k中的最后一条IR指令,
Figure BDA00032247598900000422
Figure BDA00032247598900000423
对应的DDG节点,节点
Figure BDA00032247598900000424
的出度为0表示DEI中没有以dvi为起始节点边;
(C5),依次遍历DV中的每个节点
Figure BDA00032247598900000425
Figure BDA00032247598900000426
未入边,即DEI中未以dv为终结点的边,则搜索CFG中以k为终结点的边的集合TE,若TE不为空集合,则对于TE中的所有边te<u,k>,构建从
Figure BDA00032247598900000427
指向
Figure BDA00032247598900000428
的边,加入到DDG的DEE中;若TE为空集合,则构建从root到
Figure BDA00032247598900000429
的边,加入到DDG的DEE中;
其中,边te<u,k>中u表示te边的起始节点,k表示te边的终止节点。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,步骤(D)中将每个DDG节点转换为一个token时,在token中保留类型信息,其格式为“deftype#opcode#optype1…#optypen”;
其中,deftype表示定义变量的操作数类型,opcode为操作符,optypei为操作数i的类型,i∈[0,n],整个token采用字符串拼接的方式,将定义变量的操作数类型、操作符、操作数类型按照其出现顺序,依次通过“#”进行拼接,形成一个token字符串,若某个字段不存在,则跳过。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,步骤(F),基于步骤(E)的实数向量编码,将DDG转换为带权邻接矩阵,包括以下步骤:
(F1),将DDG的所有节点转为token字符串来表示,并根据token简化DDG,即token相同,则为相同节点;
(F2),建立一个N×N的矩阵M,该矩阵第i行第j列的值Mi,j使用公式(1)计算;
Figure BDA0003224759890000051
其中,ni,j表示DDG中从L[i]所对应节点到L[j]所对应节点的有向边的条数,L[i]对应的tokeni的编码表示为Ti<ti,1,ti,2,…,ti,m>,L[j]对应的tokenj的编码表示为Tj<tj,1,tj,2,…,tj,m>,m为编码深度,ti,x表示tokeni向量编码的第x维所对应的实数值,tj,x表示tokenj向量编码的第x维所对应的实数值,1≤x≤m,ε是一个无穷小的正整数。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,所述DDG节点使用数据结构{defvar:deftype,opcode,[opvar1:optype1,opvar2:optype2,…,opvarn:optypen]}表示;
其中,opcode表示该节点对应IR指令的操作符的字符串表示,defvar表示该节点对应IR指令运行完成后所定义的变量的字符串表示,deftype表示defvar所对应的类型,opvari表示该节点对应IR指令所使用的第i个操作数的字符串表示,optypei表示opvari所对应的类型,i∈[0,n]。
前述的一种基于编译器中间表示的软件缺陷预测模型构建方法,所述defype和optypei的字符串表示分为两种情况:defype和optypei是IR指令的基本类型,则直接用该类型所对应的字符串表示;defype和optypei是非IR指令的基本类型,则统一用“mytype”字符串表示;
其中,IR指令的基本类型包括整型和浮点型两类,其字符串简写分别为’iN’和’fN’,N表示所占的bit位数。
本发明的有益效果是:基于编译器的中间表示构建软件缺陷预测模型,一方面可以摆脱样本数据对源程序的过度依赖,另一方面可以将不同类型的源程序综合起来进行分析,大幅扩大样本数据的广度和深度,这对于大数据驱动的软件缺陷预测模型的构建是极为重要的,基于编译器中间表示构建软件缺陷预测模型,将有望取代基于源代码的软件缺陷预测模型,成为软件缺陷预测研究领域的一个重要突破点。
附图说明
图1是本发明一种基于编译器中间表示的软件缺陷预测模型构建方法的流程图;
图2是本发明的示意图;
图3是本发明的源程序示意图;
图4是本发明的中间表示、CFG、DDG对应转换示意图;
图5是本发明合并节点后的DDG的示意图。
具体实施方式
下面将结合说明书附图,对本发明作进一步的说明。
如图1所示,本发明一种基于编译器中间表示的软件缺陷预测模型构建方法,包括以下步骤:
步骤(A),利用编译器,将源代码或二进制程序转换为编译器的中间表示,即IR指令序列;其中编译器可由反编译工具替代,源代码或二进制程序是以函数为单位进行转换;
步骤(B),通过对IR指令序列的语义分析,构建基于IR指令序列的程序控制流图CFG(CV,CE);
具体的,CFG(CV,CE)的CV与CE分别表示为:CV表示CFG中节点的集合,其中每个节点cv对应一个基本块Block,每个基本块Block由一组不存在分支的顺次执行的IR指令序列构成;CE表示CFG中边的集合,其中每条边ce表示节点cv之间的依赖关系,即若cvi执行完后,可能会执行cvj,那么CE中间添加一条从cvi指向cvj的边;
步骤(C),在CFG(CV,CE)的基础上,根据IR指令序列数据之间的依赖关系,以IR指令为节点,构建程序的数据依赖关系图DDG;其中数据依赖关系图DDG的构建,包括以下步骤:
(C1),构建一个空的DDG节点root,作为DDG的根节点,加入到DV集合中;
(C2),将CFG节点k内部的每条
Figure BDA0003224759890000071
封装为DDG中一个对应节点
Figure BDA0003224759890000072
并加入到DV集合中;
其中,
Figure BDA0003224759890000073
表示CFG节点k内部的第i条IR指令,R指令是指的IR指令序列中的某一条指令,
Figure BDA0003224759890000074
的上标表示IR指令所属的CFG节点编号,
Figure BDA0003224759890000075
的下标表示IR指令在所属CFG节点IR指令序列中的序列号,
Figure BDA0003224759890000076
中dv表示DDG节点,
Figure BDA0003224759890000077
的上标表示DDG节点所属的CFG节点编号,下标表示DDG节点在所属的CFG节点中的编号;
(C3),依次分析CFG的每个节点k内部的每条IR指令
Figure BDA0003224759890000081
Figure BDA0003224759890000082
需要使用
Figure BDA0003224759890000083
定义的数据,同时x与k相同,即两条IR指令在CFG的同一节点中,则构建一条从
Figure BDA0003224759890000084
对应节点
Figure BDA0003224759890000085
Figure BDA0003224759890000086
对应节点
Figure BDA0003224759890000087
的边,并加入到DEI
(C4),再次遍历CFG的每个节点k内部的每条IR指令
Figure BDA0003224759890000088
Figure BDA0003224759890000089
不为
Figure BDA00032247598900000810
Figure BDA00032247598900000811
对应节点
Figure BDA00032247598900000812
的出度为0,则添加一条从
Figure BDA00032247598900000813
Figure BDA00032247598900000814
的边到DEI
其中,
Figure BDA00032247598900000815
表示CFG节点k中的最后一条IR指令,
Figure BDA00032247598900000816
Figure BDA00032247598900000817
对应的DDG节点,节点
Figure BDA00032247598900000818
的出度为0表示DEI中没有以dvi为起始节点边;
(C5),依次遍历DV中的每个节点
Figure BDA00032247598900000819
Figure BDA00032247598900000820
未入边,即DEI中未以dv为终结点的边,则搜索CFG中以k为终结点的边的集合TE,若TE不为空集合,则对于TE中的所有边te<u,k>,构建从
Figure BDA00032247598900000821
指向
Figure BDA00032247598900000822
的边,加入到DDG的DEE中;若TE为空集合,则构建从root到
Figure BDA00032247598900000823
的边,加入到DDG的DEE中;
其中,边te<u,k>中u表示te边的起始节点,k表示te边的终止节点;
具体的,DDG具有一个有向图,表示为DDG(DV,DE),其中DV与DE分别表示为:DV表示DDG中节点的集合,每一条IR指令都是一个DDG节点;DE分为DEI和DEE
DEI是CFG的节点内部,即基本块Block内部构建的DDG节点之间的边构成的集合;
DEE是指根据CFG的边构建的跨基本块的边构成的集合;
具体的,DDG节点使用数据结构{defvar:deftype,opcode,[opvar1:optype1,opvar2:optype2,…,opvarn:optypen]}表示;
其中,opcode表示该节点对应IR指令的操作符的字符串表示,defvar表示该节点对应IR指令运行完成后所定义的变量的字符串表示,deftype表示defvar所对应的类型,opvari表示该节点对应IR指令所使用的第i个操作数的字符串表示,optypei表示opvari所对应的类型,i∈[0,n];
步骤(D),解析DDG,将每个DDG节点转换为一个token;
具体的,将每个DDG节点转换为一个token时,在token中保留类型信息,其格式为“deftype#opcode#optype1…#optypen”;
其中,deftype表示定义变量的操作数类型,opcode为操作符,optypei为操作数i的类型,i∈[0,n],整个token采用字符串拼接的方式,将定义变量的操作数类型、操作符、操作数类型按照其出现顺序,依次通过“#”进行拼接,形成一个token字符串,若某个字段不存在,则跳过;
步骤(E),通过对样本数据进行步骤(A)-(D)处理,获得token数据,将出现次数大于阈值τ的token存入词列表L,并采用词嵌入方法,对词列表L中的token进行实数向量编码,使得每个token对应一个实数向量;
步骤(F),基于步骤(E)的实数向量编码,将DDG转换为带权邻接矩阵;包括以下步骤:
(F1),将DDG的所有节点转为token字符串来表示,并根据token简化DDG,即token相同,则为相同节点;
(F2),建立一个N×N的矩阵M,该矩阵第i行第j列的值Mi,j使用公式(1)计算;
Figure BDA0003224759890000091
其中,ni,j表示DDG中从L[i]所对应节点到L[j]所对应节点的有向边的条数,L[i]对应的tokeni的编码表示为Ti<ti,1,ti,2,…,ti,m>,L[j]对应的tokenj的编码表示为Tj<tj,1,tj,2,…,tj,m>,m为编码深度,ti,x表示tokeni向量编码的第x维所对应的实数值,tj,x表示tokenj向量编码的第x维所对应的实数值,1≤x≤m,ε是一个无穷小的正整数;ti,x与tj,x都是利用现有的成熟的词嵌入方法获得;
步骤(G),以2-D深度卷积神经网络为基础模型结构,以步骤(F)获得的带权邻接矩阵为输入,通过带标签样本的训练,形成软件缺陷预测模型;
其中,基础模型结构采用现有成熟的2-D深度卷积神经网络;
具体的,defype和optypei的字符串表示分为两种情况:所述defype和optypei的字符串表示分为两种情况:defype和optypei是IR指令的基本类型,则直接用该类型所对应的字符串表示;defype和optypei是非IR指令的基本类型,则统一用“mytype”字符串表示;
其中,IR指令的基本类型包括整型和浮点型两类,其字符串简写分别为’iN’和’fN’,N表示所占的bit位数,例如’i32’表示占32个bit位的整型类型,’f16’表示占16个bit位的浮点型类型。
结合图2-5所示,本发明一种基于编译器中间表示的软件缺陷预测模型构建方法具体实施过程:
利用LLVM编译器,将源代码或者二进制程序转换为LLVM编译器的中间表示,如图3所示的c语言源代码,我们使用基于LLVM的开源编译器clang为工具,并通过添加编译参数-emit-llvm,将该c语言源代码转为对应的LLVMIR,如图4(a)所示;
通过对LLVMIR的语义分析,以其标号及分支语句为基准,构建基于IR的程序控制流图CFG;具体的,首先扫描一次所有的IR指令,每当遇到以”;<label>”开始的字符串,我们则将结束上一个基本块,并新建一个基本块结构,同时保存<label>后面的标号,作为该基本块的标识;如图4(a)所示,在第8条IR“br i1%7,label%8,label%12”之后,是“;<label>:%8:”,因此,我们将结束上一个基本块;结束的基本块由于是第一个基本块,且没有其他需要跳转到它的语句,所以没有标识,但为了便于阐述,我们给它添加一个顺次编号“B0”;即将上面8条语句作为一个基本块,并新建一个基本块,新建的基本块的标识即为“<label>:”后面的“%8”,接着我们再分析后面的语句,直到下一个“;<label>:%12:”,此时又将前面的基本块结束,即第9-14条IR构成一个基本块,并开始新的基本块“%12”,我们以此类推,完成如图4(b)所示的4个基本块的构建,在基本块构建完成后,我们分析每个基本块的最后一条语句,若是“br”等有关程序分支指令,则根据“br”指令中对应的标号,构建相应的CFG边,如图4(b)中B0基本块,它最后一条语句“br i1%7,label%8,label%12”可能跳转到%8或%12这两个标号处,因此,我们在B0与%8以及B0与%12之间分别添加一条有向边,最终形成如图4(b)所示的CFG图;
在CFG(CV,CE)的基础上,根据IR指令序列数据之间的依赖关系,以IR指令为节点,构建程序的数据依赖关系图DDG;针对图4(b)所示的CFG图,首先,我们构建一个空节点作为root节点,即图4(c)的0号节点,然后以基本块为单位,遍历每条IR指令,提取里面的变量、类型、操作数等信息,形成DDG节点,如图4(b)的第1条IR,它是“alloc”指令,表示分配了一个int32的空间给变量%3,相当于是定义了%3这个变量,因此其封装后表示为“%3:i32,alloca”,类似的,我们可以完成后续相关IR指令的封装,形成如表1所示的DDG节点封装,完成节点封装后,我们首先在基本块内,根据数据的定义引用关系,如第5个节点“%5:i32,load,%3:i32”,它使用了第3个节点“%3:i32,store,%0:i32”定义的“%3”变量,且第3个节点和第5个节点都在基本块B0中,所以构建一条从第3个节点到第5个节点之间的有向边,而对于第9个节点,它使用了第4个节点定义的变量“%4”,但第4个节点与第9个节点不在同一个基本块,因此不直接构建对应的有向边,而是从第9个节点所在基本块%8的所有前驱基本块,即B0的最后一个节点构建一条到第9个节点的有向边,而对于基本块内没有出边的节点,如节点1,则构建一条从该节点到其所在基本块最后一个节点的有向边,因而有节点1到节点8的一条有向边,依次类推,从而将图4(b)的CFG转为图4(c)的DDG;
解析DDG,将每个DDG节点转换为一个token;token主要基于DDG节点保存的类型信息以及操作符信息进行构建,其格式为“deftype#opcode#optype1…#optypen”;其中,deftype表示定义的操作数类型,opcode为当前操作的操作码,optypei为操作数i的类型;如对于节点没有操作数的节点“%3:i32,alloca”,其token将省去变量名信息,仅保留类型和操作符,即可表示为“i32#alloca”,同理,对于有两个操作数的节点“%7:i1 icmpne,%5:i32,%6:i32”,其token为“i1#icmpne#i32#i32”,以此类推,图4(c)所示DDG节点对应的token如表1所示:
表1示例程序IR到DDG节点封装以及DDG节点到token的转换
Figure BDA0003224759890000121
Figure BDA0003224759890000131
通过对样本数据进行步骤(A)-(D)处理,获得token数据,将出现次数大于阈值τ的token存入词列表L,并采用词嵌入方法,对词列表L中的token进行实数向量编码,使得每个token对应一个实数向量;具体的,首先将所有样本数据经过步骤(A)-(D)处理,然后将所有节点按照现有的图层次遍历方法展开,然后借助开源的word2vec工具,获得每个token所对应的词向量表示;
利用步骤(E)获得词列表L中token的个数N,先构建一个N×N的矩阵M,然后将步骤(D)中获得的DDG按照token进行化简,将token相同的合并为同一个节点,合并后的节点编号选用原编号值中较小的一个,如图4(c)中,节点1和节点2的token相同,因此合并为图5中的节点1,但边保留,所以此时在图5中,节点0到节点1的将有2条边,从节点1到节点8也有两条边,经过简化,图4(c)的DDG将转为图5所示。最后,根据简化后的DDG以及步骤(E)获得的token词向量表示,根据公式(1)计算每个元素Mi,j的值;
例如,图5中节点1(即token为“i32#alloca”)是L中的第3个元素,其向量编码为(0.2,0.4,0.8),节点8(即token为“br#i1”)是L中的第9个元素,其向量编码为(0.3,0.7,0.8),ε取0.000000000001,那么有:
Figure BDA0003224759890000141
以2-D深度卷积神经网络为基础模型结构,以步骤(F)获得的带权邻接矩阵为输入,通过带标签样本的训练,形成软件缺陷预测模型。
以上显示和描述了本发明的基本原理、主要特征及优点,本行业的技术人员应该了解,本发明不受上述实施例的限制,上述实施例和说明书中描述的只是说明本发明的原理,在不脱离本发明精神和范围的前提下,本发明还会有各种变化和改进,这些变化和改进都落入要求保护的本发明范围内。本发明要求保护范围由所附的权利要求书及其等效物界定。

Claims (9)

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分为DEI和DEE
DEI是CFG的节点内部,即基本块Block内部构建的DDG节点之间的边构成的集合;
DEE是指根据CFG的边构建的跨基本块的边构成的集合。
5.根据权利要求1所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:步骤(C),在CFG(CV,CE)的基础上,根据IR指令序列数据之间的依赖关系,以IR指令为节点,构建程序的数据依赖关系图DDG,其中数据依赖关系图DDG的构建,包括以下步骤:
(C1),构建一个空的DDG节点root,作为DDG的根节点,加入到DV集合中;
(C2),将CFG节点k内部的每条
Figure FDA0003224759880000021
封装为DDG中一个对应节点
Figure FDA0003224759880000022
并加入到DV集合中;
其中,
Figure FDA0003224759880000023
表示CFG节点k内部的第i条IR指令,IR指令是指的IR指令序列中的某一条指令,
Figure FDA0003224759880000024
的上标表示IR指令所属的CFG节点编号,
Figure FDA0003224759880000025
的下标表示IR指令在所属CFG节点IR指令序列中的序列号,
Figure FDA0003224759880000026
中dv表示DDG节点,
Figure FDA0003224759880000027
的上标表示DDG节点所属的CFG节点编号,下标表示DDG节点在所属的CFG节点中的编号;
(C3),依次分析CFG的每个节点k内部的每条IR指令
Figure FDA0003224759880000031
Figure FDA0003224759880000032
需要使用
Figure FDA0003224759880000033
定义的数据,同时x与k相同,即两条IR指令在CFG的同一节点中,则构建一条从
Figure FDA0003224759880000034
对应节点
Figure FDA0003224759880000035
Figure FDA0003224759880000036
对应节点
Figure FDA0003224759880000037
的边,并加入到DEI
(C4),再次遍历CFG的每个节点k内部的每条IR指令
Figure FDA0003224759880000038
Figure FDA0003224759880000039
不为
Figure FDA00032247598800000310
Figure FDA00032247598800000311
对应节点
Figure FDA00032247598800000312
的出度为0,则添加一条从
Figure FDA00032247598800000313
Figure FDA00032247598800000314
的边到DEI
其中,
Figure FDA00032247598800000315
表示CFG节点k中的最后一条IR指令,
Figure FDA00032247598800000316
Figure FDA00032247598800000317
对应的DDG节点,节点
Figure FDA00032247598800000318
的出度为0表示DEI中没有以dvi为起始节点边;
(C5),依次遍历DV中的每个节点
Figure FDA00032247598800000319
Figure FDA00032247598800000320
未入边,即DEI中未以dv为终结点的边,则搜索CFG中以k为终结点的边的集合TE,若TE不为空集合,则对于TE中的所有边te<u,k>,构建从
Figure FDA00032247598800000321
指向
Figure FDA00032247598800000322
的边,加入到DDG的DEE中;若TE为空集合,则构建从root到
Figure FDA00032247598800000323
的边,加入到DDG的DEE中;
其中,边te<u,k>中u表示te边的起始节点,k表示te边的终止节点。
6.根据权利要求1所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:步骤(D)中将每个DDG节点转换为一个token时,在token中保留类型信息,其格式为“deftype#opcode#optype1…#optypen”;
其中,deftype表示定义变量的操作数类型,opcode为操作符,optypei为操作数i的类型,i∈[0,n],整个token采用字符串拼接的方式,将定义变量的操作数类型、操作符、操作数类型按照其出现顺序,依次通过“#”进行拼接,形成一个token字符串,若某个字段不存在,则跳过。
7.根据权利要求1所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:步骤(F),基于步骤(E)的实数向量编码,将DDG转换为带权邻接矩阵,包括以下步骤:
(F1),将DDG的所有节点转为token字符串来表示,并根据token简化DDG,即token相同,则为相同节点;
(F2),建立一个N×N的矩阵M,该矩阵第i行第j列的值Mi,j使用公式(1)计算;
Figure FDA0003224759880000041
其中,ni,j表示DDG中从L[i]所对应节点到L[j]所对应节点的有向边的条数,L[i]对应的tokeni的编码表示为Ti<ti,1,ti,2,…,ti,m>,L[j]对应的tokenj的编码表示为Tj<tj,1,tj,2,…,tj,m>,m为编码深度,ti,x表示tokeni向量编码的第x维所对应的实数值,tj,x表示tokenj向量编码的第x维所对应的实数值,1≤x≤m,ε是一个无穷小的正整数。
8.根据权利要求4所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:所述DDG节点使用数据结构{defvar:deftype,opcode,[opvar1:optype1,opvar2:optype2,…,opvarn:optypen]}表示;
其中,opcode表示该节点对应IR指令的操作符的字符串表示,defvar表示该节点对应IR指令运行完成后所定义的变量的字符串表示,deftype表示defvar所对应的类型,opvari表示该节点对应IR指令所使用的第i个操作数的字符串表示,optypei表示opvari所对应的类型,i∈[0,n]。
9.根据权利要求6或8所述的一种基于编译器中间表示的软件缺陷预测模型构建方法,其特征在于:所述defype和optypei的字符串表示分为两种情况:defype和optypei是IR指令的基本类型,则直接用该类型所对应的字符串表示;defype和optypei是非IR指令的基本类型,则统一用“mytype”字符串表示;
其中,IR指令的基本类型包括整型和浮点型两类,其字符串简写分别为’iN’和’fN’,N表示所占的bit位数。
CN202110968393.5A 2021-08-23 2021-08-23 一种基于编译器中间表示的软件缺陷预测模型构建方法 Active CN113722218B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110968393.5A CN113722218B (zh) 2021-08-23 2021-08-23 一种基于编译器中间表示的软件缺陷预测模型构建方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110968393.5A CN113722218B (zh) 2021-08-23 2021-08-23 一种基于编译器中间表示的软件缺陷预测模型构建方法

Publications (2)

Publication Number Publication Date
CN113722218A true CN113722218A (zh) 2021-11-30
CN113722218B CN113722218B (zh) 2022-06-03

Family

ID=78677430

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110968393.5A Active CN113722218B (zh) 2021-08-23 2021-08-23 一种基于编译器中间表示的软件缺陷预测模型构建方法

Country Status (1)

Country Link
CN (1) CN113722218B (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114996149A (zh) * 2022-06-16 2022-09-02 南京邮电大学 一种基于程序切片度量的代码缺陷预测方法
CN115718696A (zh) * 2022-10-18 2023-02-28 国网智能电网研究院有限公司 源码密码学误用检测方法、装置、电子设备和存储介质
CN115879868A (zh) * 2022-09-09 2023-03-31 南京审计大学 一种专家系统与深度学习相融合的智能合约安全审计方法
CN115934090A (zh) * 2023-01-05 2023-04-07 山东省计算中心(国家超级计算济南中心) 一种由二进制代码转换源代码的方法
WO2024037168A1 (zh) * 2022-08-18 2024-02-22 华为技术有限公司 建立模型的方法、装置以及设备

Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103577242A (zh) * 2013-11-14 2014-02-12 中国科学院声学研究所 针对已调度汇编代码的控制流图重构方法
CN106354630A (zh) * 2016-08-23 2017-01-25 电子科技大学 一种基于动态符号执行的软件缺陷检测方法
CN108829607A (zh) * 2018-07-09 2018-11-16 华南理工大学 一种基于卷积神经网络的软件缺陷预测方法
CN110597735A (zh) * 2019-09-25 2019-12-20 北京航空航天大学 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法
CN110888798A (zh) * 2019-10-14 2020-03-17 西安理工大学 一种基于图卷积神经网络对软件缺陷预测方法
WO2020085733A1 (ko) * 2018-10-23 2020-04-30 주식회사 씨티아이랩 데이터 이미지화를 이용한 딥러닝 기반 시스템 이상 행위 분석 기술
CN111427775A (zh) * 2020-03-12 2020-07-17 扬州大学 一种基于Bert模型的方法层次缺陷定位方法
CN112527262A (zh) * 2019-09-19 2021-03-19 无锡江南计算技术研究所 深度学习框架编译器宽度非一致自动向量优化方法
CN112541180A (zh) * 2020-12-16 2021-03-23 北京理工大学 一种基于语法特征和语义特征的软件安全漏洞检测方法
CN112631925A (zh) * 2020-12-29 2021-04-09 北京轩宇信息技术有限公司 一种单变量原子违背缺陷的检测方法
US11036614B1 (en) * 2020-08-12 2021-06-15 Peking University Data control-oriented smart contract static analysis method and system

Patent Citations (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103577242A (zh) * 2013-11-14 2014-02-12 中国科学院声学研究所 针对已调度汇编代码的控制流图重构方法
CN106354630A (zh) * 2016-08-23 2017-01-25 电子科技大学 一种基于动态符号执行的软件缺陷检测方法
CN108829607A (zh) * 2018-07-09 2018-11-16 华南理工大学 一种基于卷积神经网络的软件缺陷预测方法
WO2020085733A1 (ko) * 2018-10-23 2020-04-30 주식회사 씨티아이랩 데이터 이미지화를 이용한 딥러닝 기반 시스템 이상 행위 분석 기술
CN112527262A (zh) * 2019-09-19 2021-03-19 无锡江南计算技术研究所 深度学习框架编译器宽度非一致自动向量优化方法
CN110597735A (zh) * 2019-09-25 2019-12-20 北京航空航天大学 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法
CN110888798A (zh) * 2019-10-14 2020-03-17 西安理工大学 一种基于图卷积神经网络对软件缺陷预测方法
CN111427775A (zh) * 2020-03-12 2020-07-17 扬州大学 一种基于Bert模型的方法层次缺陷定位方法
US11036614B1 (en) * 2020-08-12 2021-06-15 Peking University Data control-oriented smart contract static analysis method and system
CN112541180A (zh) * 2020-12-16 2021-03-23 北京理工大学 一种基于语法特征和语义特征的软件安全漏洞检测方法
CN112631925A (zh) * 2020-12-29 2021-04-09 北京轩宇信息技术有限公司 一种单变量原子违背缺陷的检测方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
葛红美等: "编译前端分析自动构件化代码可靠性加强方法", 《计算机科学与探索》 *
陈勇等: "基于编译优化的软件缺陷预测研究", 《电子学报》 *

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114996149A (zh) * 2022-06-16 2022-09-02 南京邮电大学 一种基于程序切片度量的代码缺陷预测方法
WO2024037168A1 (zh) * 2022-08-18 2024-02-22 华为技术有限公司 建立模型的方法、装置以及设备
CN115879868A (zh) * 2022-09-09 2023-03-31 南京审计大学 一种专家系统与深度学习相融合的智能合约安全审计方法
CN115718696A (zh) * 2022-10-18 2023-02-28 国网智能电网研究院有限公司 源码密码学误用检测方法、装置、电子设备和存储介质
CN115718696B (zh) * 2022-10-18 2023-06-13 国网智能电网研究院有限公司 源码密码学误用检测方法、装置、电子设备和存储介质
CN115934090A (zh) * 2023-01-05 2023-04-07 山东省计算中心(国家超级计算济南中心) 一种由二进制代码转换源代码的方法
CN115934090B (zh) * 2023-01-05 2023-05-23 山东省计算中心(国家超级计算济南中心) 一种由二进制代码转换源代码的方法

Also Published As

Publication number Publication date
CN113722218B (zh) 2022-06-03

Similar Documents

Publication Publication Date Title
CN113722218B (zh) 一种基于编译器中间表示的软件缺陷预测模型构建方法
Cummins et al. End-to-end deep learning of optimization heuristics
CN110018820B (zh) 一种基于深度强化学习的Graph2Seq自动生成Java代码注释的方法
CN112733137B (zh) 一种面向漏洞检测的二进制代码相似性分析方法
CN110737466B (zh) 基于静态程序分析的源代码编码序列表示方法
CN110673840B (zh) 一种基于标签图嵌入技术的自动代码生成方法及系统
US8930919B2 (en) Modernization of legacy software systems based on modeled dependencies
CN106843993B (zh) 一种逆向解析gpu指令的方法及系统
CN112041859A (zh) 使用分层存储在计算机上仿真量子电路
CN109086215B (zh) 一种嵌入式软件单元测试用例生成方法及系统
CN113342318B (zh) 基于多视图代码特征的细粒度代码自动生成方法及系统
CN103034486B (zh) 移动终端操作系统基于全系统扩展调用图的自动优化方法
Bowers et al. Top-down synthesis for library learning
CN108228187B (zh) 一种数值程序的全局优化方法
Ahmad et al. Leveraging parallel data processing frameworks with verified lifting
CN108733359B (zh) 一种软件程序的自动生成方法
Balbiani et al. A dynamic logic for termgraph rewriting
Bak et al. A reference interpreter for the graph programming language GP 2
CN112527304A (zh) 基于异构平台的自适应节点融合编译优化方法
CN114691151A (zh) 一种基于深度学习的优化代码反编译方法和系统
CN113986251A (zh) 基于卷积和循环神经网络的gui原型图转代码方法
CN115185728A (zh) 一种基于图节点嵌入的软件系统架构恢复方法
Yang et al. M2Coder: A Fully Automated Translator from Matlab M-functions to C/C++ Codes for ACS Motion Controllers
CN103116514A (zh) 基于系统扩展调用图的操作系统自动优化方法和系统
CN115879868B (zh) 一种专家系统与深度学习相融合的智能合约安全审计方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant