CN110825642B - 一种基于深度学习的软件代码行级缺陷检测方法 - Google Patents
一种基于深度学习的软件代码行级缺陷检测方法 Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test 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;
其中,k为ATSc中的Token个数,pi为apii经由LSTM模型后输出的概率值。
步骤五:ATS异常概率排序
将步骤四中所得指定类的ATS集合中各ATS经LSTM模型输出的概率值按升序排序。
进一步地,步骤2中所述Skip-gram模型的目标函数J的计算方法如下:
其中,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的计算方法如下:
其中,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;
其中,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工具缺陷检测对比
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使用的正确概率
其中,k为ATSc中的Token个数,pi为apii经由LSTM模型后输出的概率值;
步骤五:ATS异常概率排序
将步骤四中所得指定类的ATS集合中各ATS经LSTM模型输出的概率值按升序排序。
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。
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)
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)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109086606A (zh) * | 2018-07-16 | 2018-12-25 | 腾讯科技(深圳)有限公司 | 一种程序漏洞挖掘方法、装置、终端及存储介质 |
Family Cites Families (7)
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 | 中山大学 | 一种基于深度学习的源代码漏洞检测方法 |
-
2019
- 2019-11-11 CN CN201911092161.7A patent/CN110825642B/zh active Active
Patent Citations (1)
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 |