CN110825642A - 一种基于深度学习的软件代码行级缺陷检测方法 - Google Patents
一种基于深度学习的软件代码行级缺陷检测方法 Download PDFInfo
- Publication number
- CN110825642A CN110825642A CN201911092161.7A CN201911092161A CN110825642A CN 110825642 A CN110825642 A CN 110825642A CN 201911092161 A CN201911092161 A CN 201911092161A CN 110825642 A CN110825642 A CN 110825642A
- Authority
- CN
- China
- Prior art keywords
- ats
- api
- code
- token
- lstm model
- 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
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 true CN110825642A (zh) | 2020-02-21 |
CN110825642B 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) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111459799A (zh) * | 2020-03-03 | 2020-07-28 | 西北大学 | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 |
CN112035347A (zh) * | 2020-08-26 | 2020-12-04 | 北京航空航天大学 | 一种源代码的自动异常处理方法 |
CN113986345A (zh) * | 2021-11-01 | 2022-01-28 | 天津大学 | 一种预训练增强的代码克隆检测方法 |
Citations (8)
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 |
CN107885999A (zh) * | 2017-11-08 | 2018-04-06 | 华中科技大学 | 一种基于深度学习的漏洞检测方法及系统 |
CN107967208A (zh) * | 2016-10-20 | 2018-04-27 | 南京大学 | 一种基于深度神经网络的Python资源敏感缺陷代码检测方法 |
CN109086606A (zh) * | 2018-07-16 | 2018-12-25 | 腾讯科技(深圳)有限公司 | 一种程序漏洞挖掘方法、装置、终端及存储介质 |
CN109389599A (zh) * | 2018-10-25 | 2019-02-26 | 北京阿丘机器人科技有限公司 | 一种基于深度学习的缺陷检测方法及装置 |
CN109408389A (zh) * | 2018-10-30 | 2019-03-01 | 北京理工大学 | 一种基于深度学习的代码缺陷检测方法及装置 |
CN110011986A (zh) * | 2019-03-20 | 2019-07-12 | 中山大学 | 一种基于深度学习的源代码漏洞检测方法 |
-
2019
- 2019-11-11 CN CN201911092161.7A patent/CN110825642B/zh active Active
Patent Citations (8)
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 |
CN107967208A (zh) * | 2016-10-20 | 2018-04-27 | 南京大学 | 一种基于深度神经网络的Python资源敏感缺陷代码检测方法 |
CN107885999A (zh) * | 2017-11-08 | 2018-04-06 | 华中科技大学 | 一种基于深度学习的漏洞检测方法及系统 |
CN109086606A (zh) * | 2018-07-16 | 2018-12-25 | 腾讯科技(深圳)有限公司 | 一种程序漏洞挖掘方法、装置、终端及存储介质 |
CN109389599A (zh) * | 2018-10-25 | 2019-02-26 | 北京阿丘机器人科技有限公司 | 一种基于深度学习的缺陷检测方法及装置 |
CN109408389A (zh) * | 2018-10-30 | 2019-03-01 | 北京理工大学 | 一种基于深度学习的代码缺陷检测方法及装置 |
CN110011986A (zh) * | 2019-03-20 | 2019-07-12 | 中山大学 | 一种基于深度学习的源代码漏洞检测方法 |
Non-Patent Citations (1)
Title |
---|
蔡亮等: "即时软件缺陷预测研究进展", 《软件学报》 * |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111459799A (zh) * | 2020-03-03 | 2020-07-28 | 西北大学 | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 |
CN111459799B (zh) * | 2020-03-03 | 2023-03-10 | 西北大学 | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 |
CN112035347A (zh) * | 2020-08-26 | 2020-12-04 | 北京航空航天大学 | 一种源代码的自动异常处理方法 |
CN113986345A (zh) * | 2021-11-01 | 2022-01-28 | 天津大学 | 一种预训练增强的代码克隆检测方法 |
CN113986345B (zh) * | 2021-11-01 | 2024-05-07 | 天津大学 | 一种预训练增强的代码克隆检测方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110825642B (zh) | 2021-01-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111783100B (zh) | 基于图卷积网络对代码图表示学习的源代码漏洞检测方法 | |
CN112214610B (zh) | 一种基于跨度和知识增强的实体关系联合抽取方法 | |
CN110597735B (zh) | 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法 | |
CN110232280B (zh) | 一种基于树结构卷积神经网络的软件安全漏洞检测方法 | |
CN110825642B (zh) | 一种基于深度学习的软件代码行级缺陷检测方法 | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN109948340B (zh) | 一种卷积神经网络和XGBoost相结合的PHP-Webshell检测方法 | |
CN113127339B (zh) | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 | |
CN112597038B (zh) | 软件缺陷预测方法及系统 | |
CN109492106B (zh) | 一种文本代码相结合的缺陷原因自动分类方法 | |
CN116049831A (zh) | 一种基于静态分析和动态分析的软件漏洞检测方法 | |
CN113672931B (zh) | 一种基于预训练的软件漏洞自动检测方法及装置 | |
CN108664237B (zh) | 一种基于启发式和神经网络的非api成员推荐方法 | |
CN112651296A (zh) | 一种无先验知识数据质量问题自动探查方法及系统 | |
CN113434418A (zh) | 知识驱动的软件缺陷检测与分析方法及系统 | |
CN117540389A (zh) | 一种基于签名的模型源代码漏洞检测方法 | |
CN115169534A (zh) | 卷积神经网络的样本优化训练方法及计算机可读存储介质 | |
CN114386048A (zh) | 基于排序的开源软件安全漏洞补丁定位方法 | |
CN113448860A (zh) | 测试案例分析方法及装置 | |
CN115048491B (zh) | 在异构语义空间中基于假设检验的软件跨模态检索方法 | |
CN111191448A (zh) | 词处理方法、装置、存储介质以及处理器 | |
CN113407439B (zh) | 一种用于软件自承认型技术债务的检测方法 | |
CN113313184B (zh) | 一种异质集成的自承认技术债务自动检测方法 | |
CN111538843B (zh) | 游戏领域的知识图谱关系匹配方法、模型构建方法及装置 | |
CN113553630B (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 |