一种内存越界的管理方法及装置转让专利

申请号 : CN201510747095.8

文献号 : CN106682492B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 师敏华曾宪铎张培良

申请人 : 大唐移动通信设备有限公司

摘要 :

本发明公开了一种内存越界的管理方法及装置,该方法为,在程序初始化时,在堆内存中设置内存池,内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。这样,通过设置隔离带,可以有效降低越界访问导致的其他内存块被篡改的风险。

权利要求 :

1.一种内存越界的管理方法,其特征在于,包括:

在程序初始化时,在堆内存中设置内存池,所述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;在每一个隔离带中分别写入预设的数据,其中,预设的数据为前后两个字节相同的;其中,在堆内存中设置内存池之前,进一步包括:将当前的待处理程序中的全局变量封装成至少一个结构体,且基于所述至少一个结构体中的每一个结构体分别定义相应的结构体指针;

在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。

2.如权利要求1所述的方法,其特征在于,将当前的待处理程序中的全局变量封装成至少一个结构体,具体包括:将当前的待处理程序中的所有全局变量封装成一个结构体;或,

分别将当前的待处理程序中的每一个功能模块包含的全局变量,封装成对应的结构体;或对当前的待处理程序中中的各个模块进行任意组合,分别将每一种组合包含的全局变量,封装成对应的结构体。

3.如权利要求1所述的方法,其特征在于,进一步包括:

分别设置每一个隔离带的大小。

4.如权利要求3所述的方法,其特征在于,所述每一个隔离带的大小是相同的。

5.如权利要求3或4所述的方法,其特征在于,进一步包括:

在内存池的起始位置设置一个内存池管理区;

分别对所述每一个隔离带中的数据进行定时监测,并在确定任意一个隔离带中的数据发生变化后,上报越界信息;其中,所述越界信息包括,内存池管理区中的管理信息及发生数据变化的隔离带的地址信息,其中,所述管理信息是发生数据变化的隔离带的相邻内存块的描述信息。

6.如权利要求5所述的方法,其特征在于,所述发生数据变化的隔离带的相邻内存块的描述信息中至少包括使用所述相邻内存块的参量在相应程序中的行号和对应的函数名。

7.一种内存越界的管理装置,其特征在于,包括:

设置单元,用于在程序初始化时,在堆内存中设置内存池,所述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;在每一个隔离带中分别写入预设的数据,其中,预设的数据为前后两个字节相同的;其中,在堆内存中设置内存池之前,进一步包括:定义单元,用于将当前的待处理程序中的全局变量封装成至少一个结构体,且基于所述至少一个结构体中的每一个结构体分别定义相应的结构体指针;

处理单元,用于在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。

8.如权利要求7所述的装置,其特征在于,将当前的待处理程序中的全局变量封装成至少一个结构体时,所述定义单元具体用于:将当前的待处理程序中的所有全局变量封装成一个结构体;或,

分别将当前的待处理程序中的每一个功能模块包含的全局变量,封装成对应的结构体;或对当前的待处理程序中中的各个模块进行任意组合,分别将每一种组合包含的全局变量,封装成对应的结构体。

9.如权利要求7所述的装置,其特征在于,所述设置单元进一步用于:分别设置每一个隔离带的大小。

10.如权利要求9所述的装置,其特征在于,所述每一个隔离带的大小是相同的。

11.如权利要求9或10所述的装置,其特征在于,所述设置单元进一步用于,在内存池的起始位置设置一个内存池管理区;

还包括,监测单元,用于分别对所述每一个隔离带中的数据进行定时监测,并在确定任意一个隔离带中的数据发生变化后,上报越界信息;其中,所述越界信息包括,内存池管理区中的管理信息及发生数据变化的隔离带的地址信息,其中,所述管理信息是发生数据变化的隔离带的相邻内存块的描述信息。

12.如权利要求11所述的装置,其特征在于,所述发生数据变化的隔离带的相邻内存块的描述信息中至少包括使用所述相邻内存块的参量在相应程序中的行号和对应的函数名。

说明书 :

一种内存越界的管理方法及装置

技术领域

[0001] 本发明涉及软件安全领域,尤其涉及一种内存越界的管理方法及装置。

背景技术

[0002] 在C程序中,内存越界访问是一个普遍问题,从C程序运行的角度来看,内存被分为静态内存区、栈内存区以及堆内存区。静态内存区主要存放程序的静态信息,包括全局变量、静态变量等;栈内存区属于动态内存,主要存放一些临时变量等;堆内存区也属于动态内存,需要显式调用系统的分配函数获取。其中静态内存和栈内存程序是不能控制的,由操作系统来分配管理;堆内存程序可以控制,可以根据自己的需要进行动态分配和释放。
[0003] 每种内存区都可能会存在越界访问的问题,其中数组越界写操作是引起内存越界的主要原因,并且多数疑难、怪异问题都恰恰是这种原因引起的。比如说,某个数组越界修改了其他模块使用的变量的值,结果使得其他模块进入了一些不应进入的流程,导致了一些奇怪的现象和问题,而这些问题分析起来往往无从下手,这对设备的可用性、稳定性带来极大的威胁。
[0004] 但是,目前,对于静态内存区及栈内存区的越界访问并没有一个好的方法。
[0005] 现有技术中,对内存越界的管理方法,一般都是采用静态检查工具对代码进行扫描,进而发现一些可疑的越界操作代码,但这种检查工具作用很有限,只能发现一些很明显的问题,绝大多数的问题都没有办法检查出来。
[0006] 现有技术中,另外一种方法是,当程序运行出现问题后,根据程序产生的core文件,结合出现问题的现象,进行代码走读、分析和定位。
[0007] 由此可见,根据core文件以及现象进行内存越界管理的方法,存在以下问题:(1)程序已经崩溃,已经带来了损失;(2)用于分析的信息大多情况下并不充分,因为,一些情况下,用于保存调用栈的内存区已经被越界操作覆盖,从而导致core文件中已经得不到有用的信息;(3)如果发生了越界操作,但程序没有崩溃,但是可能已经使得其他模块走入了非预期的流程,已经导致了程序的错误,而这种情况在短时间之内可能无法察觉,即使是察觉了,也很难找到问题所在。
[0008] 基于以上的分析,现有内存越界的管理方法存在无法有效地、准确地定位越界操作,导致不能很快解决越界操作的问题。

发明内容

[0009] 本发明实施例提供一种内存越界的管理方法及装置,以解决现有技术中无法有效地、准确地定位越界操作,导致不能很快解决越界操作的问题。
[0010] 本发明实施例提供的具体技术方案如下:
[0011] 一种内存越界的管理方法,包括:
[0012] 在程序初始化时,在堆内存中设置内存池,上述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;
[0013] 在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。
[0014] 本发明实施例中,在程序初始化时,在堆内存中设置内存池,上述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。这样,在内存池的每两个相邻内存块之间设置隔离带,可以有效降低越访问时其他内存块被篡改的风险。
[0015] 较佳的,在堆内存中设置内存池之前,进一步包括:
[0016] 将当前的待处理程序中的全局变量封装成至少一个结构体,且基于上述至少一个结构体中的每一个结构体分别定义相应的结构体指针。
[0017] 这样,程序运行过程中,通过预定义的内存分配函数,在需要申请动态内存时,将定义的结构体指针所需内存分配到了内存池中相应内存规格的空闲内存块中,也就将静态内存中的全局变量保存到了堆内存中的内存池中,使得原本在静态内存区的全局变量的越界访问问题转换为堆内存的越界访问问题。
[0018] 较佳的,将当前的待处理程序中的全局变量封装成至少一个结构体,具体包括:
[0019] 将当前的待处理程序中的所有全局变量封装成一个结构体;或,[0020] 分别将当前的待处理程序中的每一个功能模块包含的全局变量,封装成对应的结构体;或
[0021] 对当前的待处理程序中中的各个模块进行任意组合,分别将每一种组合包含的全局变量,封装成对应的结构体。
[0022] 较佳的,分别设置每一个隔离带的大小,并在上述每一个隔离带中分别写入预设的数据。
[0023] 较佳的,上述每一个隔离带的大小是相同的。
[0024] 较佳的,在内存池的起始位置设置一个内存池管理区;
[0025] 分别对上述每一个隔离带中的数据进行定时监测,并在确定任意一个隔离带中的数据发生变化后,上报越界信息;其中,上述越界信息包括,内存池管理区中的管理信息及发生数据变化的隔离带的地址信息,其中,上述管理信息是发生数据变化的隔离带的相邻内存块的描述信息。
[0026] 这样,对隔离带进行定时监测,当发生越界访问时,能准确地提供详细的用于分析问题的信息。
[0027] 较佳的,上述发生数据变化的隔离带的相邻内存块的描述信息中至少包括使用上述相邻内存块的参量在相应程序中的行号和对应的函数名。
[0028] 一种内存越界的管理装置,具体包括:
[0029] 设置单元,用于在程序初始化时,在堆内存中设置内存池,上述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;
[0030] 处理单元,用于在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。
[0031] 本发明实施例中,在程序初始化时,在堆内存中设置内存池,上述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。这样,在内存池的每两个相邻内存块之间设置隔离带,可以有效降低越访问时其他内存块被篡改的风险。
[0032] 较佳的,在堆内存中设置内存池之前,进一步包括:
[0033] 定义单元,用于将当前的待处理程序中的全局变量封装成至少一个结构体,且基于上述至少一个结构体中的每一个结构体分别定义相应的结构体指针。
[0034] 这样,程序运行过程中,通过预定义的内存分配函数,在需要申请动态内存时,将定义的结构体指针所需内存分配到了内存池中相应内存规格的空闲内存块中,也就将静态内存中的全局变量保存到了堆内存中的内存池中,使得原本在静态内存区的全局变量的越界访问问题转换为堆内存的越界访问问题。
[0035] 较佳的,将当前的待处理程序中的全局变量封装成至少一个结构体时,定义单元具体用于:
[0036] 将当前的待处理程序中的所有全局变量封装成一个结构体;或,[0037] 分别将当前的待处理程序中的每一个功能模块包含的全局变量,封装成对应的结构体;或
[0038] 对当前的待处理程序中中的各个模块进行任意组合,分别将每一种组合包含的全局变量,封装成对应的结构体。
[0039] 较佳的,设置单元进一步用于:
[0040] 分别设置每一个隔离带的大小,并在上述每一个隔离带中分别写入预设的数据。
[0041] 较佳的,上述每一个隔离带的大小是相同的。
[0042] 较佳的,设置单元进一步用于,在内存池的起始位置设置一个内存池管理区;
[0043] 还包括,监测单元,用于分别对上述每一个隔离带中的数据进行定时监测,并在确定任意一个隔离带中的数据发生变化后,上报越界信息;其中,上述越界信息包括,内存池管理区中的管理信息及发生数据变化的隔离带的地址信息,其中,上述管理信息是发生数据变化的隔离带的相邻内存块的描述信息。
[0044] 这样,对隔离带进行定时监测,当发生越界访问时,能准确地提供详细的用于分析问题的信息。
[0045] 较佳的,上述发生数据变化的隔离带的相邻内存块的描述信息中至少包括使用上述相邻内存块的参量在相应程序中的行号和对应的函数名。

附图说明

[0046] 图1为本发明实施例中,内存越界的管理方法的流程示意图;
[0047] 图2为本发明实施例中,内存池中只有1K和2K规格的内存区的结构示意图;
[0048] 图3为本发明实施例中,内存越界的管理装置的结构示意图。

具体实施方式

[0049] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,并不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0050] 为了解决现有技术中无法有效地、准确地定位越界操作,导致不能很快解决越界操作的问题,本发明实施例中,针对静态内存区和堆内存区中的内存越界问题,在堆内存中设置内存池,并在内存池中的每两个相邻内存块之间设置隔离带;在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中;另外,将静态内存区中的全局变量,封装成结构体并定义相应的结构体指针,进而就可以管理内存越界的问题。
[0051] 下面通过具体实施例对本发明方案进行详细描述,当然,本发明并不限于以下实施例。
[0052] 从C程序运行的角度来看,内存被分为静态内存区、栈内存区和堆内存区,但本发明实施例仅针对静态内存区和堆内存区中的内存越界问题。
[0053] 需要说明的是,静态内存区主要存储全局变量和一些静态变量。而全局变量数组和静态变量数组的越界写操作是导致静态内存区内存越界的最主要原因。在实际应用中,静态变量在程序中完全可以禁止使用,因为静态变量可以用全局变量来替代;而全局变量在C程序中是不能回避的,尤其是大型程序,全局变量的应用非常广泛。因此,本发明实施例,对于静态内存区的越界访问,主要讨论的是全局变量的越界写问题。
[0054] 参阅图1所示,本发明实施例中,内存越界的管理方法的具体流程如下:
[0055] 步骤100:在程序初始化时,在堆内存中设置内存池,上述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带。
[0056] 在堆内存区中设置了内存池,用于管理堆内存区中的内存越界问题。其中,内存池分为内存池管理区和内存区,且内存区又包括至少一个内存块,每个内存区中包括的内存块的个数可以不相同。并且,在每两个相邻内存块之间设置有隔离带。例如,参阅图2所示,为内存池中只有1K和2K规格的内存区的结构示意图,其中每个内存区中包括多个相同规格的内存块。
[0057] 使用内存池进行管理,其本质就是接管系统的malloc函数和free函数。程序启动初始化时,程序调用系统的malloc函数开辟一段内存,并且永不释放,直到程序结束前,这块内存被称为内存池。其中,malloc函数为C库函数,在C程序中用于从堆内存中分配一块内存;free函数为C库函数,在C程序中用于释放从堆内存中分配的内存。
[0058] 并且,使用内存池进行管理具有多种优点。第一,相比于使用系统内存管理的不可控性,使用内存池管理为程序的内存使用带来一定可控性;第二,内存池的内存是程序启动初始化时就从系统内存中划出,这样,不管系统中其他程序的运行情况如何,对于当前待处理程序来说,不会存在内存不足的情况;第三,内存池是一块地址连续的内存,因此为监测是否存在越界写操作创造了条件。
[0059] 下面将分别介绍内存池的这几个部分:
[0060] (1)内存池管理区。在内存池的起始位置设置一个内存池管理区,这是因为在数组或者指针操作中,一般都是基地址加偏移来操作,基地址减偏移的操作是一种非常规的操作,一般是被禁止使用的。因此我们将内存池管理区放在内存池的最顶端,即内存池的起始位置处,这样能尽可能的降低了内存池管理区被改写的风险。因为,一旦内存池管理区被改写,那么程序将直接进入混乱状态。
[0061] 内存池管理区,用于记录和标记内存池中每一个内存块的分配和释放,且可以记录最近几次某内存块的使用者,也就是说,每一个内存块都对应内存池管理区中的一个管理信息,其中至少包括使用该内存块的程序中的代码行号和对应的函数名,这样可以尽可能多的为越界访问问题的定位和分析提供信息。当然,对于内存池管理区的设计可以根据自己程序的需要设计成多种多样。
[0062] 例如,本发明实例例中,对于内存池管理区的设计,使每一个内存块对应一个管理信息,以一个内存块为例,当该内存块被申请时,将分配标记,例如定义为MemUseFlag置位1,表示已经分配,同时,将使用该内存块的使用者的函数名和在程序中的行号分别写入到存放该信息的数组中,例如定义为MemUser[3]中,本发明实施例中,存放最近3次使用该内存块的使用者的信息。在需要释放该内存块时,则将分配标记MemUseFlag置位0,表示空闲。
其中,对于使用该内存块的使用者的函数名和在程序中的行号可以使用参数传递的方式,通过一些宏来获取,例如行号可以通过__LINE__来获取,函数名则可以在每个函数入口的地方使用一个宏定义来定义,在出口处在取消。
[0063] (2)内存区。根据程序中内存使用情况,可以将内存池划分为不同规格的若干内存区,比如1k区、2k区、16K区、32K区、256K区等。
[0064] (3)内存块。每一个规格的内存区中包括至少一个该规格的内存块,且每一个内存区中的内存块个数可以不同,可以根据程序运行时所需要的内存进行预先评估。
[0065] (4)隔离带。在每两个相邻内存块之间设置一个隔离带,分别设置每一个隔离带的大小,并在每一个隔离带中分别写入预设的数据。
[0066] 其中,每一个隔离带的大小是相同的。较佳的,隔离带的大小设置为4字节或者8字节,具体考虑到字节的自然对齐问题,在32位系统上,设置为4字节,在64位系统上,设置为8字节,本发明实施例以4字节为例。
[0067] 其中,在每一个隔离带中分别写入预设的数据,较佳的,预设的数据为前后两个字节相同的,不是全F或者全0的数据,这是因为,各种机器的存储字节序不同,比如预设的数据为0x12121212,这样,无论是大端序还是小端序存储,将隔离带中的数据强制转换为一个无符号32位数时,最终结果都是0x12121212,提高了效率;当预设的数据不是这样设计的时,在大端序和小端序机器上,将隔离带中的数据强制转换出来时得到的数据前后是不相同的,这样在之后的对隔离带的数据进行监测时,就需要进行转换,降低了效率。
[0068] 进一步地,设置了隔离带后,在计算内存块起始地址及内存块管理信息位置时需要考虑隔离带的大小。也就是说,每一个内存块的起始地址,都需要加上加上隔离带的大小。例如,有两个1K内存块,第一个1K内存块的起始地址为pBaseAddr,则第二个1K内存块的起始地址为pBaseAddr+1024+4,其中1024为1K所占的字节大小,4为隔离带的大小。
[0069] 步骤110:在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。
[0070] 其中,上述预定义的内存分配函数,用于接管系统的内存分配函数,在需要申请的动态内存指向内存池中的内存。
[0071] 执行步骤110时,具体操作为:
[0072] 首先,在程序运行过程中,如果需要申请动态内存,则调用预定义的内存分配函数;
[0073] 然后,通过程序中预定义的内存分配函数,在内存池中查找和匹配相应规格的空闲内存块;
[0074] 最后,将上述空闲内存块分配给上述需要申请的动态内存。
[0075] 进一步地,在执行步骤100之前,对于静态内存中的全局变量:将当前的待处理程序中的全局变量封装成至少一个结构体,且基于上述至少一个结构体中的每一个结构体分别定义相应的结构体指针。
[0076] 其中,对于将全局变量封装成至少一个结构体,可以有以下三种方式:
[0077] 第一种方式:将当前的待处理程序中的所有全局变量封装成一个结构体;
[0078] 第二种方式:分别将当前的待处理程序中的每一个功能模块包含的全局变量,封装成对应的结构体;
[0079] 第三种方式:对当前的待处理程序中的各个模块进行任意组合,分别将每一种组合包含的全局变量,封装成对应的结构体。
[0080] 当然,对于全局变量的封装并不仅限于这三种方式,在实际中,可以根据程序的规模和结构来选择不同的封装方式。
[0081] 这样,程序运行过程中,通过预定义的内存分配函数,在需要申请动态内存时,将定义的结构体指针所需内存分配到了内存池中相应内存规格的空闲内存块中,也就将静态内存中的全局变量保存到了堆内存中的内存池中,使得原本在静态内存区的全局变量的越界访问问题转换为堆内存的越界访问问题,这样便于使用上述堆内存中定义的内存池对内存越界问题进行统一管理。
[0082] 进一步地,执行完步骤100-110后,分别对上述每一个隔离带中的数据进行定时监测,并在确定任意一个隔离带中的数据发生变化后,上报越界信息;其中,上述越界信息包括,内存池管理区中的管理信息及发生数据变化的隔离带的地址信息;其中,上述管理信息是发生数据变化的隔离带的相邻内存块的描述信息,且该描述信息至少包括包括使用上述相邻内存块的参量在相应程序中的行号和对应的函数名。
[0083] 具体操作为:
[0084] 首先,在程序中设置定时器,定时去扫描每一个隔离带中的数据是否发生变化,如果发生变化则表明出现了越界写操作,则将内存池管理区中的管理信息及隔离带的地址信息写入文件,并发出警告;
[0085] 然后,根据这些信息找出出现越界写操作的代码。
[0086] 其中,定时监测的实现,例如,可以为,在程序中设置一个循环,逐个比较每一个隔离带中的数据。
[0087] 需要进一步指出,对于内存越界写的问题,会出现以下两种情况:
[0088] 第一种情况:越界写在了与该内存块相邻的内存块中;
[0089] 第二种情况:越界写飞跃写到一个与该内存块相隔比较远的内存块,比如一个基地址加上一个比较大的偏移时。
[0090] 对于第一种情况,如果越界写只写到隔离带,而没有写到其他内存块,则通过设置的隔离带,可以有效防止越界写问题,不会影响其它内存块中的数据。如果越界写操作不但写了隔离带,并且还写到其他的内存块,则其它内存块中的数据受到了影响,这时,通过对隔离带的定时监测,就可以监测到发生越界写的内存块,然后,根据上报的越界信息,走读指定行的代码,找到问题所在。
[0091] 对于第二种情况,如果越界写到了其他内存块的同时也写到了隔离带,则可以通过定时监测,发现问题,但这种情况下,就要逐个分析在该内存块地址之前的所有非空闲的内存块所对应的代码。
[0092] 因此,本发明实施例,对于第一种情况的这种越界写到相邻内存块的越界写操作是非常有效的。
[0093] 基于上述实施例,参阅图3所示,本发明实施例中,一种内存越界的管理装置,具体包括:
[0094] 设置单元31,用于在程序初始化时,在堆内存中设置内存池,上述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;
[0095] 处理单元32,用于在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。
[0096] 较佳的,在堆内存中设置内存池之前,进一步包括:
[0097] 定义单元30,用于将当前的待处理程序中的全局变量封装成至少一个结构体,且基于上述至少一个结构体中的每一个结构体分别定义相应的结构体指针。
[0098] 较佳的,将当前的待处理程序中的全局变量封装成至少一个结构体时,定义单元30具体用于:
[0099] 将当前的待处理程序中的所有全局变量封装成一个结构体;或,[0100] 分别将当前的待处理程序中的每一个功能模块包含的全局变量,封装成对应的结构体;或
[0101] 对当前的待处理程序中中的各个模块进行任意组合,分别将每一种组合包含的全局变量,封装成对应的结构体。
[0102] 较佳的,设置单元31进一步用于:
[0103] 分别设置每一个隔离带的大小,并在上述每一个隔离带中分别写入预设的数据。
[0104] 较佳的,上述每一个隔离带的大小是相同的。
[0105] 较佳的,设置单元31进一步用于,在内存池的起始位置设置一个内存池管理区;
[0106] 还包括,监测单元33,用于分别对上述每一个隔离带中的数据进行定时监测,并在确定任意一个隔离带中的数据发生变化后,上报越界信息;其中,上述越界信息包括,内存池管理区中的管理信息及发生数据变化的隔离带的地址信息,其中,上述管理信息是发生数据变化的隔离带的相邻内存块的描述信息。
[0107] 较佳的,上述发生数据变化的隔离带的相邻内存块的描述信息中至少包括使用上述相邻内存块的参量在相应程序中的行号和对应的函数名。
[0108] 综上所述,本发明实施例中,本发明实施例中,在程序初始化时,在堆内存中设置内存池,上述内存池被划分为多种规格的若干内存区,每一个内存区中包括至少一个内存块,且在每两个相邻内存块之间设置有隔离带;在程序运行过程中,通过预定义的内存分配函数,将程序中需要申请的动态内存,在内存池中匹配至相应内存规格的空闲内存块中。这样,在内存池的每两个相邻内存块之间设置隔离带,可以有效降低越访问时其他内存块被篡改的风险;
[0109] 另外,对静态内存区中的全局变量定义相应的结构体指针。这样,程序运行过程中,通过预定义的内存分配函数,在需要申请动态内存时,将定义的结构体指针所需内存分配到了内存池中相应内存规格的空闲内存块中,也就将静态内存中的全局变量保存到了堆内存中的内存池中,使得原本在静态内存区的全局变量的越界访问问题转换为堆内存的越界访问问题;
[0110] 另外,对隔离带进行定时监测,当发生越界访问时,能准确地提供详细的用于分析问题的信息。
[0111] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0112] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0113] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0114] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0115] 尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
[0116] 显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。