CN110825642B - 一种基于深度学习的软件代码行级缺陷检测方法 - Google Patents

一种基于深度学习的软件代码行级缺陷检测方法 Download PDF

Info

Publication number
CN110825642B
CN110825642B CN201911092161.7A CN201911092161A CN110825642B CN 110825642 B CN110825642 B CN 110825642B CN 201911092161 A CN201911092161 A CN 201911092161A CN 110825642 B CN110825642 B CN 110825642B
Authority
CN
China
Prior art keywords
ats
api
lstm model
code
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.)
Active
Application number
CN201911092161.7A
Other languages
English (en)
Other versions
CN110825642A (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.)
Zhejiang University ZJU
Original Assignee
Zhejiang University ZJU
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 Zhejiang University ZJU filed Critical Zhejiang University ZJU
Priority to CN201911092161.7A priority Critical patent/CN110825642B/zh
Publication of CN110825642A publication Critical patent/CN110825642A/zh
Application granted granted Critical
Publication of CN110825642B publication Critical patent/CN110825642B/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/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于深度学习的软件代码行级缺陷检测方法,属于软件代码缺陷检测领域,该方法具体包括:(1)master分支中基于类的ATS提取,(2)ATS集合预处理,(3)LSTM模型训练,(4)开发分支ATS集合提取与检测,(5)ATS异常概率排序。该方法的模型代码处理粒度可达代码行级别,可对代码片段做缺陷检测,能够有效捕捉代码中相关Token的前后关联,可利用已有其他代码仓库中的相关代码信息。

Description

一种基于深度学习的软件代码行级缺陷检测方法
技术领域
本发明属于软件代码缺陷检测领域,具体地涉及一种基于深度学习的软件代码行级缺陷检测方法。
背景技术
代码缺陷检测一直是软件工程领域的研究热点。FindBugs是一种基于规则匹配的缺陷检测工具,其通过检查类或jar文件,将字节码与一组缺陷模式进行对比以发现可能的问题。Commit Guru是一种基于特征的变更级缺陷检测工具,其通过人工定义特征,通过机器学习建模,从而判断新提交的代码变更缺陷的可能性。Bugram是一种基于代码统计特性的代码行级缺陷检测工具,其通过N-gram算法计算源代码中Token的异常概率,以检测代码缺陷。但这些方法都有其各自的缺点
1.规则难以覆盖所有缺陷情况;
2.代码处理粒度太大,无法对代码片段做缺陷检测;
3.无法有效捕捉代码中Token关联;
4.无法有效利用其他代码仓库代码信息;
这些问题广泛存在于其他的代码克隆检测工具中。
发明内容
针对现有技术存在的问题,本发明提供了一种基于深度学习的软件代码行级缺陷检测方法。
本发明是通过以下技术方案实现的:一种基于深度学习的软件代码行级缺陷检测方法,具体包括如下步骤:
步骤一:master分支中基于类的ATS提取
master分支中的每一个Java文件通过AST解析为一棵语法树,Java文件中的每一个方法为所述语法树上的一棵子树,记为MST,通过遍历MST,得到MST所代表该部分源代码的API执行流程。针对指定类,从解析到的代码执行流程中提取出指定类在MST中的所有API使用序列,即ATS;多个ATS构成ATS集合。
步骤二:ATS集合预处理
使用基于Skip-gram算法的分布式语义模型,将步骤一指定类下的所有APIToken训练为d维的词向量,以此来捕捉所述ATS集合中各API token在向量空间下的关联。
步骤三:LSTM模型训练
将步骤一中提取到的ATS集合,按所属类分类,得到若干个ATS集,针对每一个ATS集训练一个LSTM模型,直到所述LSTM模型训练至损失函数收敛为止。
步骤四:开发分支ATS集合提取与检测
将Git仓库切换至开发分支,使用步骤一和二中的方法从开发分支中提取指定类所属的ATS集合,将得到的ATS集合输入步骤三中训练好的对应LSTM模型,得到各ATS的异常概率结果,具体过程为:
ATSc={api1,api2,…,apik,EOF} (3)
其中,EOF为结束标识符,
按顺序将Token输入LSTM模型中,每一Token:apii输入之后,LSTM模型输出其下一个Token为apii+1的概率pi,且EOF不输入模型。对k个Token经过LSTM模型后预测输出的概率{p1,p2,…,pk}取平均值,遍得到ATSc中API使用的正确概率pASTC
Figure BDA0002267130030000021
其中,k为ATSc中的Token个数,pi为apii经由LSTM模型后输出的概率值。
步骤五:ATS异常概率排序
将步骤四中所得指定类的ATS集合中各ATS经LSTM模型输出的概率值按升序排序。
进一步地,步骤2中所述Skip-gram模型的目标函数J的计算方法如下:
Figure BDA0002267130030000022
Figure BDA0002267130030000023
其中,n为表示Token序列的长度,ti为ATS中某一Token,Cti为Tokenti周围Token的集合,tj为Cti中的各Token,p(tj|ti)为softmax函数定义的条件概率,vt是Tokent的向量表示,T是ATS集合中所有Token的词汇表。
进一步地,步骤3中所述LSTM模型中需要设置:指定类ATS集合中所有词汇表的大小为voca_size,词向量的维度参数为vec_size,LSTM模型的输入层维度参数input_size=vec_size,隐藏层维度参数设置为hidden_size=2*input_size,输出层维度参数设置为output_size=voca_size,LSTM网络层数设置为2。
与现有技术相比,本发明具有如下有益效果:
1.本文方法直接利用源代码进行建模,同时基于源代码检测缺陷,因此代码处理粒度可达代码行级别,可对代码片段做缺陷检测;
2.本文方法通过对源代码进行预处理并建立LSTM模型,能有效捕捉代码中相关Token的前后关联;
3.本文方法基于Java类建模,同一Java类于不同代码仓库中的代码也可利用,因此能有效利用已有其他代码仓库中的代码信息。
附图说明
图1基于API序列的代码缺陷检测流程;
图2模型结构图。
具体实施方式
给定一个Java Git仓库,切换至master分支,记为MB(master branch),利用抽象语法树解析,从每一个Java文件的每一个方法中,提取出所使用的类(Class)与相应的API序列,记为ATS(API Token Sequence)。针对特定类,使用从MB中提取的ATS,训练长短期记忆(LSTM)模型至收敛。将Git仓库切换至其他开发分支,记为DB(develop branch),同样提取相应类的ATS,将DB下的ATS输入已训练好的LSTM模型中,输出ATS的异常概率,排序得到缺陷概率最大的代码片段。
如图1所示,为本发明API序列的代码缺陷检测流程,其过程具体为:
步骤①:master分支中基于类的ATS提取
master分支中的每一个Java文件通过AST解析为一棵语法树,所述Java文件中的每一个方法为所述语法树上的一棵子树,记为MST,通过遍历MST,得到MST所代表该部分源代码的API执行流程。针对指定类,从解析到的代码执行流程中提取出指定类在MST中的所有API使用序列,即ATS。master分支上存在多个Java文件使用指定类,同一Java文件中也可能存在多个方法使用指定类,故可提取到多个ATS,即针对指定类,可在master分支上提取到ATS集合。
步骤②:ATS集合预处理
使用基于Skip-gram算法的分布式语义模型,将步骤①指定类下的所有APIToken训练为d维的词向量,以此来捕捉所述ATS集合中各API token在向量空间下的关联。
所述Skip-gram模型的目标函数J的计算方法如下:
Figure BDA0002267130030000041
Figure BDA0002267130030000042
其中,n为表示Token序列的长度,ti为ATS中某一Token,Cti为Tokenti周围Token的集合,tj为Cti中的各Token,p(tj|ti)为softmax函数定义的条件概率,vt是Tokent的向量表示,T是ATS集合中所有Token的词汇表。通过训练整个ATS语料库,语料库词汇表中的所有Token都可以表示为d维向量,其中d为可变参数,大小与语料库词汇表大小有关。
步骤③:LSTM模型训练
将步骤①中提取到的ATS集合,按所属类分类,得到若干个ATS集,针对每一个ATS集训练一个LSTM模型,直到所述LSTM模型训练至损失函数收敛为止。如图2,所述LSTM模型中需要设置:指定类ATS集合中所有词汇表的大小为voca_size,词向量的维度参数为vec_size,LSTM模型的输入层维度参数input_size=vec_size,隐藏层维度参数设置为hidden_size=2*input_size,输出层维度参数设置为output_size=voca_size,LSTM网络层数设置为2。
步骤④:开发分支ATS集合提取与检测
将Git仓库切换至开发分支,使用步骤①和②中的方法从开发分支中提取指定类所属的ATS集合,将得到的ATS集合输入步骤③中训练好的对应LSTM模型,得到各ATS的异常概率结果,具体过程为:
ATSc={api1,api2,…,apik,EOF} (3)
其中,EOF为结束标识符,
按顺序将Token输入LSTM模型中,每一Token:apii输入之后,LSTM模型输出其下一个Token为apii+1的概率pi,且EOF不输入模型。对k个Token经过LSTM模型后预测输出的概率{p1,p2,…,pk}取平均值,遍得到ATSc中API使用的正确概率pASTC
Figure BDA0002267130030000051
其中,k为ATSc中的Token个数,pi为apii经由LSTM模型后输出的概率值。
pASTC值越低,即ATSc使用API的异常性越大,含有缺陷的可能越高。
步骤五:ATS异常概率排序
将步骤④中所得指定类的ATS集合中各ATS经LSTM模型输出的概率值按升序排序。根据开发者需要,如开发者精力,可以选取前N个最可能异常的ATS序列提供给开发者审查,开发者根据该ATS序列定位至相应代码片段,便可对代码正确性做更具体的分析,判定是否为异常。
实施例
使用了本文方法与Bugram工具(Bug detection with Ngram language models)对8个Java类做了对比实验,因为java文件中的代码段不具有标签信息,故评价工具性能表现的指标是推荐准确率与MRR(Measurement Result Recording),通过人工审阅模型给出潜在含有缺陷的前20个代码段,判断20个代码段中真正为缺陷的代码段个数,以及第一个真实缺陷在候选结果中的排序位置。详细结果如表1。如表1所示,本文方法在8个Java类的测试结果上,缺陷推荐准确率与MRR两项指标均优于Bugram方法。本文方法与Bugram工具都是无监督方法,但本文方法利用了master分支代码作为训练集进行训练,模型学习并捕捉到了对应Java类中的API使用规范,而Bugram工具是基于概率统计进行缺陷检测,无法利用已有代码,故在测试集上表现不如本文方法。
由此可见,本文方法能利用已有代码,捕捉代码中相关Token的前后关联,可有效准确地检测出源代码中的API使用缺陷。
表1本文方法与Bugram工具缺陷检测对比
Figure BDA0002267130030000052
Figure BDA0002267130030000061

Claims (3)

1.一种基于深度学习的软件代码行级缺陷检测方法,其特征在于,具体包括如下步骤:
步骤一:master分支中基于类的ATS提取
master分支中的每一个Java文件通过AST解析为一棵语法树,Java文件中的每一个方法为所述语法树上的一棵子树,记为MST,通过遍历MST,得到MST所代表源代码的API执行流程;针对指定类,从解析到的代码执行流程中提取出指定类在MST中的所有API使用序列,即ATS;多个ATS构成ATS集合;
步骤二:ATS集合预处理
使用基于Skip-gram算法的分布式语义模型,将步骤一指定类下的所有API Token训练为d维的词向量,以此来捕捉所述ATS集合中各API token在向量空间下的关联;
步骤三:LSTM模型训练
将步骤一中提取到的ATS集合,按所属类分类,得到若干个ATS集,针对每一个ATS集训练一个LSTM模型,直到所述LSTM模型训练至损失函数收敛为止;
步骤四:开发分支ATS集合提取与检测
将Git仓库切换至开发分支,使用步骤一和二中的方法从开发分支中提取指定类所属的ATS集合,将得到的ATS集合输入步骤三中训练好的对应LSTM模型,得到各ATS的异常概率结果,具体过程为:
ATSc={api1,api2,…,apik,EOF} (3)
其中,EOF为结束标识符,
按顺序将Token输入LSTM模型中,每一Token:apii输入之后,LSTM模型输出其下一个Token为apii+1的概率pi,且EOF不输入模型;对k个Token经过LSTM模型后预测输出的概率{p1,p2,…,pk}取平均值,遍得到ATSc中API使用的正确概率
Figure FDA0002755399620000012
Figure FDA0002755399620000011
其中,k为ATSc中的Token个数,pi为apii经由LSTM模型后输出的概率值;
步骤五:ATS异常概率排序
将步骤四中所得指定类的ATS集合中各ATS经LSTM模型输出的概率值按升序排序。
2.根据权利要求1所述缺陷检测方法,其特征在于,步骤2中所述Skip-gram模型的目标函数J的计算方法如下:
Figure FDA0002755399620000021
Figure FDA0002755399620000022
其中,n为表示Token序列的长度,ti为ATS中某一Token,Cti为Tokenti周围Token的集合,tj为Cti中的各Token,p(tj|ti)为softmax函数定义的条件概率,vt是Tokent的向量表示,T是ATS集合中所有Token的词汇表。
3.根据权利要求1所述缺陷检测方法,其特征在于,步骤3中所述LSTM模型中需要设置:指定类ATS集合中所有词汇表的大小为voca_size,词向量的维度参数为vec_size,LSTM模型的输入层维度参数input_size=vec_size,隐藏层维度参数设置为hidden_size=2*input_size,输出层维度参数设置为output_size=voca_size,LSTM网络层数设置为2。
CN201911092161.7A 2019-11-11 2019-11-11 一种基于深度学习的软件代码行级缺陷检测方法 Active CN110825642B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911092161.7A CN110825642B (zh) 2019-11-11 2019-11-11 一种基于深度学习的软件代码行级缺陷检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911092161.7A CN110825642B (zh) 2019-11-11 2019-11-11 一种基于深度学习的软件代码行级缺陷检测方法

Publications (2)

Publication Number Publication Date
CN110825642A CN110825642A (zh) 2020-02-21
CN110825642B true CN110825642B (zh) 2021-01-01

Family

ID=69553648

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911092161.7A Active CN110825642B (zh) 2019-11-11 2019-11-11 一种基于深度学习的软件代码行级缺陷检测方法

Country Status (1)

Country Link
CN (1) CN110825642B (zh)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111459799B (zh) * 2020-03-03 2023-03-10 西北大学 一种基于Github的软件缺陷检测模型建立、检测方法及系统
CN112035347B (zh) * 2020-08-26 2022-03-01 北京航空航天大学 一种源代码的自动异常处理方法
CN113986345B (zh) * 2021-11-01 2024-05-07 天津大学 一种预训练增强的代码克隆检测方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109086606A (zh) * 2018-07-16 2018-12-25 腾讯科技(深圳)有限公司 一种程序漏洞挖掘方法、装置、终端及存储介质

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8813047B2 (en) * 2005-09-08 2014-08-19 Alcatel Lucent Yet another transformation language (YATL)
US9519477B2 (en) * 2013-09-16 2016-12-13 International Business Machines Corporation Automatic pre-detection of potential coding issues and recommendation for resolution actions
CN107967208B (zh) * 2016-10-20 2020-01-17 南京大学 一种基于深度神经网络的Python资源敏感缺陷代码检测方法
CN107885999B (zh) * 2017-11-08 2019-12-24 华中科技大学 一种基于深度学习的漏洞检测方法及系统
CN109389599A (zh) * 2018-10-25 2019-02-26 北京阿丘机器人科技有限公司 一种基于深度学习的缺陷检测方法及装置
CN109408389B (zh) * 2018-10-30 2020-10-16 北京理工大学 一种基于深度学习的代码缺陷检测方法及装置
CN110011986B (zh) * 2019-03-20 2021-04-02 中山大学 一种基于深度学习的源代码漏洞检测方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109086606A (zh) * 2018-07-16 2018-12-25 腾讯科技(深圳)有限公司 一种程序漏洞挖掘方法、装置、终端及存储介质

Also Published As

Publication number Publication date
CN110825642A (zh) 2020-02-21

Similar Documents

Publication Publication Date Title
CN111783100B (zh) 基于图卷积网络对代码图表示学习的源代码漏洞检测方法
CN110597735B (zh) 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法
CN109697162B (zh) 一种基于开源代码库的软件缺陷自动检测方法
CN112214610B (zh) 一种基于跨度和知识增强的实体关系联合抽取方法
CN110825642B (zh) 一种基于深度学习的软件代码行级缺陷检测方法
CN110232280B (zh) 一种基于树结构卷积神经网络的软件安全漏洞检测方法
CN111062376A (zh) 基于光学字符识别与纠错紧耦合处理的文本识别方法
CN111427775B (zh) 一种基于Bert模型的方法层次缺陷定位方法
CN111062397A (zh) 一种智能票据处理系统
WO2021174812A1 (zh) 用于画像的数据的清洗方法、装置、介质及电子设备
CN112597038B (zh) 软件缺陷预测方法及系统
CN108648747A (zh) 语种识别系统
CN109871891B (zh) 一种物体识别方法、装置和存储介质
CN113672931B (zh) 一种基于预训练的软件漏洞自动检测方法及装置
CN106528527A (zh) 未登录词的识别方法及识别系统
CN112651296A (zh) 一种无先验知识数据质量问题自动探查方法及系统
CN114936158A (zh) 一种基于图卷积神经网络的软件缺陷定位方法
CN113434418A (zh) 知识驱动的软件缺陷检测与分析方法及系统
CN115146062A (zh) 融合专家推荐与文本聚类的智能事件分析方法和系统
CN115169534A (zh) 卷积神经网络的样本优化训练方法及计算机可读存储介质
CN114897085A (zh) 一种基于封闭子图链路预测的聚类方法及计算机设备
CN114386048A (zh) 基于排序的开源软件安全漏洞补丁定位方法
CN111191448A (zh) 词处理方法、装置、存储介质以及处理器
CN113407439B (zh) 一种用于软件自承认型技术债务的检测方法
CN115146630B (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