CN114996149A - 一种基于程序切片度量的代码缺陷预测方法 - Google Patents

一种基于程序切片度量的代码缺陷预测方法 Download PDF

Info

Publication number
CN114996149A
CN114996149A CN202210682893.7A CN202210682893A CN114996149A CN 114996149 A CN114996149 A CN 114996149A CN 202210682893 A CN202210682893 A CN 202210682893A CN 114996149 A CN114996149 A CN 114996149A
Authority
CN
China
Prior art keywords
slice
program
metric
code
slices
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
CN202210682893.7A
Other languages
English (en)
Other versions
CN114996149B (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 University of Posts and Telecommunications
Original Assignee
Nanjing University of Posts and Telecommunications
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 University of Posts and Telecommunications filed Critical Nanjing University of Posts and Telecommunications
Priority to CN202210682893.7A priority Critical patent/CN114996149B/zh
Publication of CN114996149A publication Critical patent/CN114996149A/zh
Application granted granted Critical
Publication of CN114996149B publication Critical patent/CN114996149B/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/3616Software analysis for verifying properties of programs using software metrics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N20/00Machine learning

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Artificial Intelligence (AREA)
  • Evolutionary Computation (AREA)
  • Medical Informatics (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于程序切片度量的代码缺陷预测方法,其包括:对不同编程语言转化成中间语言LLVM IR,对可能存在缺陷的代码关键点生成相应的前向切片和后向切片,构建基于前向切片和后向切片的认知复杂度度量指标和其他切片度量指标,并结合传统的度量指标,通过机器学习模型XGboost进行监督学习训练,最终训练好的模型可以预测代码是否存在缺陷,结合新的切片度量指标可以捕获与程序行为相关的缺陷,比只使用传统度量进行缺陷预测的准确率高。

Description

一种基于程序切片度量的代码缺陷预测方法
技术领域
本发明涉及切片度量和机器学习的技术领域,尤其涉及一种基于程序切片度量的代码缺陷预测方法。
背景技术
互联网的迅速发展极大的改变了我们的生活,软件系统在我们身边随处可见,个人手机、电脑、汽车等,计算机软件渗透进生活的方方面面,随着软件需求的目标客户越来越广泛,需求也越来越细化与庞杂,使得软件系统的复杂大幅度增加,对程序开发人员的要求也越来越高,软件安全漏洞的数量呈现逐年增长的趋势,且软件安全漏洞的形态也呈现出复杂性和多样性,给计算机系统的正常运行带来了极大的威胁。
软件缺陷即软件系统或产品的软件生命周期中,由于操作实体有意或无意的疏忽而产生的设计错误、编码缺陷、运行故障,它们以不同形式存在于软件系统的各个层次与环节之中;一旦被恶意主体利用,比如获得更高级别权限、泄露软件中用户隐私数据等,将危害软件系统安全,并可能影响构建于软件系统之上的服务的正常运行。
软件度量是一组用于衡量软件质量的软件度量值,通过这些可以表示代码特征的度量指标来预测软件存在缺陷的风险;传统的软件度量指标有代码行数、圈复杂度、继承深度和类耦合等,但这些度量指标不能捕获更细粒度的程序属性;程序切片技术通过数据依赖关系和控制依赖关系来研究源代码的行为,捕获到细粒度的程序属性,程序切片由所有可能影响程序点处的变量值的语句组成,并且程序或程序切片可以由程序依赖图表示,根据每个函数中的输出变量计算程序切片指标。通过使用程序切片信息,程序度量标准捕获与程序行为相关的更细粒度的程序属性。
本发明目的是在于解决传统软件度量指标在软件缺陷预测上不能捕获更细粒度的程序属性的技术问题,提出了新的基于程序切片的认知复杂度度量指标(切片认知域)。
发明内容
本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本申请的说明书摘要和发明名称中可能会做些简化或省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。
鉴于上述现有基于程序切片度量的代码缺陷预测方法存在的问题,提出了本发明。
因此,本发明目的是提供一种基于程序切片度量的代码缺陷预测方法。
为解决上述技术问题,本发明提供如下技术方案:S1:将不同语言的源码文件转化成LLVM IR文件;
S2:对转化成中间语言IR文件的训练集、测试集添加相应的标签;
S3:对中间语言IR生成系统依赖图SDG和与缺陷相关的程序切片;
S4:通过遍历系统依赖图SDG获取相关的度量指标;
S5:构建一种新型的基于前向切片和后向切片的认知复杂度度量指标切片认知域,并结合基于前向切片和后向切片的度量指标紧密度、重叠度、覆盖度,计算上述切片度量指标;
S6:对传统度量指标和切片度量指标通过基于模型的特征选择法进行特征选择;
S7:通过XGboost模型进行训练,训练好后的模型对代码进行监测,判断是否存在缺陷。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:对不同语言的源码文件通过相应的指令生成中间语言LLVM IR文件。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:根据数据集里的源码文件所包含的信息添加相应标签,对包含漏洞信息的文件,在其对应IR文件添加“1”的标签,对不包含漏洞信息的文件,在其对应IR文件添加“0”的标签。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:对中间语言IR生成系统依赖图SDG和与缺陷相关的程序切片包括:
A1:构造程序的控制流图和数据流图,在控制流图和数据流图的基础上获得控制依赖和数据依赖关系;
A2:根据控制依赖和数据依赖关系构造各个模块的过程内依赖图;
A3:根据各个过程的过程内依赖图和程序调用图构建系统依赖图;
A4:将源码文件转化成LLVM IR指令后,通过遍历IR指令,IR指令中存在和漏洞缺陷相关的指令,对于指针类型的缺陷,通过遍历IR指令,当遇到getElementPtr指令,对该指令中等号左边的的变量作为程序的敏感点,将这些敏感点保存到集合中,然后可能存在缺陷的敏感点进行程序切片;
其中,指针缺陷指针算术、引用、作为函数参数的地址传递中的不当使用相关缺陷;
A5:基于系统依赖图SDG的方法进行切片,获得前向切片和后向切片。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:通过遍历系统依赖图SDG获取相关的度量指标包括:
B1:获取程序依赖图的顶点数verticesCount、依赖边的数量edgesCount;
B2:获取切片大小sliceCount;
B3:获取切片模块中使用的函数参数和非局部变量的数量globalInput、输出的非局部变量的数量globalOutput;
B4:获取切片模块中使用输出变量间接影响的其他模块中的切片之和indIRectFanIn、使用输出变量直接影响的其他模块中的切片之和dIRectFanIn;
B5:获取其他模块中的输出变量对此模块直接影响的切片之和dIRectFanOut、其他模块中的输出变量对此模块间接影响的切片之和indIRectFanOut;
B6:根据系统依赖图SDG构建
Figure BDA0003696993020000031
IREtoV表示度量值。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:紧密度、重叠度、覆盖度包括:
紧密度公式为:
Figure BDA0003696993020000032
该度量指标可以全面考虑程序的紧密度情况,len(M)为切片模块M中IR语句的行数,SLint为Vo中所有变量的后向切片和Vi中所有变量的前向切片的交集;
重叠度公式为:
Figure BDA0003696993020000033
该度量指标可以全面考虑程序的重叠度情况,V为模块中输入变量和输出变量的集合,Vi为模块中输入变量的集合,i为输入变量下标,FSLx为变量x的前向切片,BSLx为变量x的后向切片;
覆盖度公式为:
Figure BDA0003696993020000041
该度量指标可以全面考虑程序的覆盖度情况,Vo为模块中输出变量的集合,o为输出变量的下标;
根据前向切片和后向切片构建新型的切片度量指标,基于切片的认知复杂度度量指标切片认知域,切片认知域公式为:
Figure BDA0003696993020000042
其中,len(B)为前向切片和后向切片的数量,xi为切片中第i个切片在CG图上坐标,yi为切片中第i个切片在CFG图上坐标,zi为切片中第i个切片在block上坐标,xk为关键点在CG图上坐标,yk为关键点在CFG图上坐标,zk为关键点在block上坐标,CG为函数调用关系图,CFG为流程控制图。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:对传统度量指标和切片度量指标通过基于模型的特征选择法进行特征选择包括:
C1:对圈复杂度、Halstead度量、C&K度量、代码行数、操作符数量、操作数数量、字符串数量、方法/函数数量等传统的软件度量指标和切片度量指标进行特征组合。
C2:对特征数据进行标准化处理,让不同维度之间的特征在数值上有比较性,间接通过中心化避免异常值和极端值的影响,提高分类器的准确性;
C3:通过特征选择的方法来实现特征降维,选择主要影响软件缺陷的特征;
C4:基于模型的特征选择法SelectFromModel,按照特征降序排列,筛选出前k个特征。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:所述特征选择方法包括过滤法、包装法、嵌入法。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:对传统度量指标和切片度量指标通过基于模型的特征选择法进行特征选择包括:
D1:使用XGboost实现代码缺陷预测,预测代码有缺陷或者没有缺陷;
其中,XGboost是使用梯度提升框架实现的高效、灵活、可移植的机器学习库,是一个二分类任务;
D2:设置验证度量标准的eval_metric的值为auc;
其中,auc为曲线下面积,是衡量学习器优劣的一种性能指标;
D3:设置随机种子数,防止每次结果不一致。
D4:使用10折交叉来训练多个模型并进行平均值融合,防止模型的过拟合。
D5:对XGboost模型的max_depth、min_child_weight等参数通过网格搜索的方法进行调参。
作为本发明所述基于程序切片度量的代码缺陷预测方法的一种优选方案,其中:训练好的XGboost模型用于预测代码是否存在缺陷,将代码按照S3、S4、S5、S6的步骤计算出度量值,将这些度量特征做为模型的输入,输出结果为[0,1]之间的概率值,概率为[0,0.5)表示该代码不存在缺陷,[0.5,1]表示该代码存在缺陷。
本发明的有益效果:可以对不同编程语言转化成IR中间语言,然后对可能存在缺陷的指令生成相应的前向切片和后向切片,构建基于双向切片的认知复杂度度量指标和其他度量指标,并结合传统的度量指标,通过机器学习模型XGboost进行监督学习训练,最终训练好的模型可以预测代码是否存在缺陷,结合新的切片度量指标可以使得缺陷预测的准确率更高。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。其中:
图1为本发明基于程序切片度量的代码缺陷预测方法的流程图。
图2为指令图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合说明书附图对本发明的具体实施方式做详细的说明。
在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
其次,此处所称的“一个实施例”或“实施例”是指可包含于本发明至少一个实现方式中的特定特征、结构或特性。在本说明书中不同地方出现的“在一个实施例中”并非均指同一个实施例,也不是单独的或选择性的与其他实施例互相排斥的实施例。
再其次,本发明结合示意图进行详细描述,在详述本发明实施例时,为便于说明,表示器件结构的剖面图会不依一般比例作局部放大,而且所述示意图只是示例,其在此不应限制本发明保护的范围。此外,在实际制作中应包含长度、宽度及深度的三维空间尺寸。
实施例1
参照图1,为本发明的流程图,提供了一种基于程序切片度量的代码缺陷预测方法,其包括:
S1:将不同语言的源码文件转化成LLVM IR文件。需要说明的是:
对不同语言的源码文件通过相应的指令生成中间语言LLVM IR文件,如用LLVM编译器的Clang前端将C++源代码转化为中间代码表示LLVM IR,clang++-emit-llvm-Stpy.cpp-o tpy.ll,生成.ll文件。
S2:对转化成中间语言IR文件的训练集、测试集添加相应的标签,对有缺陷的文件添加“1”的标签,没有缺陷的文件添加“0”的标签。需要说明的是:
根据数据集里的源码文件所包含的信息添加相应标签,数据集里面会包含漏洞信息,如SARD数据集中的程序都已经被分别标注为"good"(没有漏洞信息),“bad”(包含漏洞信息),对包含漏洞信息的文件,在其对应IR文件添加“1”的标签,对不包含漏洞信息的文件,在其对应IR文件添加“0”的标签。
S3:对中间语言IR生成系统依赖图SDG和与缺陷相关的程序切片。需要说明的是:
A1:构造程序的控制流图和数据流图,在控制流图和数据流图的基础上获得控制依赖和数据依赖关系。
A2:根据控制依赖和数据依赖关系构造各个模块的过程内依赖图。
A3:根据各个过程的过程内依赖图和程序调用图构建系统依赖图。
A4:将源码文件转化成LLVM IR指令后,通过遍历IR指令,IR指令中存在和漏洞缺陷相关的指令,对于指针类型的缺陷,通过遍历IR指令,当遇到getElementPtr指令的时候,对该指令中等号左边的的变量作为程序的敏感点,这个敏感点依赖的数据流信息和控制流信息可能存在导致指针相关错误的漏洞,对与库/API函数调用缺陷,遍历IR指令中call/invoke指令,call/invoke指令中如果存在strcpy、strcat、gets()、sprintf()等,则此指令包含的变量可能存在与缓冲区溢出相关的缺陷,通过上述步骤,将这些程序敏感点对应的IR指令保存到集合Q中。
其中,指针缺陷指针算术、引用、作为函数参数的地址传递中的不当使用相关缺陷。
A5:对集合Q中的IR指令进行切片,基于系统依赖图SDG的方法进行切片,获得前向切片和后向切片的并集。
S4:通过遍历系统依赖图SDG获取相关的度量指标。需要说明的是:
B1:获取程序依赖图的顶点数verticesCount、依赖边的数量edgesCount。
B2:获取切片大小sliceCount。
B3:获取切片模块中使用的函数参数和非局部变量的数量globalInput、输出的非局部变量的数量globalOutput。
B4:获取切片模块中使用输出变量间接影响的其他模块中的切片之和indIRectFanIn、使用输出变量直接影响的其他模块中的切片之和dIRectFanIn;
B5:获取其他模块中的输出变量对此模块直接影响的切片之和dIRectFanOut、其他模块中的输出变量对此模块间接影响的切片之和indIRectFanOut。
B6:根据系统依赖图SDG构建
Figure BDA0003696993020000071
依赖边的数量与顶点数量的比值,此度量值表示模块中的语句通过控制流或数据流彼此相互依赖。
其中,IREtoV表示度量值。
S5:构建一种新型的基于前向切片和后向切片的认知复杂度度量指标切片认知域,并结合基于前向切片和后向切片的度量指标紧密度、重叠度、覆盖度,计算上述切片度量指标。需要说明的是:
C1:在LLVM IR指令上进行前向切片和后向切片构建紧密度公式,紧密度公式为:
Figure BDA0003696993020000081
根据公式计算相应的值,该度量指标可以全面的考虑程序的紧密度情况,其中,len(M)为切片模块M中IR语句的行数,SLint为Vo中所有变量的后向切片和Vi中所有变量的前向切片的交集。
C2:在LLVM IR指令上进行前向切片和后向切片构建重叠度公式,重叠度公式为:
Figure BDA0003696993020000082
根据公式计算相应的值,全面的考虑程序的重叠度情况,其中,V为模块中输入变量和输出变量的集合,Vi为模块中输入变量的集合,i为输入变量下标,Vo为模块中输出变量的集合,o为输出变量的下标,FSLx为变量x的前向切片,BSLx为变量x的后向切片。
C3:在LLVM IR指令上进行前向切片和后向切片构建覆盖度公式,覆盖度公式为
Figure BDA0003696993020000083
根据公式计算相应的值,全面的考虑程序的覆盖度情况。
C4:根据前向切片和后向切片构建新型的切片度量指标,基于切片的认知复杂度度量指标切片认知域,切片认知域公式为:
Figure BDA0003696993020000084
其中,len(B)为前向切片和后向切片的数量,xi为切片中第i个切片在CG图上坐标,yi为切片中第i个切片在CFG图上坐标,zi为切片中第i个切片在block上坐标,xk为关键点在CG图上坐标,yk为关键点在CFG图上坐标,zk为关键点在block上坐标,CG为函数调用关系图,CFG为流程控制图。
根据前向切片和后向切片构建新型的切片度量指标,基于切片的认知复杂度度量指标切片认知域,该指标的含义,指令行中的距离越大,了解该切片的目的数据流信息和控制流信息所需的认知努力越多,存在缺陷的可能就越大;对程序的敏感点进行前向切片和后向切片之后,会得到一定数量的切片指令,受到聚类的思想启发,这些切片指令集和敏感点距离越大,越不容易聚合在一起,存在缺陷的可能性越大。
为了精准的考虑距离,给每条指令提出了坐标的概念,如图2,为指令图,对IR文件生成其函数调用关系图(Call Graph,CG),CG图上的节点是一个函数,通过从上到下,从左到右层次遍历给每个函数一个坐标即x,对每个函数生成其流程控制图(Control FlowGraph,CFG),通过层次遍历给CFG中的每个block一个坐标y,给每个block中的指令一个z坐标。
S6:对传统度量指标和切片度量指标通过基于模型的特征选择法进行特征选择。需要说明的是:
D1:对圈复杂度、Halstead度量、C&K度量、代码行数、操作符数量、操作数数量、字符串数量、方法/函数数量等传统的软件度量指标和切片度量指标进行特征组合。
D2:对特征数据进行标准化处理,让不同维度之间的特征在数值上有比较性,间接通过中心化避免异常值和极端值的影响,提高分类器的准确性。
其中,特征选择方法包括过滤法、包装法、嵌入法。
D3:通过特征选择的方法对传统度量指数进行选择,来实现特征降维从而选择主要影响软件缺陷的特征。
采用基于模型的特征选择法SelectFromModel,使用带L1惩罚项逻辑回归算法得到稀疏解,即大部分特征对应系数为零,将与目标Y(有无缺陷)不太相关的特征系数缩至为0,系数为0或接近0的特征是没有被选中的特征,而保留的特征是和缺陷有关的。
D4:基于模型的特征选择法SelectFromModel,按照特征降序排列,筛选出前k个传统度量指标的10个特征和切片度量指标。
S7:通过XGboost模型进行训练,训练好后的模型对代码进行监测,判断是否存在缺陷。需要说明的是:
E1:使用XGboost实现代码缺陷预测是一个二分类任务,预测代码有缺陷或者没有缺陷,设置XGboost目标函数objective为binary:logistic,为二分类逻辑回归。
其中,XGboost是使用梯度提升框架实现的高效、灵活、可移植的机器学习库。
E2:设置验证度量标准的eval_metric的值为auc。
其中,auc为曲线下面积,是衡量学习器优劣的一种性能指标。
E3:设置随机种子数seed为6,防止每次结果不一致。
E4:使用10折交叉来训练多个模型并进行平均值融合,防止模型的过拟合。
E5:对XGboost模型的max_depth、min_child_weight等参数通过网格搜索的方法进行调参。
先调整max_depth的范围为3-10,min_child_weight范围为1-6,这两个参数对模型影响最大,使用网格搜索的方法进行调整,这里使用sklearn提供的GridSearchCV,然后接着对Gamma、reg_alpha、reg_lambda、learning_rate、n_estimators、colsample_bytree9等参数用同样的方法进行调整,得到模型的一个最好的效果。
将训练好的模型用于预测代码是否存在缺陷,将代码按照S3、S4、S5、S6步骤计算出度量值,将这些度量特征做为模型的输入,输出结果为[0,1]之间的概率值,概率为[0,0.5)表示该代码不存在缺陷,[0.5,1]表示该代码存在缺陷。
本实施采用的方法属于代码缺陷预测范围,可以对不同编程语言转化成IR中间语言,然后对可能存在缺陷的指令生成相应的前向切片和后向切片,构建基于双向切片的认知复杂度度量指标和其他度量指标,并结合传统的度量指标,通过机器学习模型XGboost进行监督学习训练,最终训练好的模型可以预测代码是否存在缺陷,结合新的切片度量指标可以使得缺陷预测的准确率更高。
实施例2
通过将本文方法和传统度量代码缺陷预测方法进行对比,通过以下四个指标进行对比,实验采用的是开源数据集SARD和NVD,基于传统度量代码缺陷预测方法中度量指标不能捕获到细粒度的程序属性,本文通过构建新的切片度量可以更好的预测代码缺陷,通过测量准确率、精度、召回率、F1值,实验结果表明,以上本方法都有较好的提升。
Accuracy是准确率,表明模型预测正确的样本数占总样本数的比例,表明模型预测的准确率,越高越好。
Precision是精度,指实际为正例,预测为正例的样本数占所有预测为正例的样本数的比例。该比值表示的是检测漏洞的精度,越高越好。
Recall/invoke是召回率,指实际为正例,预测为正例的样本数占所有实际为正例的样本数的比例。该比值越高表明模型召回率越高,预测缺陷漏洞的能力越强,该比值越高越好。
F1-score是precision和TPR(recall/invoke)的调和平均,越高越好。
Figure BDA0003696993020000111
应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。

Claims (10)

1.一种基于程序切片度量的代码缺陷预测方法,其特征在于:包括,
S1:将不同语言的源码文件转化成LLVM IR文件;
S2:对转化成中间语言IR文件的训练集、测试集添加相应的标签;
S3:对中间语言IR生成系统依赖图SDG和与缺陷相关的程序切片;
S4:通过遍历系统依赖图SDG获取相关的度量指标;
S5:构建一种新型的基于前向切片和后向切片的认知复杂度度量指标切片认知域,并结合基于前向切片和后向切片的度量指标紧密度、重叠度、覆盖度,计算上述切片度量指标;
S6:对传统度量指标和切片度量指标通过基于模型的特征选择法进行特征选择;
S7:通过XGboost模型进行训练,训练好后的模型对代码进行监测,判断是否存在缺陷。
2.如权利要求1所述的基于程序切片度量的代码缺陷预测方法,其特征在于:对不同语言的源码文件通过相应的指令生成中间语言LLVM IR文件。
3.如权利要求1所述的基于程序切片度量的代码缺陷预测方法,其特征在于:根据数据集里的源码文件所包含的信息添加相应标签,对包含漏洞信息的文件,在其对应IR文件添加“1”的标签,对不包含漏洞信息的文件,在其对应IR文件添加“0”的标签。
4.如权利要求1所述的基于程序切片度量的代码缺陷预测方法,其特征在于:对中间语言IR生成系统依赖图SDG和与缺陷相关的程序切片包括:
A1:构造程序的控制流图和数据流图,在控制流图和数据流图的基础上获得控制依赖和数据依赖关系;
A2:根据控制依赖和数据依赖关系构造各个模块的过程内依赖图;
A3:根据各个过程的过程内依赖图和程序调用图构建系统依赖图;
A4:将源码文件转化成LLVM IR指令后,通过遍历IR指令,IR指令中存在和漏洞缺陷相关的指令,对于指针类型的缺陷,通过遍历IR指令,当遇到getElementPtr指令,对该指令中等号左边的的变量作为程序的敏感点,将这些敏感点保存到集合中,然后可能存在缺陷的敏感点进行程序切片;
其中,指针缺陷指针算术、引用、作为函数参数的地址传递中的不当使用相关缺陷;
A5:基于系统依赖图SDG的方法进行切片,获得前向切片和后向切片。
5.如权利要求1所述的基于程序切片度量的代码缺陷预测方法,其特征在于:通过遍历系统依赖图SDG获取相关的度量指标包括:
B1:获取程序依赖图的顶点数verticesCount、依赖边的数量edgesCount;
B2:获取切片大小sliceCount;
B3:获取切片模块中使用的函数参数和非局部变量的数量globalInput、输出的非局部变量的数量globalOutput;
B4:获取切片模块中使用输出变量间接影响的其他模块中的切片之和indIRectFanIn、使用输出变量直接影响的其他模块中的切片之和dIRectFanIn;
B5:获取其他模块中的输出变量对此模块直接影响的切片之和dIRectFanOut、其他模块中的输出变量对此模块间接影响的切片之和indIRectFanOut;
B6:根据系统依赖图SDG构建
Figure FDA0003696993010000021
IREtoV表示度量值。
6.如权利要求1所述的基于程序切片度量的代码缺陷预测方法,其特征在于:紧密度、重叠度、覆盖度包括:
紧密度公式为:
Figure FDA0003696993010000022
该度量指标可以全面考虑程序的紧密度情况,len(M)为切片模块M中IR语句的行数,SLint为Vo中所有变量的后向切片和Vi中所有变量的前向切片的交集;
重叠度公式为:
Figure FDA0003696993010000023
该度量指标可以全面考虑程序的重叠度情况,V为模块中输入变量和输出变量的集合,Vi为模块中输入变量的集合,i为输入变量下标,FSLx为变量x的前向切片,BSLx为变量x的后向切片;
覆盖度公式为:
Figure FDA0003696993010000024
该度量指标可以全面考虑程序的覆盖度情况,Vo为模块中输出变量的集合,o为输出变量的下标;
根据前向切片和后向切片构建新型的切片度量指标,基于切片的认知复杂度度量指标切片认知域,切片认知域公式为:
Figure FDA0003696993010000031
其中,len(B)为前向切片和后向切片的数量,xi为切片中第i个切片在CG图上坐标,yi为切片中第i个切片在CFG图上坐标,zi为切片中第i个切片在block上坐标,xk为关键点在CG图上坐标,yk为关键点在CFG图上坐标,zk为关键点在block上坐标,CG为函数调用关系图,CFG为流程控制图。
7.如权利要求1所述的基于程序切片度量的代码缺陷预测方法,其特征在于:对传统度量指标和切片度量指标通过基于模型的特征选择法进行特征选择包括:
C1:对圈复杂度、Halstead度量、C&K度量、代码行数、操作符数量、操作数数量、字符串数量、方法/函数数量等传统的软件度量指标和切片度量指标进行特征组合。
C2:对特征数据进行标准化处理,让不同维度之间的特征在数值上有比较性,间接通过中心化避免异常值和极端值的影响,提高分类器的准确性;
C3:通过特征选择的方法来实现特征降维,选择主要影响软件缺陷的特征;
C4:基于模型的特征选择法SelectFromModel,按照特征降序排列,筛选出前k个特征。
8.如权利要求7所述的基于程序切片度量的代码缺陷预测方法,其特征在于:所述特征选择方法包括过滤法、包装法、嵌入法。
9.如权利要求1所述的基于程序切片度量的代码缺陷预测方法,其特征在于:对传统度量指标和切片度量指标通过基于模型的特征选择法进行特征选择包括:
D1:使用XGboost实现代码缺陷预测,预测代码有缺陷或者没有缺陷;
其中,XGboost是使用梯度提升框架实现的高效、灵活、可移植的机器学习库,是一个二分类任务;
D2:设置验证度量标准的eval_metric的值为auc;
其中,auc为曲线下面积,是衡量学习器优劣的一种性能指标;
D3:设置随机种子数,防止每次结果不一致。
D4:使用10折交叉来训练多个模型并进行平均值融合,防止模型的过拟合。
D5:对XGboost模型的max_depth、min_child_weight等参数通过网格搜索的方法进行调参。
10.如权利要求4~9任意所述的基于程序切片度量的代码缺陷预测方法,其特征在于:训练好的XGboost模型用于预测代码是否存在缺陷,将代码按照S3、S4、S5、S6的步骤计算出度量值,将这些度量特征做为模型的输入,输出结果为[0,1]之间的概率值,概率为[0,0.5)表示该代码不存在缺陷,[0.5,1]表示该代码存在缺陷。
CN202210682893.7A 2022-06-16 2022-06-16 一种基于程序切片度量的代码缺陷预测方法 Active CN114996149B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210682893.7A CN114996149B (zh) 2022-06-16 2022-06-16 一种基于程序切片度量的代码缺陷预测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210682893.7A CN114996149B (zh) 2022-06-16 2022-06-16 一种基于程序切片度量的代码缺陷预测方法

Publications (2)

Publication Number Publication Date
CN114996149A true CN114996149A (zh) 2022-09-02
CN114996149B CN114996149B (zh) 2024-05-28

Family

ID=83035987

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210682893.7A Active CN114996149B (zh) 2022-06-16 2022-06-16 一种基于程序切片度量的代码缺陷预测方法

Country Status (1)

Country Link
CN (1) CN114996149B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040226006A1 (en) * 2003-05-05 2004-11-11 Jeffry Russell Program slicing for codesign of embedded systems
WO2008047351A2 (en) * 2006-10-19 2008-04-24 Checkmarx Ltd. Locating security vulnerabilities in source code
CN106933572A (zh) * 2017-02-20 2017-07-07 南京邮电大学 一种基于llvm中间表示程序切片的度量模型
CN112597038A (zh) * 2020-12-28 2021-04-02 中国航天系统科学与工程研究院 软件缺陷预测方法及系统
CN113722218A (zh) * 2021-08-23 2021-11-30 南京审计大学 一种基于编译器中间表示的软件缺陷预测模型构建方法
CN114064487A (zh) * 2021-11-18 2022-02-18 北京京航计算通讯研究所 一种代码缺陷检测方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040226006A1 (en) * 2003-05-05 2004-11-11 Jeffry Russell Program slicing for codesign of embedded systems
WO2008047351A2 (en) * 2006-10-19 2008-04-24 Checkmarx Ltd. Locating security vulnerabilities in source code
CN106933572A (zh) * 2017-02-20 2017-07-07 南京邮电大学 一种基于llvm中间表示程序切片的度量模型
CN112597038A (zh) * 2020-12-28 2021-04-02 中国航天系统科学与工程研究院 软件缺陷预测方法及系统
CN113722218A (zh) * 2021-08-23 2021-11-30 南京审计大学 一种基于编译器中间表示的软件缺陷预测模型构建方法
CN114064487A (zh) * 2021-11-18 2022-02-18 北京京航计算通讯研究所 一种代码缺陷检测方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
傅艺绮;董威;尹良泽;杜雨晴;: "基于组合机器学习算法的软件缺陷预测模型", 计算机研究与发展, no. 03, 15 March 2017 (2017-03-15) *

Also Published As

Publication number Publication date
CN114996149B (zh) 2024-05-28

Similar Documents

Publication Publication Date Title
CN117951701A (zh) 用于确定软件代码中的缺陷和漏洞的方法
CN108182515B (zh) 智能规则引擎规则输出方法、设备及计算机可读存储介质
US9535821B1 (en) Displaying violated coding rules in source code
US20130340076A1 (en) Code repository intrusion detection
CN109376535B (zh) 一种基于智能化符号执行的漏洞分析方法及系统
EP4028960A1 (en) Visually creating and monitoring machine learning models
CN109656917A (zh) 多数据源的数据检测方法、装置、设备及可读存储介质
WO2019055378A1 (en) METHOD AND APPARATUS FOR FINDING LONG PROCESSES IN A CODE
Siavvas et al. A hierarchical model for quantifying software security based on static analysis alerts and software metrics
CN115659335A (zh) 基于混合模糊测试的区块链智能合约漏洞检测方法及装置
Filus et al. Software vulnerabilities in TensorFlow-based deep learning applications
Alakeel Using fuzzy logic in test case prioritization for regression testing programs with assertions
Bateman et al. The The Supervised Learning Workshop: A New, Interactive Approach to Understanding Supervised Learning Algorithms
Al Sabbagh et al. Predicting Test Case Verdicts Using TextualAnalysis of Commited Code Churns
CN117034299B (zh) 一种基于区块链的智能合约安全检测系统
Zhao et al. Suzzer: A vulnerability-guided fuzzer based on deep learning
Liu et al. ProMal: precise window transition graphs for android via synergy of program analysis and machine learning
CN114996149B (zh) 一种基于程序切片度量的代码缺陷预测方法
Kaur et al. Cognitive complexity as a quantifier of version to version Java-based source code change: An empirical probe
CN115525899A (zh) 面向持续集成平台的漏洞误报消除方法
Kayes et al. The network of faults: a complex network approach to prioritize test cases for regression testing
Yang et al. A Method-Level Defect Prediction Approach Based on Structural Features of Method-Calling Network
Morgachev et al. Detection of variable misuse using static analysis combined with machine learning
Satapathy et al. Automated software engineering: a deep learning-based approach
Huang et al. Towards automatically identifying the co‐change of production and test code

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