CN108804332B - 一种基于机器学习的c程序内存泄漏智能化检测方法 - Google Patents
一种基于机器学习的c程序内存泄漏智能化检测方法 Download PDFInfo
- Publication number
- CN108804332B CN108804332B CN201810613423.9A CN201810613423A CN108804332B CN 108804332 B CN108804332 B CN 108804332B CN 201810613423 A CN201810613423 A CN 201810613423A CN 108804332 B CN108804332 B CN 108804332B
- Authority
- CN
- China
- Prior art keywords
- memory
- classifier
- program
- memory leakage
- pointer
- 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/362—Software debugging
- G06F11/366—Software debugging using diagnostics
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)
- Debugging And Monitoring (AREA)
- Complex Calculations (AREA)
Abstract
本发明公开一种基于机器学习的C程序内存泄漏智能化检测方法,分为三个阶段:模型构建阶段,根据已有的内存泄漏构建两个数据集,分别从两个数据中提取内存泄漏特征,将内存泄漏特征输入机器学习的分类器进行训练,交叉验证,修改分类器类型及参数,选取分类准确率最高的作为分类器模型来检测内存泄漏。程序分析与特征获取阶段,对源程序进行预分析,获取所有的内存分配点o,然后进行指针分析,构建从o开始的VFG(ValueFlowGraph),提取VFG中每条路径对应的内存泄漏特征。缺陷检测与报告阶段,将程序分析与特征获取阶段的内存泄漏特征输入到模型构建阶段的分类器模型中进行检测,判断从o开始的路径中是否存在内存泄漏,得到内存泄漏报告。
Description
技术领域
本发明涉及一种内存泄漏的检测方法,使用程序静态分析方法和机器学习算法,实现内存泄漏的检测,属于软件工程领域。
背景技术
在计算机科学领域,程序静态分析是指在没有实际执行程序的情况下对计算机软件进行分析。在大多数情况下,分析实在某个版本的源代码上执行的额,其他情况下则是某种形式的目标代码。机器学习算法常见的有决策树、随机森林、逻辑回归、SVM、朴素贝叶斯等。SVM的优点在于他简化了通常的分类和回归问题,它计算的复杂性取决于支持向量的数目,而不是样本空间的维数,因此SVM不但算法简单且具有很好的鲁棒性。
目前内存泄漏的检测主要采用两种方法:静态分析,动态检测。静态分析可以自动化运行,速度快,但存在大量的误报;动态检测结果准确,但开销高,依赖测试用例。本发明采用了基于机器学习的方法,在静态分析的基础上,提取内存泄露特征,并通过机器学习的方法进行分类器模型的训练以及目标程序的检测。可以保证内存泄漏检测速度快以及检测结果的高准确率。
发明内容
目前的内存泄漏检测方法,通常采用静态分析和动态检测,静态分析误报太多,且无法解决C语言中的一些复杂结构造成的内存泄漏,动态检测开销高。
本发明为解决上述技术问题采用以下技术方案:一种基于机器学习的C程序内存泄漏智能化检测方法,包括以下步骤:
步骤1)根据已有的内存泄漏构建两个数据集,一个是包含真正的内存泄漏的数据集,另一个是包含虚假的内存泄漏的数据集。
步骤2)提取内存泄漏特征。内存泄漏特征包括两类:类型信息以及指针信息。
步骤3)构建分类器模型,具体步骤如下:
步骤3.1)将提取的内存泄漏特征作为训练集输入到分类器中。
步骤3.2)在训练过程中进行交叉验证,查看分类器分类的准确率。
步骤3.3)调整分类器参数,重复3.1,3.2步骤,若分类准确率超过设定目标值,则记录当前分类器的类型、参数及其准确率。
步骤3.4)调整分类器的类型,重复3.1,3.2,3.3步骤。
步骤3.5)在当前记录的分类器中选取准确率最高的分类器类型及参数,确定唯一的分类器模型。
步骤4)程序预分析,具体步骤如下:
步骤4.1)对于需要检测的C程序,将其转化为LLVM的中间码(.bc文件)。
步骤4.2)在LLVM中间码上获取所有的内存分配点o。
步骤5)程序指针分析,具体步骤如下:
步骤5.1)对每个函数使用流不敏感、上下文不敏感、域敏感以及调用点敏感的安德森指针分析,获取每个指针指向的内存区域集合。每个指针的指向集用ps表示,格式如下:
ps(v)={o,o′}
v表示指针变量,ps(v)表示指针v指向的内存区域,{o,o′}表示内存区域o和o′的集合。
步骤5.2)获取基于SSA(StaticSingleAssignment)的内存信息。在安德森指针分析之后,获取所有指针变量的def和use。对于函数调用点,分析不在本函数内部但是可以在本函数内部修改读取的非全局指针变量,然后生成指针变量指向的内部区域,构建每个函数SSA形式。
步骤5.3)构建每个分配点o的VFG。已知每个指针的指向内存区域集合ps(v和基于SSA的内存信息,可从分配点o开始构建VFG。
步骤6)提取每个分配点每条路径的内存泄漏特征,,每条路径提取的特征组成一个向量,所有路径的向量构成测试集。
步骤7)将测试集进行预处理,调整为符合分类器模型的输入格式,输入到分类器模型中,获取分类检测结果即漏洞报告。
有益效果:本发明采用以上技术方案,与现有技术相比,具体以下有益效果:
1.根据常见的C程序内存泄漏特征,本方法可以检测C程序中的内存泄漏。
2.本方法在逐步增加训练集后,分类器结果会更加准确。
3.本方法使用程序静态分析方法提取内存泄漏特征,不实际运行程序,消耗时间短,可以快速检测大型程序中的内存泄漏。
附图说明
图1是基于机器学习的C程序内存泄漏智能化检测方法的流程图。
图2是模型训练阶段提取的内存泄露特征实例(每一行表示一个内存泄漏特征。第一列表示标签:1表示内存泄漏,0表示不是内存泄露。后15列为内存泄露特征,每列的冒号之前的数表示特征序号,冒号之后的数表示特征值。在表示布尔值的特征时:0表示false,1表示true)。
图3是程序分析与特征获取阶段的内存泄漏特征实例(每一行代表一个内存泄露特征。共15列特征,每列的冒号之前的数表示特征序号,冒号之后的数表示特征值。在表示布尔值的特征时:0表示false,1表示true)。
图4是(表1)内存泄漏特征(o是内存分配点,即内存区域,p是指向o的指针)。
具体实施方式
下面对本发明使用基于机器学习的C程序内存泄漏智能化检测方法,具体实施方式做更详细的描述。
根据附图1所示的基于机器学习的C程序内存泄漏智能化检测方法的流程图,本发明的具体实施方式为:
1)根据已有的内存泄漏构建两个数据集,一个是包含真正的内存泄漏的数据集,另一个是包含虚假的内存泄漏的数据集。
2)提取内存泄漏特征。内存泄漏特征包括两类:类型信息以及指针信息。如图2所示,是模型训练阶段提取的内存泄露特征实例(每一行表示一个内存泄漏特征。第一列表示标签:1表示内存泄漏,0表示不是内存泄露。后15列为内存泄露特征,每列的冒号之前的数表示特征序号,冒号之后的数表示特征值。在表示布尔值的特征时:0表示false,1表示true)。
3)构建分类器模型,具体步骤如下:
3.1)将提取的内存泄漏特征作为训练集输入到分类器中。
3.2)在训练过程中进行交叉验证,查看分类器分类的准确率。
3.3)调整分类器参数,重复3.1,3.2步骤,若分类准确率超过设定目标值,则记录当前分类器的类型、参数及其准确率。
3.4)调整分类器的类型,重复3.1,3.2,3.3步骤。
3.5)在当前记录的分类器中选取准确率最高的分类器类型及参数,确定唯一的分类器模型。
4)程序预分析,具体步骤如下:
4.1)对于需要检测的C程序,将其转化为LLVM的中间码(.bc文件)。
4.2)在LLVM中间码上获取所有的内存分配点o。
5)程序指针分析,具体步骤如下:
5.1)对每个函数使用流不敏感、上下文不敏感、域敏感以及调用点敏感的安德森指针分析,获取每个指针指向的内存区域集合。每个指针的指向集用ps表示,格式如下:
ps(v)={o,o′}
v表示指针变量,ps(v)表示指针v指向的内存区域,{o,o′}表示内存区域o和o′的集合。
5.2)获取基于SSA(StaticSingleAssignment)的内存信息。在安德森指针分析之后,获取所有指针变量的def和use。对于函数调用点,使用Mod-Ref分析,分析不在本函数内部但是可以在本函数内部修改读取的非全局指针变量,然后生成指针变量指向的内部区域,构建每个函数SSA形式。
5.3)构建每个分配点o的VFG。已知每个指针的指向内存区域集合ps(v)和基于SSA的内存信息,可从分配点o开始构建VFG。
6)提取每个分配点每条路径的内存泄漏特征,,每条路径提取的特征组成一个向量,所有路径的向量构成测试集。如图3所示。
7)将测试集进行预处理,调整为符合分类器模型的输入格式,输入到分类器模型中,获取分类检测结果即漏洞报告。
以上所述仅为本发明的实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构替换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的权利要求保护范围内。
Claims (4)
1.一种基于机器学习的C程序内存泄漏智能化检测方法,该方法分为三个阶段:模型构建阶段,程序分析与特征获取阶段,缺陷检测与报告阶段;其特征在于:模型构建阶段,首先根据已有的内存泄漏构建两个数据集,一个是包含真正的内存泄漏的数据集,另一个是包含虚假的内存泄漏的数据集,然后分别从两个数据中提取内存泄漏特征,将内存泄漏特征输入机器学习的分类器进行训练,并进行交叉验证,然后修改分类器类型及参数,保留分类准确率达到设定目标值的分类器,从保留的分类器中选取分类准确率最高的作为分类器模型来检测内存泄漏;程序分析与特征获取阶段,首先对源程序进行预分析,获取所有的内存分配点o,然后进行指针分析,构建从o开始的VFG,提取VFG中每条路径对应的内存泄漏特征;缺陷检测与报告阶段,将程序分析与特征获取阶段的内存泄漏特征输入到模型构建阶段的分类器模型中进行检测,判断从o开始的路径中是否存在内存泄漏,得到内存泄漏报告;
该方法包括以下步骤:
步骤1)根据已有的内存泄漏构建两个数据集,一个是包含真正的内存泄漏的数据集,另一个是包含虚假的内存泄漏的数据集;
步骤2)提取内存泄漏特征;内存泄漏特征包括两类:类型信息以及指针信息;
步骤3)构建分类器模型,具体步骤如下:
步骤3.1)将提取的内存泄漏特征作为训练集输入到分类器中;
步骤3.2)在训练过程中进行交叉验证,查看分类器分类的准确率;
步骤3.3)调整分类器参数,重复3.1,3.2步骤,若分类准确率超过设定目标值,则记录当前分类器的类型、参数及其准确率;
步骤3.4)调整分类器的类型,重复3.1,3.2,3.3步骤;
步骤3.5)在当前记录的分类器中选取准确率最高的分类器类型及参数,确定唯一的分类器模型;
步骤4)程序预分析,具体步骤如下:
步骤4.1)对于需要检测的C程序,将其转化为LLVM的中间码.bc文件;
步骤4.2)在LLVM中间码上获取所有的内存分配点o;
步骤5)程序指针分析,具体步骤如下:
步骤5.1)对每个函数使用流不敏感、上下文不敏感、域敏感以及调用点敏感的安德森指针分析,获取每个指针指向的内存区域集合;每个指针的指向集用ps表示,格式如下:
ps(v)={o,o′}
v表示指针变量,ps(v)表示指针v指向的内存区域,{o,o′}表示内存区域o和o′的集合;
步骤5.2)获取基于SSA的内存信息;在安德森指针分析之后,获取所有指针变量的def和use;对于函数调用点,分析不在本函数内部但是可以在本函数内部修改读取的非全局指针变量,然后生成指针变量指向的内部区域,构建每个函数SSA形式;
步骤5.3)构建每个分配点o的VFG;已知每个指针的指向内存区域集合ps(v)和基于SSA的内存信息,可从分配点o开始构建VFG;
步骤6)提取每个分配点每条路径的内存泄漏特征,每条路径提取的特征组成一个向量,所有路径的向量构成测试集;
步骤7)将测试集进行预处理,调整为符合分类器模型的输入格式,输入到分类器模型中,获取分类检测结果即漏洞报告。
2.根据权利要求1所述的基于机器学习的C程序内存泄漏智能化检测方法,其特征在于:根据常见的C程序内存泄漏特征,本方法能够检测C程序中的内存泄漏。
3.根据权利要求1所述的基于机器学习的C程序内存泄漏智能化检测方法,其特征在于:本方法在逐步增加训练集后,分类器结果会更加准确。
4.根据权利要求1所述的基于机器学习的C程序内存泄漏智能化检测方法,其特征在于:使用程序静态分析方法提取内存泄漏特征,不实际运行程序,消耗时间短,能够快速检测大型程序中的内存泄漏。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810613423.9A CN108804332B (zh) | 2018-06-14 | 2018-06-14 | 一种基于机器学习的c程序内存泄漏智能化检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810613423.9A CN108804332B (zh) | 2018-06-14 | 2018-06-14 | 一种基于机器学习的c程序内存泄漏智能化检测方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108804332A CN108804332A (zh) | 2018-11-13 |
CN108804332B true CN108804332B (zh) | 2021-12-17 |
Family
ID=64086031
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810613423.9A Active CN108804332B (zh) | 2018-06-14 | 2018-06-14 | 一种基于机器学习的c程序内存泄漏智能化检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108804332B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020227883A1 (zh) * | 2019-05-13 | 2020-11-19 | 云图有限公司 | 一种数据处理方法、装置及系统 |
CN111104335B (zh) * | 2019-12-25 | 2021-08-24 | 清华大学 | 一种基于多层次分析的c语言缺陷检测方法及装置 |
CN112463603A (zh) * | 2020-11-25 | 2021-03-09 | 北京达佳互联信息技术有限公司 | 内存泄漏的检测方法、装置、终端及存储介质 |
CN113326187B (zh) * | 2021-05-25 | 2023-11-24 | 扬州大学 | 数据驱动的内存泄漏智能化检测方法及系统 |
CN114282226B (zh) * | 2021-12-31 | 2024-05-28 | 上海交通大学 | 单次多漏洞代码检测方法及系统 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107102909A (zh) * | 2017-03-17 | 2017-08-29 | 北京航空航天大学 | 一种面向复杂软件密集型系统的故障分类方法 |
-
2018
- 2018-06-14 CN CN201810613423.9A patent/CN108804332B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107102909A (zh) * | 2017-03-17 | 2017-08-29 | 北京航空航天大学 | 一种面向复杂软件密集型系统的故障分类方法 |
Non-Patent Citations (2)
Title |
---|
Semantics-based memory leak detection for C programs;Zhiqiang Liu 等;《2015 12th International Conference on Fuzzy Systems and Knowledge Discovery (FSKD)》;20150817;全文 * |
内存泄露静态检测模型;柯平 等;《计算机科学》;20090415;第36卷(第4期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN108804332A (zh) | 2018-11-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108804332B (zh) | 一种基于机器学习的c程序内存泄漏智能化检测方法 | |
CN107808098B (zh) | 一种模型安全检测方法、装置以及电子设备 | |
CN104123500B (zh) | 一种基于深度学习的Android平台恶意应用检测方法及装置 | |
CN114819186A (zh) | 构建gbdt模型的方法、装置及预测方法、装置 | |
CN110598687A (zh) | 车辆识别码的检测方法、装置及计算机设备 | |
US20200065664A1 (en) | System and method of measuring the robustness of a deep neural network | |
CN109685104B (zh) | 一种识别模型的确定方法和装置 | |
CN113326187A (zh) | 数据驱动的内存泄漏智能化检测方法及系统 | |
CN111079861A (zh) | 一种基于图像快速处理技术的配电网电压异常诊断方法 | |
CN110750297B (zh) | 一种基于程序分析和文本分析的Python代码参考信息生成方法 | |
CN116150757A (zh) | 一种基于cnn-lstm多分类模型的智能合约未知漏洞检测方法 | |
KR102546340B1 (ko) | 노이즈 필터를 이용한 이상치 탐지 방법 및 장치 | |
CN113468524B (zh) | 基于rasp的机器学习模型安全检测方法 | |
Hashemi et al. | Runtime monitoring for out-of-distribution detection in object detection neural networks | |
CN114285587A (zh) | 域名鉴别方法和装置、域名分类模型的获取方法和装置 | |
CN112257757A (zh) | 一种基于深度学习的恶意样本检测方法及系统 | |
CN111985936A (zh) | 一种商户证件信息的检验方法、装置及设备 | |
CN115578796A (zh) | 一种活体检测模型的训练方法、装置、设备及介质 | |
CN110879832A (zh) | 目标文本检测方法、模型训练方法、装置及设备 | |
CN116401670A (zh) | 一种无源码场景下的漏洞补丁存在性检测方法及系统 | |
CN115619496A (zh) | 一种电商产品精准推送方法及服务器 | |
CN112433952B (zh) | 深度神经网络模型公平性测试方法、系统、设备及介质 | |
CN115424000A (zh) | 一种指针式仪表识别方法、系统、设备及存储介质 | |
Hagn et al. | Validation of pedestrian detectors by classification of visual detection impairing factors | |
CN114443834A (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 |