内存泄露的确定方法、存储介质、确定装置和电子设备与流程

未命名 09-10 阅读:81 评论:0


1.本技术实施例涉及计算机领域,具体而言,涉及一种内存泄露的确定方法、内存泄露的确定装置、计算机可读存储介质和电子设备。


背景技术:

2.开发人员在接到功能开发需求后,开发的整个过程一般分为如下几个步骤:确定功能需求,功能模块代码撰写,功能模块自测和功能验收,然而并在一些功能开发时,功能模块代码撰写经常存在一些功能模块申请内存,却一直未能释放,这就会导致服务器可用内存越来越小,长时间的内存泄露可能导致机器死机,重启等严重事故。
3.现有技术中针对上述情形,暂无解决方案。


技术实现要素:

4.本技术实施例提供了一种内存泄露的确定方法、内存泄露的确定装置、计算机可读存储介质和电子设备,以至少解决现有技术中无法确定代码中是否存在内存泄露的问题。
5.根据本技术的一个实施例,提供了一种内存泄露的确定方法,所述方法包括:获取目标代码,所述目标代码为最新上传至分布式版本控制系统的代码;从所述目标代码中,获取多个第一目标函数和多个第二目标函数,所述第一目标函数为用于分配内存空间的函数,所述第二目标函数为用于释放内存空间的函数;至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露。
6.在一个示例性实施例中,至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露,包括:确定是否存在与各所述第一目标函数对应的所述第二目标函数,所述第二目标函数用于释放与所述第二目标函数对应的所述第一目标函数分配的内存空间;在至少一个所述第一目标函数不存在与所述第一目标函数对应的所述第二目标函数的情况下,确定所述目标代码存在内存泄露。
7.在一个示例性实施例中,所述目标代码包括函数体,所述函数体包括多个所述第一目标函数,确定是否存在与各所述第一目标函数对应的所述第二目标函数,包括:确定第一函数体中是否存在中断语句,所述中断语句用于在所述第一函数体执行的过程中中断执行所述第一函数体;在所述第一函数体中存在所述中断语句的情况下,确定所述第一函数体和第二函数体之间是否存在与各所述第一目标函数对应的所述第二目标函数,所述第一目标函数的返回值和对应的所述第二目标函数的参数相同,所述第一函数体和所述第二函数体按照预设顺序执行,所述预设顺序为所述第一函数体、所述第二函数体。
8.在一个示例性实施例中,所述目标代码包括函数体,所述函数体包括多个所述第一目标函数,确定是否存在与各所述第一目标函数对应的所述第二目标函数,包括:确定第一数量与第二数量是否相等,所述第一数量为所述函数体中的所述第一目标函数的数量,所述第二数量为所述函数体中的所述第二目标函数的数量;在所述第一数量和所述第二数
量相等的情况下,确定所述函数体中是否存在与各所述第一目标函数对应的所述第二目标函数,所述第一目标函数的返回值和对应的所述第二目标函数的参数相同。
9.在一个示例性实施例中,至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露,包括:在各所述第一目标函数均存在对应的所述第二目标函数的情况下,执行所述目标代码;在所述目标代码执行完毕的情况下,获取第一内存容量,所述第一内存容量为所述目标代码执行完毕时内存中未被占用的内存空间的大小;再次执行所述目标代码;在再次执行所述目标代码完毕的情况下,获取第二内存容量,所述第二内存容量为所述目标代码再次执行完毕时所述内存中未被占用的内存空间的大小;获取内存容量差值,所述内存容量差值为所述第一内存容量和所述第二内存容量的差值;在所述内存容量差值大于预设内存容量差值的情况下,确定所述目标代码存在内存泄露。
10.在一个示例性实施例中,至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露,包括:在各所述第一目标函数均存在对应的所述第二目标函数的情况下,执行所述目标代码;在所述目标代码执行完毕的情况下,获取多个第一内存地址,所述第一内存地址为所述目标代码执行完毕时内存中未被占用的内存空间的地址;再次执行所述目标代码;在再次执行所述目标代码完毕的情况下,获取多个第二内存地址,所述第二内存地址为所述目标代码再次执行完毕时所述内存中未被占用的内存空间的地址;确定各所述第一内存地址是否存在对应的所述第二内存地址,所述第一内存地址和对应的所述第二内存地址相同;在至少一个所述第一内存地址不存在对应的所述第二内存地址的情况下,确定所述目标代码存在内存泄露。
11.在一个示例性实施例中,在至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露之后,所述方法还包括:在确定所述目标代码存在内存泄露的情况下,获取第一漏洞信息,所述第一漏洞信息包括第三目标函数的名称和所述第三目标函数所在的函数体的名称,所述第三目标函数为不存在对应的所述第二目标函数的所述第一目标函数;将所述第一漏洞信息发送至云端服务器。
12.根据本技术的另一个实施例,提供了内存泄露的确定装置,所述装置包括:第一获取模块,用于获取目标代码,所述目标代码为最新上传至分布式版本控制系统的代码;第二获取模块,用于从所述目标代码中,获取多个第一目标函数和多个第二目标函数,所述第一目标函数为用于分配内存空间的函数,所述第二目标函数为用于释放内存空间的函数;确定模块,用于至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露。
13.根据本技术的再一个实施例,提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序被处理器执行时实现任一种中所述的方法的步骤。
14.根据本技术的又一个实施例,提供了一种电子设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现任一种中所述的方法的步骤。
15.通过本技术,从目标代码中获取用于分配内存空间的函数和用于释放内存空间的函数,根据目标代码中用于分配内存空间的函数,确定目标代码使用内存空间的情况,根据
目标代码中用于释放内存空间的函数确定目标代码释放内存空间的情况,进而确定是否存在分配的内存空间没有被释放的情况,从而确定目标代码是否存在内存泄露,解决了现有技术中无法确定代码中是否存在内存泄露的问题,达到了提高内存的安全性的效果。
附图说明
16.图1是根据本技术实施例的一种内存泄露的确定方法的移动终端的硬件结构框图;
17.图2是根据本技术实施例的一种内存泄露的确定方法的流程图;
18.图3是根据本技术实施例的另一种内存泄露的确定方法的流程图;
19.图4是根据本技术实施例的一种内存泄露的确定装置的结构框图。
具体实施方式
20.下文中将参考附图并结合实施例来详细说明本技术的实施例。
21.需要说明的是,本技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。
22.内存泄露:指的是程序中已经不再需要使用的内存没有被释放,导致系统中出现了一些无用的占用空间,并且随着时间的推移,这些无用的占用空间会越来越多,最终可能会导致系统崩溃、缓慢或者运行异常。
23.分布式版本控制系统(git仓库,global information tracker):可以有效、高速地处理从很小到非常大的项目版本管理,目前国内大多数公司代码都是由git仓库进行管理,git仓库可以提供开发者将最新的代码上传,也可以支持每个开发者通过克隆,在本地机器上拷贝一个完整的git仓库。
24.jenkins:是一个开源软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。jenkins是一个自动构建过程,包括自动编译、分发、部署和测试等。
25.commit分支:是git仓库中的一个概念,它表示在开发过程中创建的单独代码分支,每个commit分支都包含一系列代码提交,这些提交记录了对项目进行的更改和修改。
26.本技术实施例中所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,图1是本技术实施例的一种内存泄露的确定方法的移动终端的硬件结构框图。如图1所示,移动终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理装置)和用于存储数据的存储器104,其中,上述移动终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比图1中所示更多或者更少的组件,或者具有与图1所示不同的配置。
27.存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本技术实施例中的内存泄露的确定方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、
或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
28.传输设备106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括移动终端的通信供应商提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(network interface controller,简称为nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(radio frequency,简称为rf)模块,其用于通过无线方式与互联网进行通讯。
29.在本实施例中提供了一种运行于上述移动终端的方法,图2是根据本技术实施例的流程图,如图2所示,该流程包括如下步骤:
30.步骤s202,获取目标代码,上述目标代码为最新上传至分布式版本控制系统的代码;
31.具体地,在一些实施方式中,上述分布式版本控制系统为git仓库,上述目标代码为最新的commit分支,上述移动终端上运行有jenkins,jenkins检测到git仓库中的代码更新后,自动获取最新的commit分支。
32.步骤s204,从上述目标代码中,获取多个第一目标函数和多个第二目标函数,上述第一目标函数为用于分配内存空间的函数,上述第二目标函数为用于释放内存空间的函数;
33.具体地,在一些实施方式中,上述第一目标函数为malloc函数、calloc函数、realloc函数等申请内存的函数,上述第二目标函数为free函数等释放内存的函数,在自动获取目标代码之后,对目标代码进行扫描,抓取目标代码中的malloc函数、calloc函数、realloc函数等申请内存的函数以及free函数等释放内存的函数。
34.步骤s206,至少根据各上述第一目标函数和各上述第二目标函数,确定上述目标代码是否存在内存泄露。
35.具体地,在一些实施方式中,上述第一目标函数为malloc函数、calloc函数、realloc函数等申请内存空间的函数,上述第二目标函数为free函数等释放内存空间的函数,根据malloc函数、calloc函数、realloc函数等申请内存空间的函数确定目标代码使用内存空间的情况,根据free函数等释放内存空间的函数确定目标代码释放内存空间的情况,进而确定是否存在分配的内存空间没有被释放的情况,从而确定目标代码是否存在内存泄露。
36.上述目标代码包括函数体,上述步骤s206可以实现为:
37.步骤s2061,确定是否存在与各上述第一目标函数对应的上述第二目标函数,上述第二目标函数用于释放与上述第二目标函数对应的上述第一目标函数分配的内存空间;
38.上述目标代码包括函数体,上述函数体包括多个上述第一目标函数,上述步骤s2061可以实现为:
39.确定第一数量与第二数量是否相等,上述第一数量为上述函数体中的上述第一目标函数的数量,上述第二数量为上述函数体中的上述第二目标函数的数量;
40.在上述第一数量和上述第二数量相等的情况下,确定上述函数体中是否存在与各上述第一目标函数对应的上述第二目标函数,上述第一目标函数的返回值和对应的上述第
二目标函数的参数相同。
41.本实施例中,在本技术中,首先,确定函数体中第一目标函数的数量与第二目标函数的数量是否相同,若不同,确定至少一个第一目标函数分配的内存空间没有被释放,直接确定目标代码存在内存泄露,以提高内存泄露的检测速度,若相同,确定函数体中的各第一目标函数是否存在对应的第二目标函数,以确定在函数体执行完毕时各第一目标函数分配的内存空间是否均被释放,在一些实施方式中,目标代码中存在malloc函数,若目标代码中存在一个参数与该malloc函数返回值相同的free函数,确定目标代码中存在与该malloc函数对应的free函数。
42.上述目标代码包括函数体,上述函数体包括多个上述第一目标函数,
43.上述步骤s2061可以实现为:
44.确定上述第一函数体中是否存在中断语句,上述中断语句用于在上述第一函数体执行的过程中中断执行上述第一函数体;
45.在上述第一函数体中存在上述中断语句的情况下,确定上述第一函数体和上述第二函数体之间是否存在与各上述第一目标函数对应的上述第二目标函数,上述第一目标函数的返回值和对应的上述第二目标函数的参数相同,上述第一函数体和上述第二函数体按照预设顺序执行,上述预设顺序为上述第一函数体、上述第二函数体。
46.本实施例中,考虑到目标代码中的第一函数体中存在中断语句,在一些实施方式中第一函数体中存在malloc函数、calloc函数、realloc函数,确定第二函数体和第一函数体之间是否存在malloc函数对应的free函数,calloc函数对应的free函数,realloc函数对应的free函数,从而确定执行第一函数体中的中断语句之后,执行第二函数体之前,是否释放掉malloc函数、calloc函数、realloc函数分配的内存空间。
47.步骤s2062,在至少一个上述第一目标函数不存在与上述第一目标函数对应的上述第二目标函数的情况下,确定上述目标代码存在内存泄露。
48.本实施例中,在一些实施方式中,上述目标代码中存在malloc函数和calloc函数,确定上述目标代码中是否存在与malloc函数对应的free函数,确定上述目标代码是否存在与calloc函数对应的free函数,若上述目标代码不存在与malloc函数对应的free函数,确定上述目标代码没有释放掉malloc函数分配的内存空间,上述目标代码存在内存泄露,在上述目标代码中不存在与calloc函数对应的free函数,确定上述目标代码没有释放掉calloc函数分配的内存空间,上述目标代码存在内存泄露。
49.上述步骤s206可以实现为:
50.在各上述第一目标函数均存在对应的上述第二目标函数的情况下,执行上述目标代码;
51.在上述目标代码执行完毕的情况下,获取第一内存容量,上述第一内存容量为上述目标代码执行完毕时内存中未被占用的内存空间的大小;
52.再次执行上述目标代码;
53.在再次执行上述目标代码完毕的情况下,获取第二内存容量,上述第二内存容量为上述目标代码再次执行完毕时上述内存中未被占用的内存空间的大小;
54.获取内存容量差值,上述内存容量差值为上述第一内存容量和上述第二内存容量的差值;
55.在上述内存容量差值大于预设内存容量差值的情况下,确定上述目标代码存在内存泄露。
56.本实施例中,在各第一目标函数均存在对应的第二目标函数的情况下,初步确定目标代码不存在内存泄露,为了提高内存泄露检测的准确性,在一些实施方式中,在初步确定目标代码不存在内存泄露的情况下,执行两次目标代码,确定执行两次目标代码后内存的容量是否减小,若减小,确定目标代码存在内存泄露,若未减小,确定目标代码不存在内存泄露。
57.上述步骤s206可以实现为:
58.在各上述第一目标函数均存在对应的上述第二目标函数的情况下,执行上述目标代码;
59.在上述目标代码执行完毕的情况下,获取多个第一内存地址,上述第一内存地址为上述目标代码执行完毕时内存中未被占用的内存空间的地址;
60.再次执行上述目标代码;
61.在再次执行上述目标代码完毕的情况下,获取多个第二内存地址,上述第二内存地址为上述目标代码再次执行完毕时上述内存中未被占用的内存空间的地址;
62.确定各上述第一内存地址是否存在对应的上述第二内存地址,上述第一内存地址和对应的上述第二内存地址相同;
63.在至少一个上述第一内存地址不存在对应的上述第二内存地址的情况下,确定上述目标代码存在内存泄露。
64.本实施例中,在各第一目标函数均存在对应的第二目标函数的情况下,初步确定目标代码不存在内存泄露,为了提高内存泄露检测的准确性,在一些实施方式中,在初步确定目标代码不存在内存泄露的情况下,执行两次目标代码,对比执行两次目标代码后未被占用的内存空间的地址,确定相比于首次执行目标代码,再次执行目标代码后是否又有内存空间被占用,若有,确定目标代码存在内存泄露,若没有,确定目标代码不存在内存泄露,在一些实施方式中,一个上述第一内存地址和一个上述第二内存地址均代表一个内存单元的地址,一个内存单元为一个字节的存储空间的地址。
65.在上述步骤s206之后,上述方法还包括:
66.在确定上述目标代码存在内存泄露的情况下,获取第一漏洞信息,上述第一漏洞信息包括第三目标函数的名称和上述第三目标函数所在的函数体的名称,上述第三目标函数为不存在对应的上述第二目标函数的上述第一目标函数;
67.将上述第一漏洞信息发送至云端服务器。
68.本实施例中,在一些实施方式中,在确定目标代码存在内存泄露的情况下,将没有对应的第二目标函数的第一目标函数的名称和该第一目标函数所在的函数体的名称发送至云端服务器,使程序修改人员能够确定目标代码中发生内存泄露的位置,以方便程序修改人员修改目标代码。
69.在上述步骤s206之后,上述方法还包括:
70.在确定上述目标代码存在内存泄露的情况下,获取第二漏洞信息,上述第二漏洞信息包括第三内存地址,上述第三内存地址为不存在对应的上述第二内存地址的上述第一内存地址;
71.将上述第二漏洞信息发送至云端服务器。
72.本实施例中,在一些实施方式中,在确定目标代码存在内存泄露的情况下,将没有对应的第二内存地址的第一内存地址发送至云端服务器,使程序修改人员释放掉内存泄露导致占用的内存空间。
73.通过上述步骤,从目标代码中获取用于分配内存空间的函数和用于释放内存空间的函数,根据目标代码中用于分配内存空间的函数,确定目标代码使用内存空间的情况,根据目标代码中用于释放内存空间的函数确定目标代码释放内存空间的情况,进而确定是否存在分配的内存空间没有被释放的情况,从而确定目标代码是否存在内存泄露,解决了现有技术中无法确定代码中是否存在内存泄露的问题,提高了内存的安全性。
74.其中,上述步骤的执行主体可以为终端等,但不限于此。
75.为了使得本领域技术人员能够更加清楚地了解本技术的技术方案,以下将结合具体的实施例对本技术的内存泄露的确定方法的实现过程进行详细说明。
76.本实施例涉及一种具体内存泄露的确定方法,如图3所示,包括如下步骤:
77.步骤s1:获取目标代码,上述目标代码为最新上传至分布式版本控制系统的代码;
78.步骤s2:扫描目标代码,获取第一目标函数和第二目标函数:
79.从上述目标代码中,获取多个第一目标函数和多个第二目标函数,上述第一目标函数为用于分配内存空间的函数,上述第二目标函数为用于释放内存空间的函数;
80.步骤s3:初次确定是否存在内存泄露:
81.确定是否存在与各上述第一目标函数对应的上述第二目标函数;
82.步骤s4:在至少一个上述第一目标函数不存在与上述第一目标函数对应的上述第二目标函数的情况下,确定上述目标代码存在内存泄露;
83.在确定上述目标代码存在内存泄露的情况下,获取第一漏洞信息,上述第一漏洞信息包括第三目标函数的名称和上述第三目标函数所在的函数体的名称,上述第三目标函数为不存在对应的上述第二目标函数的上述第一目标函数;
84.将上述第一漏洞信息发送至云端服务器;
85.步骤s5:执行目标代码,获取第一内存容量和第二内存容量:
86.在各上述第一目标函数均存在对应的上述第二目标函数的情况下,执行上述目标代码;
87.在上述目标代码执行完毕的情况下,获取第一内存容量,上述第一内存容量为上述目标代码执行完毕时内存中未被占用的内存空间的大小;
88.再次执行上述目标代码;
89.在再次执行上述目标代码完毕的情况下,获取第二内存容量,上述第二内存容量为上述目标代码再次执行完毕时上述内存中未被占用的内存空间的大小;
90.步骤s6:再次确定是否存在内存泄露:
91.确定获取内存容量差值,上述内存容量差值为上述第一内存容量和上述第二内存容量的差值;
92.在上述内存容量差值大于预设内存容量差值的情况下,确定上述目标代码存在内存泄露;
93.在确定上述目标代码存在内存泄露的情况下,获取第二漏洞信息,上述第二漏洞
信息包括第三内存地址,上述第三内存地址为不存在对应的上述第二内存地址的上述第一内存地址;
94.将上述第二漏洞信息发送至云端服务器;
95.步骤s7:在确定上述目标代码不存在内存泄露的情况下,重新获取目标代码,重新确定目标代码是否存在内存泄露。
96.需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
97.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)执行本技术各个实施例上述的方法。
98.在本实施例中还提供了一种内存泄露的确定装置,该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
99.图4是根据本技术实施例的内存泄露的确定装置的结构框图,如图4所示,该装置包括第一获取模块22、第二获取模块24和确定模块26,
100.上述第一获取模块22,用于获取目标代码,上述目标代码为最新上传至分布式版本控制系统的代码;
101.具体地,在一些实施方式中,上述分布式版本控制系统为git仓库,上述目标代码为最新的commit分支,上述移动终端上运行有jenkins,jenkins检测到git仓库中的代码更新后,自动获取最新的commit分支。
102.上述第二获取模块24,用于从上述目标代码中,获取多个第一目标函数和多个第二目标函数,上述第一目标函数为用于分配内存空间的函数,上述第二目标函数为用于释放内存空间的函数;
103.具体地,在一些实施方式中,上述第一目标函数为malloc函数、calloc函数、realloc函数等申请内存的函数,上述第二目标函数为free函数等释放内存的函数,在自动获取目标代码之后,对目标代码进行扫描,抓取目标代码中的malloc函数、calloc函数、realloc函数等申请内存的函数以及free函数等释放内存的函数。
104.上述确定模块26,用于至少根据各上述第一目标函数和各上述第二目标函数,确定上述目标代码是否存在内存泄露。
105.具体地,在一些实施方式中,上述第一目标函数为malloc函数、calloc函数、realloc函数等申请内存空间的函数,上述第二目标函数为free函数等释放内存空间的函数,根据malloc函数、calloc函数、realloc函数等申请内存空间的函数确定目标代码使用内存空间的情况,根据free函数等释放内存空间的函数确定目标代码释放内存空间的情况,进而确定是否存在分配的内存空间没有被释放的情况,从而确定目标代码是否存在内
存泄露。
106.上述目标代码包括函数体,上述确定模块包括第一确定子模块和第二确定子模块,
107.上述第一确定子模块,用于确定是否存在与各上述第一目标函数对应的上述第二目标函数,上述第二目标函数用于释放与上述第二目标函数对应的上述第一目标函数分配的内存空间;
108.上述目标代码包括函数体,上述函数体包括多个上述第一目标函数,上述第一确定子模块包括第一确定单元和第二确定单元,
109.上述第一确定单元,用于确定第一数量与第二数量是否相等,上述第一数量为上述函数体中的上述第一目标函数的数量,上述第二数量为上述函数体中的上述第二目标函数的数量;
110.上述第二确定单元,用于在上述第一数量和上述第二数量相等的情况下,确定上述函数体中是否存在与各上述第一目标函数对应的上述第二目标函数,上述第一目标函数的返回值和对应的上述第二目标函数的参数相同。
111.本实施例中,在本技术中,首先,确定函数体中第一目标函数的数量与第二目标函数的数量是否相同,若不同,确定至少一个第一目标函数分配的内存空间没有被释放,直接确定目标代码存在内存泄露,以提高内存泄露的检测速度,若相同,确定函数体中的各第一目标函数是否存在对应的第二目标函数,以确定在函数体执行完毕时各第一目标函数分配的内存空间是否均被释放,在一些实施方式中,目标代码中存在malloc函数,若目标代码中存在一个参数与该malloc函数返回值相同的free函数,确定目标代码中存在与该malloc函数对应的free函数。
112.上述目标代码包括函数体,上述函数体包括多个上述第一目标函数,上述第一确定子模块还包括第三确定单元和第四确定单元,
113.上述第三确定单元,用于确定上述第一函数体中是否存在中断语句,上述中断语句用于在上述第一函数体执行的过程中中断执行上述第一函数体;
114.上述第四确定单元,用于在上述第一函数体中存在上述中断语句的情况下,确定上述第一函数体和上述第二函数体之间是否存在与各上述第一目标函数对应的上述第二目标函数,上述第一目标函数的返回值和对应的上述第二目标函数的参数相同,上述第一函数体和上述第二函数体按照预设顺序执行,上述预设顺序为上述第一函数体、上述第二函数体。
115.本实施例中,考虑到目标代码中的第一函数体中存在中断语句,在一些实施方式中第一函数体中存在malloc函数、calloc函数、realloc函数,确定第二函数体和第一函数体之间是否存在malloc函数对应的free函数,calloc函数对应的free函数,realloc函数对应的free函数,从而确定执行第一函数体中的中断语句之后,执行第二函数体之前,是否释放掉malloc函数、calloc函数、realloc函数分配的内存空间。
116.上述第二确定子模块,用于在至少一个上述第一目标函数不存在与上述第一目标函数对应的上述第二目标函数的情况下,确定上述目标代码存在内存泄露。
117.本实施例中,在一些实施方式中,上述目标代码中存在malloc函数和calloc函数,确定上述目标代码中是否存在与malloc函数对应的free函数,确定上述目标代码是否存在
与calloc函数对应的free函数,若上述目标代码不存在与malloc函数对应的free函数,确定上述目标代码没有释放掉malloc函数分配的内存空间,上述目标代码存在内存泄露,在上述目标代码中不存在与calloc函数对应的free函数,确定上述目标代码没有释放掉calloc函数分配的内存空间,上述目标代码存在内存泄露。
118.上述确定模块还包括第一处理子模块、第一获取子模块、第二处理子模块、第二获取子模块、第三获取子模块和第三确定子模块,
119.上述第一处理子模块,用于在各上述第一目标函数均存在对应的上述第二目标函数的情况下,执行上述目标代码;
120.上述第一获取子模块,用于在上述目标代码执行完毕的情况下,获取第一内存容量,上述第一内存容量为上述目标代码执行完毕时内存中未被占用的内存空间的大小;
121.上述第二处理子模块,用于再次执行上述目标代码;
122.上述第二获取子模块,用于在再次执行上述目标代码完毕的情况下,获取第二内存容量,上述第二内存容量为上述目标代码再次执行完毕时上述内存中未被占用的内存空间的大小;
123.上述第三获取子模块,用于获取内存容量差值,上述内存容量差值为上述第一内存容量和上述第二内存容量的差值;
124.上述第三确定子模块,用于在上述内存容量差值大于预设内存容量差值的情况下,确定上述目标代码存在内存泄露。
125.本实施例中,在各第一目标函数均存在对应的第二目标函数的情况下,初步确定目标代码不存在内存泄露,为了提高内存泄露检测的准确性,在一些实施方式中,在初步确定目标代码不存在内存泄露的情况下,执行两次目标代码,确定执行两次目标代码后内存的容量是否减小,若减小,确定目标代码存在内存泄露,若未减小,确定目标代码不存在内存泄露。
126.上述确定模块还包括第三处理子模块、第四获取子模块、第四处理子模块、第五获取子模块、第六获取子模块和第四确定子模块,
127.上述第三处理子模块,用于在各上述第一目标函数均存在对应的上述第二目标函数的情况下,执行上述目标代码;
128.上述第四获取子模块,用于在上述目标代码执行完毕的情况下,获取多个第一内存地址,上述第一内存地址为上述目标代码执行完毕时内存中未被占用的内存空间的地址;
129.上述第四处理子模块,用于再次执行上述目标代码;
130.上述第五获取子模块,用于在再次执行上述目标代码完毕的情况下,获取多个第二内存地址,上述第二内存地址为上述目标代码再次执行完毕时上述内存中未被占用的内存空间的地址;
131.上述第六获取子模块,用于确定各上述第一内存地址是否存在对应的上述第二内存地址,上述第一内存地址和对应的上述第二内存地址相同;
132.上述第四确定子模块,用于在至少一个上述第一内存地址不存在对应的上述第二内存地址的情况下,确定上述目标代码存在内存泄露。
133.本实施例中,在各第一目标函数均存在对应的第二目标函数的情况下,初步确定
目标代码不存在内存泄露,为了提高内存泄露检测的准确性,在一些实施方式中,在初步确定目标代码不存在内存泄露的情况下,执行两次目标代码,对比执行两次目标代码后未被占用的内存空间的地址,确定相比于首次执行目标代码,再次执行目标代码后是否又有内存空间被占用,若有,确定目标代码存在内存泄露,若没有,确定目标代码不存在内存泄露,在一些实施方式中,一个上述第一内存地址和一个上述第二内存地址均代表一个内存单元的地址,一个内存单元为一个字节的存储空间的地址。
134.上述装置还包括第三获取模块和第一发送模块,
135.上述第三获取模块,用于在确定上述目标代码存在内存泄露的情况下,获取第一漏洞信息,上述第一漏洞信息包括第三目标函数的名称和上述第三目标函数所在的函数体的名称,上述第三目标函数为不存在对应的上述第二目标函数的上述第一目标函数;
136.上述第一发送模块,用于将上述第一漏洞信息发送至云端服务器。
137.本实施例中,在一些实施方式中,在确定目标代码存在内存泄露的情况下,将没有对应的第二目标函数的第一目标函数的名称和该第一目标函数所在的函数体的名称发送至云端服务器,使程序修改人员能够确定目标代码中发生内存泄露的位置,以方便程序修改人员修改目标代码。
138.上述装置还包括第四获取模块和第二发送模块,
139.上述第四获取模块,用于在确定上述目标代码存在内存泄露的情况下,获取第二漏洞信息,上述第二漏洞信息包括第三内存地址,上述第三内存地址为不存在对应的上述第二内存地址的上述第一内存地址;
140.上述第二发送模块,用于将上述第二漏洞信息发送至云端服务器。
141.本实施例中,在一些实施方式中,在确定目标代码存在内存泄露的情况下,将没有对应的第二内存地址的第一内存地址发送至云端服务器,使程序修改人员释放掉内存泄露导致占用的内存空间。
142.通过上述步骤,从目标代码中获取用于分配内存空间的函数和用于释放内存空间的函数,根据目标代码中用于分配内存空间的函数,确定目标代码使用内存空间的情况,根据目标代码中用于释放内存空间的函数确定目标代码释放内存空间的情况,进而确定是否存在分配的内存空间没有被释放的情况,从而确定目标代码是否存在内存泄露,解决了现有技术中无法确定代码中是否存在内存泄露的问题,提高了内存的安全性。
143.需要说明的是,上述各个模块是可以通过软件或硬件来实现的,对于后者,可以通过以下方式实现,但不限于此:上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。
144.本技术的实施例还提供了一种计算机可读存储介质,该计算机可读存储介质中存储有计算机程序,其中,该计算机程序被设置为运行时执行上述任一项方法实施例中的步骤。
145.在一个示例性实施例中,上述计算机可读存储介质可以包括但不限于:u盘、只读存储器(read-only memory,简称为rom)、随机存取存储器(random access memory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
146.本技术的实施例还提供了一种电子设备,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以执行上述任一项方法实施例中的步
骤。
147.在一个示例性实施例中,上述电子设备还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
148.本实施例中的具体示例可以参考上述实施例及示例性实施方式中所描述的示例,本实施例在此不再赘述。
149.显然,本领域的技术人员应该明白,上述的本技术的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本技术不限制于任何特定的硬件和软件结合。
150.以上所述仅为本技术的优选实施例而已,并不用于限制本技术,对于本领域的技术人员来说,本技术可以有各种更改和变化。凡在本技术的原则之内,所作的任何修改、等同替换、改进等,均应包含在本技术的保护范围之内。

技术特征:
1.一种内存泄露的确定方法,其特征在于,所述方法包括:获取目标代码,所述目标代码为最新上传至分布式版本控制系统的代码;从所述目标代码中,获取多个第一目标函数和多个第二目标函数,所述第一目标函数为用于分配内存空间的函数,所述第二目标函数为用于释放内存空间的函数;至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露。2.根据权利要求1所述的方法,其特征在于,至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露,包括:确定是否存在与各所述第一目标函数对应的所述第二目标函数,所述第二目标函数用于释放与所述第二目标函数对应的所述第一目标函数分配的内存空间;在至少一个所述第一目标函数不存在与所述第一目标函数对应的所述第二目标函数的情况下,确定所述目标代码存在内存泄露。3.根据权利要求2所述的方法,其特征在于,所述目标代码包括函数体,所述函数体包括多个所述第一目标函数,确定是否存在与各所述第一目标函数对应的所述第二目标函数,包括:确定第一函数体中是否存在中断语句,所述中断语句用于在所述第一函数体执行的过程中中断执行所述第一函数体;在所述第一函数体中存在所述中断语句的情况下,确定所述第一函数体和第二函数体之间是否存在与各所述第一目标函数对应的所述第二目标函数,所述第一目标函数的返回值和对应的所述第二目标函数的参数相同,所述第一函数体和所述第二函数体按照预设顺序执行,所述预设顺序为所述第一函数体、所述第二函数体。4.根据权利要求2所述的方法,其特征在于,所述目标代码包括函数体,所述函数体包括多个所述第一目标函数,确定是否存在与各所述第一目标函数对应的所述第二目标函数,包括:确定第一数量与第二数量是否相等,所述第一数量为所述函数体中的所述第一目标函数的数量,所述第二数量为所述函数体中的所述第二目标函数的数量;在所述第一数量和所述第二数量相等的情况下,确定所述函数体中是否存在与各所述第一目标函数对应的所述第二目标函数,所述第一目标函数的返回值和对应的所述第二目标函数的参数相同。5.根据权利要求1所述的方法,其特征在于,至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露,包括:在各所述第一目标函数均存在对应的所述第二目标函数的情况下,执行所述目标代码;在所述目标代码执行完毕的情况下,获取第一内存容量,所述第一内存容量为所述目标代码执行完毕时内存中未被占用的内存空间的大小;再次执行所述目标代码;在再次执行所述目标代码完毕的情况下,获取第二内存容量,所述第二内存容量为所述目标代码再次执行完毕时所述内存中未被占用的内存空间的大小;获取内存容量差值,所述内存容量差值为所述第一内存容量和所述第二内存容量的差
值;在所述内存容量差值大于预设内存容量差值的情况下,确定所述目标代码存在内存泄露。6.根据权利要求1所述的方法,其特征在于,至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露,包括:在各所述第一目标函数均存在对应的所述第二目标函数的情况下,执行所述目标代码;在所述目标代码执行完毕的情况下,获取多个第一内存地址,所述第一内存地址为所述目标代码执行完毕时内存中未被占用的内存空间的地址;再次执行所述目标代码;在再次执行所述目标代码完毕的情况下,获取多个第二内存地址,所述第二内存地址为所述目标代码再次执行完毕时所述内存中未被占用的内存空间的地址;确定各所述第一内存地址是否存在对应的所述第二内存地址,所述第一内存地址和对应的所述第二内存地址相同;在至少一个所述第一内存地址不存在对应的所述第二内存地址的情况下,确定所述目标代码存在内存泄露。7.根据权利要求1所述的方法,其特征在于,在至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露之后,所述方法还包括:在确定所述目标代码存在内存泄露的情况下,获取第一漏洞信息,所述第一漏洞信息包括第三目标函数的名称和所述第三目标函数所在的函数体的名称,所述第三目标函数为不存在对应的所述第二目标函数的所述第一目标函数;将所述第一漏洞信息发送至云端服务器。8.一种内存泄露的确定装置,其特征在于,所述装置包括:第一获取模块,用于获取目标代码,所述目标代码为最新上传至分布式版本控制系统的代码;第二获取模块,用于从所述目标代码中,获取多个第一目标函数和多个第二目标函数,所述第一目标函数为用于分配内存空间的函数,所述第二目标函数为用于释放内存空间的函数;确定模块,用于至少根据各所述第一目标函数和各所述第二目标函数,确定所述目标代码是否存在内存泄露。9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机程序,其中,所述计算机程序被处理器执行时实现所述权利要求1至7任一项中所述的方法的步骤。10.一种电子设备,其特征在于,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现所述权利要求1至7任一项中所述的方法的步骤。

技术总结
本申请实施例提供了一种内存泄露的确定方法、存储介质、确定装置和电子设备,其中,该方法包括:获取目标代码,目标代码为最新上传至分布式版本控制系统的代码;从目标代码中,获取多个第一目标函数和多个第二目标函数,第一目标函数为用于分配内存空间的函数,第二目标函数为用于释放内存空间的函数;至少根据各第一目标函数和各第二目标函数,确定目标代码是否存在内存泄露。通过本申请解决了现有技术中无法确定代码中是否存在内存泄露的问题,达到了提高内存的安全性的效果。到了提高内存的安全性的效果。到了提高内存的安全性的效果。


技术研发人员:薛凯 薛希文 张霄鹏
受保护的技术使用者:苏州浪潮智能科技有限公司
技术研发日:2023.06.16
技术公布日:2023/9/7
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐