买专利,只认龙图腾
首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】一种堆内存的写越界检测方法和装置_杭州迪普信息技术有限公司_201910670304.1 

申请/专利权人:杭州迪普信息技术有限公司

申请日:2019-07-24

公开(公告)日:2023-01-24

公开(公告)号:CN110413521B

主分类号:G06F11/36

分类号:G06F11/36;G06F9/50

优先权:

专利状态码:有效-授权

法律状态:2023.01.24#授权;2019.11.29#实质审查的生效;2019.11.05#公开

摘要:本申请提供一种堆内存的写越界检测方法。预先构建全局数组,将全局数组中的每一个数组元素对应存储一个内存块的相关信息,在分配内存时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化。其中任意一个发生变化后,判定发生内存写越界操作,并可根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。

主权项:1.一种堆内存的写越界检测方法,其特征在于,所述方法包括:进行内存分配时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,内存分配信息被记录在全局数组中;其中,全局数组中的任一数组元素对应记录一个内存块的信息,所述记录的内存块的信息包括:内存分配时间信息、内存释放时间信息、分配给内存的原始首地址、分配给内存的大小、内存头内容和本次内存调用的来源方;接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化;所述内存检测信号可包括多种触发时机,所述多种触发时机包括:在每次释放内存前自动触发一次内存检测、根据用户在任意时刻发送的信号触发内存检测、系统自身发现内存错误时触发内存检测;若其中任意一个发生变化,则判定发生内存写越界操作,根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源;提供自定义信号处理函数1与自定义信号处理函数2;其中,所述自定义信号处理函数1用于响应代表内存错误相关的信号,其表现为:调用自定义遍历函数,用于遍历数组A显示其中有问题的内存块的信息;向本进程发送一个与内存问题无关但会杀死进程并产生core文件的信号,杀死本进程,生成core文件;所述自定义信号处理函数2用于响应代表内存未发生错误的信号,其实现与自定义信号处理函数1基本相同,但不需要杀死进程生成core文件。

全文数据:一种堆内存的写越界检测方法和装置技术领域本申请涉及互联网技术领域,尤其涉及一种堆内存的写越界检测方法和装置。背景技术内存越界是软件开发过程中经常遇到的一个问题。内存越界是指由于程序错误而访问读写了不应该访问的内存区域,包括但不限于:访问自己合法申请的内存但所访问的地址范围超过了申请的范围内存越界;访问已被释放的内存;访问非法地址的内存非法地址是指未映射到合适的物理内存的虚拟地址,比如未初始化的临时指针变量的值一般是随机值,将其作为地址进行访问往往出现访问非法地址的内存的情况;访问其它流程申请的、当前流程逻辑上不应访问的内存,等等。内存越界可能会引发进程崩溃,流程执行异常等一系列问题。仅通过系统自身对内存和管理和保护机制及进程崩溃时生成的core文件信息,往往不能有效地定位内存越界问题。因此,找到一种能够检测和定位内存越界问题的方案是本领域技术人员的迫切任务。发明内容针对上述技术问题,本申请实施例提供一种堆内存的写越界检测方法和装置,技术方案如下:根据本申请实施例的第一方面,提供一种堆内存的写越界检测方法,所述方法包括:进行内存分配时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,所述内存分配信息被记录在全局数组中;其中,全局数组中的任一数组元素对应记录一个内存块的信息,所述记录的内存块的信息包括:内存分配时间信息、内存释放时间信息、分配给内存的原始首地址、分配给内存的大小、内存头内容和本次内存调用的来源方;接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化;若其中任意一个发生变化,则判定发生内存写越界操作,根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。根据本申请实施例的第二方面,提供一种堆内存的写越界检测装置,所述装置包括:内存分配模块:用于控制内存分配,进行内存分配时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,所述内存分配信息被记录在全局数组中;其中,全局数组中的任一数组元素对应记录一个内存块的信息,所述记录的内存块的信息包括:内存分配时间信息、内存释放时间信息、分配给内存的原始首地址、分配给内存的大小、内存头内容和本次内存调用的来源方;内存释放模块:用于控制内存释放,接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化;越界分析模块:用于在其中任意一个发生变化后,判定发生内存写越界操作,根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。本申请实施例提供了一种堆内存的写越界检测方法。预先构建全局数组,将全局数组中的每一个数组元素对应存储一个内存块的相关信息,在分配内存时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化,若其中任意一个发生变化后,判定发生内存写越界操作,并可根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请实施例。此外,本申请实施例中的任一实施例并不需要达到上述的全部效果。附图说明为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。图1是本申请一示例性实施例示出的堆内存的写越界检测方法一种流程图;图2是本申请一示例性实施例示出的自定义内存分配函数的一种实现流程图;图3是本申请一示例性实施例示出的内存块结构的一种示意图;图4是本申请一示例性实施例示出的自定义内存释放函数的一种实现流程图;图5是本申请一示例性实施例示出的内存信息图形化界面的一种示意图;图6是本申请一示例性实施例示出的堆内存的写越界检测装置一种示意图。具体实施方式这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。在本申请使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请。在本申请和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。应当理解,尽管在本申请可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。内存越界是软件开发过程中经常遇到的一个问题。内存越界是指由于程序错误而访问读写了不应该访问的内存区域,包括但不限于:访问自己合法申请的内存但所访问的地址范围超过了申请的范围内存越界;访问已被释放的内存;访问非法地址的内存非法地址是指未映射到合适的物理内存的虚拟地址,比如未初始化的临时指针变量的值一般是随机值,将其作为地址进行访问往往出现访问非法地址的内存的情况;访问其它流程申请的、当前流程逻辑上不应访问的内存,等等。内存写越界可能会引发进程崩溃,流程执行异常等一系列问题。仅通过系统自身对内存和管理和保护机制及进程崩溃时生成的core文件信息,往往不能有效地定位内存写越界问题。因此,找到一种能够检测和定位内存写越界问题的方案是本领域技术人员的迫切任务。针对以上问题,本申请实施例提供一种堆内存的写越界检测方法,以及一种堆内存的写越界检测装置。下面对本实施例涉及的堆内存的写越界检测方法进行详细说明,参见图1,包括以下步骤:S101,进行内存分配时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,所述内存分配信息被记录在全局数组中;其中,全局数组中的任一数组元素对应记录一个内存块的信息,所述记录的内存块的信息包括:内存分配时间信息,内存释放时间信息,分配给内存的原始首地址,分配给内存的大小,内存头内容和本次内存调用的来源方;其中,本次内存调用的来源方可包括本次调用内存分配函数的源代码所在的源文件名称,和本次调用内存分配函数的源代码在源文件内的行号。具体而言,可提供一个检测用的共享库和公共头文件,在编译待检测程序时使该待检测程序链接该检测用共享库,同时在该公共头文件中通过宏替换,将系统库中内存分配、释放函数及内存操作函数替换为自定义的内存分配释放的函数。该共享库中至少包括全局数组A、全局原子变量B和全局原子变量C。其中:其中,全局数组中数组元素的内存首地址字段为0时,可表示该元素尚未使用,为空闲状态,否则为非空闲状态或者说是已使用状态。该全局数组的长度即元素个数可由开发调试人员根据系统剩余内存的数量酌情指定。例如,正常情况下系统有100MB剩余内存,预留20MB内存保障系统安全运行,则有80MB内存可用于分配给该数组;若每个数组元素大小为80字节,则可以将数组元素数量定义为10485761M=1048576。需要注意的是,全局数组在进程的虚拟地址空间中分布在bss段,而动态分配的内存属于堆内存,二者地址范围差距很大,因此该全局数组不会被堆内存的越界操作影响,全局数组中的内存分配释放等相关记录不会被破坏。从而避免了因内存分配记录被破坏导致无法自动分析内存写越界问题原因的情况。进一步地,继续定义一个全局原子变量B,初始值为0,用于记录A数组已使用的元素个数,同时它也是下一个可用元素的数组下标。A数组按从前到后的顺序依次使用数组元素,已使用的不再转为未使用状态,因此B的值在进程的生命周期内永远递增。进一步地,继续定义一个全局原子变量C,初始值为0,用于记录内存分配释放时序。分配内存时其值记录在相应内存分配记录元素的内存分配时序字段中,释放内存时其值记录在相应内存分配记录元素的内存释放时序字段中。然后变量C的值自增1在进程生命周期内永远递增。S102,接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化;其中,接收到内存检测信号可包括多种触发时机,在本实施例中,可在每次释放内存前自动触发一次内存检测,即,进行内存释放前,根据所述内存的首地址在所述全局数组中查找到待释放内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化。或,可根据用户在任意时刻发送的信号触发内存检测,具体而言,用户可随时主动向进程发送特定信号,以对该进程的内存使用情况进行检查。在一些情况下,系统自身也可发现内存错误并触发内存检测。S103,若其中任意一个发生变化,则判定发生内存写越界操作,根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。本实施例使用自定义的内存分配释放函数接管系统默认的内存分配释放函数,为动态分配的内存块额外分配一个前端检测空间和一个末端检测空间,并将内存分配和释放操作记录在预先构建的全局数组中,作为本进程的内存分配释放的历史记录;在内存释放、收到内存错误相关的信号如SIGABRT、SIGBUS、SIGSEGV及进程正常退出时,进行内存检测操作,若发现有任一块尚未释放的内存的内存头、前端检测空间或末端检测空间被写坏,则在全局数组中,查找所有内存分配记录中地址范围与之相近的记录,并报告最有可能产生内存写越界操作的内存分配记录的相关信息。在全局数组与全局原子变量外,还需要自定义内存分配函数与内存释放函数,具体如下:自定义内存分配函数:自定义内存分配函数用于替换原程序调用系统库中的内存分配函数。该内存分配函数的实现参考图2,包括以下步骤:S201,调用系统库提供的原始内存分配函数,分配size+2*N字节内存;其中size表示原内存分配函数要求分配的字节数,N表示前端检测空间和末端检测空间所占的字节数。前N字节为前端检测空间,后N个字节为末端检测空间,中间size字节为业务数据区。由于堆内存首地址一般按最宽的基本数据类型对齐,故将N设定为当前架构下最宽的基本数据类型宽度较为合理。前端检测空间和末端检测空间中填充的特殊数值可为相同或不同的特定的不常见数值例如0x0123456789abcdef、0xfedcba9876543210,便于和内存空间的业务数据相区别。在发生内存写越界时,越界的业务数据可能与原有的业务数据相同,但几乎不会与前端末端检测空间中的特殊数值相同。S202,判断内存是否分配成功,若分配成功,执行步骤S203,否则执行步骤S207;S203,将B赋给临时变量i并将B自增1,占用第i个元素,即在第i个元素及所分配内存中填写相关信息,如此可避免两个线程并发申请内存时同时存取B的值造成混乱;S204,若原子变量B达到或超过了数组A的长度上限,则报告空间已满,执行步骤S206,否则执行步骤S203;S205,将B赋给临时变量i并将B自增1;占用全局数组A中的第i个元素,即在第i个元素及所分配内存中填写相关信息,如此可避免两个线程并发申请内存时同时存取B的值造成混乱;所分配内存前N个字节填入前端检测空间,最后N个字节填入末端检测空间。末端检测空间可紧跟业务数据区,其首地址为内存区原始首地址+size+N。将本元素序号、所分配的内存区的原始首地址和长度记录在A[i]即数组A第i个元素,下同相应字段中;S206,将变量C的值记入A[i]的内存分配时序字段中,并将C的值自增1;此时将原始首地址前L字节拷贝至A[i]的内存头字段中;将本次调用内存分配函数的源代码的文件名、代码行号记录在A[i]相应字段中。在C语言等高级语言中,有内置宏直接表示源代码的文件名和代码行号,因此读取这两个信息的效率很高。需要注意的是,源代码的文件名和代码行号是内存分配函数的调用者的信息,而不是内存分配函数本身的信息;S207,返回所分配内存的原始地址+N。经上述自定义内存函数分配的内存块被划分成多个内存区,其格式如图3所示。圆括号内为当前内存区的首地址~尾地址尾地址等于当前内存区最后一个字节的地址加1。内存块除了图中所示的区域外,还可能存在部分空闲内存,空闲内存的存在是由于动态分配内存时,系统内存管理机制往往会按预先划分好的内存块分配合适大小的内存,在内存区按图3分配完毕后,剩余的内存即为空闲内存,空闲内存与本实施例的方法实现无关。自定义内存释放函数:自定义内存分释放函数用于替换原程序调用系统库中的内存释放函数。该内存释放函数的实现参考图4,包括以下步骤:S401,若入参输入参数,程序业务流程使用的内存块首地址等于空NULL,则直接返回,否则继续执行步骤S402;S402,将入参减去N,得到原始内存分配函数分配的内存块的原始首地址p;S403,遍历全局数组A中的非空闲元素,从数组0遍历到当前数组B。针对每个数据元素:若内存释放时序为0表示尚未释放且所记录的内存首地址等于p,则表示找到了对应的内存分配记录,执行步骤S404,否则执行步骤S407;具体地,内存块的内存头可与全局数据中记录的内存头字段内容进行对比,前端,末端检测空间中的特殊数值可直接与相应常量作对比。其中,前端,末端检测空间中的特殊数值可以设定为一个固定值。S404,检查该内存块的内存头、前端检测空间和末端检测空间是否有任意一个发生变化;若有发生变化,则执行步骤S406,若未发生变化,执行步骤S405;S405,若内存头或检测空间无变化,则将相关内存分配记录元素中的内存释放时序置为变量C,表示内存已释放。同时将C的值自增1,然后调用系统库中的内存释放函数释放该内存,最后返回。S406,输出错误信息,表示内存块发生了越界操作,同时输出所述内存块的相关信息内存首地址、内存大小、源文件名、源代码行号。因为当内存块的内存头或检测空间被越界操作时,可能是在并发情况下这块内存原本分配给其它流程用、释放后还继续当成原功能的内存块进行写操作而写坏的,此时,需要分析这块内存曾经被哪些流程使用,从而排查相关流程是否存在问题。进一步地,可在全局数组A中遍历所有内存释放时序为已释放值非0的元素,查找内存块的业务数据区地址范围与本内存块的发生变化的内存头或检测空间的地址范围重叠的元素,找到则输出相关元素的所有信息内存首地址、内存大小、源文件名、源代码行号、内存释放时序。具体地,若内存区1的首地址小于内存区2的尾地址,且内存区1的尾地址大于内存区2的首地址,则表示内存区1和内存区2有重叠。完成上述操作后,可继续给本进程发送一个SIGABRT信号,以触发执行下文的自定义信号处理函数。在本实施例中,在业务数据区前面同时有内存头和前端检测空间,对二者都进行检测而不仅仅对现成的内存头作检测的原因,是内存头中的数据往往过于简单,跟普通的业务数据很像。即越界写入数据可能与内存头原本数据相同,内存头不会发生变化,无法判断是否发生越界。因此需要通过易辨认的填有特殊数值的前端检测空间进行进一步的检测。S407,将i增加1,并执行步骤S408;S408,若未找到相应的内存分配记录元素,判断该内存在分配时全局数组A是否已满,若全局数组A已满,直接调用系统库中的内存释放函数释放该内存,最后返回。进一步地,本申请还提供自定义信号处理函数1与自定义信号处理函数2,这两个函数用于遍历全局数组,获取其他内存的越界信息。具体如下:自定义信号处理函数1用于响应代表内存错误相关的信号,如SIGABRT、SIGBUS、SIGSEGV等。由于此时进程已经出现严重故障,无法再正常运行,因此本函数不要求耗时尽可能短,而要求输出尽可能详尽。其实现为:1调用自定义遍历函数,用于遍历数组A显示其中有问题的内存块的信息;2向本进程发送一个与内存问题无关但会杀死进程并产生core文件的信号如SIGSYS,杀死本进程,生成core文件。此时,开发调试人员通过查看自定义信号处理函数1的输出信息,可得知哪些内存块被越界操作。其中,自定义遍历函数的实现为:遍历数组A中非空闲元素,若其对应的内存块的内存头、前端检测空间或末端检测空间中任一区域未被重新分配给其它内存块,则判断该区域是否有变化,若有则说明该区域被越界操作,此时输出该记录所有信息。进一步地,若某元素的内存释放时序字段等于0未释放,则该内存块任一字节都不可能已分配给其它内存块,它的内存头、前端检测空间和末端检测空间都需要被检查是否有变化。自定义信号处理函数2用于响应代表内存未发生错误的信号,其实现与自定义信号处理函数1基本相同,但不需要杀死进程生成core文件。进一步地,由于有些内存操作函数如memset、memcpy、memmove等会进行连续内存操作,如果对所操作内存的长度参数指定错误,有可能造成写越界,因此,本申请同时自定义连续内存操作函数,其实现为:当进行连续内存操作时,将所述连续内存操作的操作地址范围与全局数组中的未释放内存块的地址范围进行对比,判定所述连续内存操作的操作地址范围是否发生越界。需要注意的是,由于上述检查过程需要遍历数组A所有非空闲元素,因此,当全局数组A中已记录了大量内存信息内存分配操作较频繁,非空闲元素已经很多时,这类检查对原程序的操作时序关系影响较大。因此,自定义连续内存操作函数更适用于在内存分配操作不太频繁的应用场景下使用。进一步地,可监听一个用户自定义信号如SIGUSR1,收到该信号时触发调用上文的自定义遍历函数。该信号用于允许开发调试人员随时发送信号以检查内存使用情况。在一些场景下,内存头或检测空间已被破坏,但系统尚未发现,开发调试人员主动检查全局数组A则可能提前发现问题。由于信号处理函数优先级高于普通进程流程,因此该函数的执行对原流程的时序没有影响。进一步地,可将进程的标准输出和标准错误文件描述符指向终端,使上述流程中输出的内存错误信息直接向终端输出,避免在进程内写文件时发生动态内存分配操作引起进程提前崩溃导致无法正常输出。在本申请的一个优选的实施例中,还可创建一个独立运行的软件程序,从core文件中读取全局数组A的数据,生成图形化界面进行显示,以便更好理解该进程中相关内存块的相互关系。图形化界面显示的效果可以如图5所示,也可称之为内存地图。具体地,可以内存地址值为横轴,以时间信息为纵轴,绘制二维图,每条内存分配记录在其中占一个矩形区间且互不重叠。如图5,若该内存地图的横轴和纵轴交于左上角,则每个矩形的两条横边代表时序。即每个矩形的“上边”代表分配该内存块的时间信息,“下边”代表释放该内存块的时间信息,该时间信息可为执行分配或释放操作的时间点。其中,任意两个矩形对应的内存块都不会在同一时间点分配或释放,亦即任意两个矩形的横边的延长线都不会重叠。每个矩形的两条竖边则代表其地址范围,包含内存头、前端检测空间、业务数据区及末端检测空间,即“左边”代表内存头的首地址,“右边”代表末端检测空间的尾地址。进一步地,每个矩形区间内部还可以使用颜色不同、宽度适中的纵向条纹进行填充,分别表示内存头、前端检测空间、业务数据区、末端检测空间的区间。存在内存问题时,可以对不同矩形空间重点标识如加粗边框或改变边框颜色等。横轴和纵轴上可以标记相应的数值,并在矩形所在区域描上对应的网格线。进一步地,在上述图形区域之外,还可单独列出表格或清单,展示内存头或检测空间发生了变化的内存块的信息。如此,可以明显看出哪些内存块在不同时间点、相同的地址范围发生重叠的。举例说明:A[0]、A[2]、A[4]、A[6]可明显看出在不同时间点使用了0x400000~0x400030这一内存区域。或同一时刻,哪些内存块在地址上是相邻的、接近的、连续的,是有可能因连续写内存而造成写越界的。举例说明:A[2]向后写越界可能写坏A[1]的数据,A[4]向后写越界有可能写坏A[3]、A[5]的数据;A[6]向后写越界有可能写坏A[5]的数据,等等。具体而言,结合上述全局内存信息进行内存问题分析的方法包括:1分析内存头、前端检测空间或末端检测空间是否发生越界时,需确认其是否属于相应内存区最近一次分配记录,若不是则应忽略。以图5为例,假设A[1]的末端检测空间有变化,由于A[1]的末端检测空间所在内存地址范围已重新分配给A[5],很可能在正常流程中修改了A[5]的业务数据,因此此时检查A[1]的末端检测空间是否正确是没有意义的。反之,A[5]和A[6]尚未释放,其内存头、前端检测空间、末端检测空间的值都是有参考意义的;A[4]虽已被释放,但A[4]的末端检测空间区域尚未被重新分配出去,因此A[4]的末端检测空间是否变化仍是值得关注的,而A[4]的内存头和前端检测空间区域已被A[6]覆盖,不必再进行分析。2若某内存块的前端内存头或前端检测空间发生变化而尾部末端检测空间未发生变化,则有较大可能是被前面的内存块写越界造成的,此时应重点分析同一时间存在的、地址值较小的内存块,确定其末端检测空间是否发生变化。以图5为例,假设当前正在释放A[5]对应的内存块,而A[5]前端检测空间有变化,且A[6]末端检测空间有变化,则有较大可能是A[6]业务数据区写越界导致A[5]的空间被越界操作。3若某内存块尾部发生变化而头部未发生变化,则较大可能是其自身的业务数据写越界导致的,也有一定概率是后面的内存块向前写越界导致的。此时重点分析会写其自身业务数据区的流程;其次可以查找其后最远的头部发生变化而尾部未发生变化的内存区的调用流程,并进一步分析其使用过程中有内存写越界可能。仍以上图5为例,假设A[5]末端检测空间有变化,而A[3]末端检测空间无变化,说明可能是A[5]自己的业务数据写越界导致的,也有可能是访问A[3]的某个流程不知道A[3]已经释放了,继续向A[3]的业务数据区写入数据,导致A[5]末端检测空间发生变化。此时A[5]和A[3]的操作流程都值得重点分析。4若某内存块首尾皆发生变化,则既有可能是从前面内存写越界,也可能是从后面的内存写越界,需要结合代码流程具体分析。相应于上述方法实施例,本申请实施例还提供一种堆内存的写越界检测装置,参见图6所示,所述装置可以包括:内存分配模块610,内存释放模块620与越界分析模块630。内存分配模块610:用于控制内存分配,进行内存分配时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,所述内存分配信息被记录在全局数组中;其中,全局数组中的任一数组元素对应记录一个内存块的信息,所述记录的内存块的信息包括:内存分配时间信息,内存释放时间信息,分配给内存的原始首地址,分配给内存的大小,内存头内容和本次内存调用的来源方;内存释放模块620:用于控制内存释放,接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化;越界分析模块630:用于在其中任意一个发生变化后,判定发生内存写越界操作,根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本申请方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。以上所述仅是本申请实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请实施例的保护范围。

权利要求:1.一种堆内存的写越界检测方法,其特征在于,所述方法包括:进行内存分配时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,所述内存分配信息被记录在全局数组中;其中,全局数组中的任一数组元素对应记录一个内存块的信息,所述记录的内存块的信息包括:内存分配时间信息、内存释放时间信息、分配给内存的原始首地址、分配给内存的大小、内存头内容和本次内存调用的来源方;接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化;若其中任意一个发生变化,则判定发生内存写越界操作,根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。2.如权利要求1所述的堆内存的写越界检测方法,其特征在于,所述检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化后,还包括:若三者都未发生变化,则判定未发生内存写越界操作,正常释放所述内存,并在全局数组的对应内存分配记录中填入所述内存释放的时间信息。3.如权利要求1所述的堆内存的写越界检测方法,其特征在于,所述根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源,包括:遍历全局数组中的所有非空闲数组元素,并输出内存头内容、前端检测空间或末端检测空间任一位置发生变化的内存块的相关记录信息;根据所述相关记录信息分析所述越界操作的来源,可被分析的信息包括:各个内存块发生变化的位置、内存的地址范围、分配释放的时序信息。4.如权利要求1所述的堆内存的写越界检测方法,其特征在于,所述堆内存的写越界检测方法,还包括:使用自定义的连续内存操作函数替代系统库中的默认函数,所述自定义的连续内存操作函数用于:当进行连续内存操作时,将所述连续内存操作的操作地址范围与全局数组中的未释放内存块的地址范围进行对比,判定所述连续内存操作的操作地址范围是否发生越界。5.如权利要求1所述的堆内存的写越界检测方法,其特征在于,所述堆内存的写越界检测方法,还包括:读取全局数组各个数组元素对应记录的内存信息,以内存地址范围为横轴,以内存的分配释放时序为纵轴,绘制二维图像,其中,每个数组元素存放的内存信息在所述二维图像中表现为互不重叠的矩形区间;针对每个数组元素的矩形区间,所述矩形的上、下两边界分别表示分配该内存块时间信息或释放该内存块的时间信息,所述矩形的左、右两边界分别表示该内存块地址范围的起点或该内存块地址范围的终点。6.一种堆内存的写越界检测装置,其特征在于,所述装置包括:内存分配模块:用于控制内存分配,进行内存分配时,实际分配的内存空间包括内存头空间、前端检测空间、业务数据空间和末端检测空间,所述前端检测空间和末端检测空间中被填充了预设的特殊数值,所述内存分配信息被记录在全局数组中;其中,全局数组中的任一数组元素对应记录一个内存块的信息,所述记录的内存块的信息包括:内存分配时间信息、内存释放时间信息、分配给内存的原始首地址、分配给内存的大小、内存头内容和本次内存调用的来源方;内存释放模块:用于控制内存释放,接收到内存检测信号后,根据所述内存的首地址在所述全局数组中查找到待检测内存的内存分配信息,根据所述内存分配信息检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化;越界分析模块:用于在其中任意一个发生变化后,判定发生内存写越界操作,根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源。7.如权利要求6所述的堆内存的写越界检测装置,其特征在于,所述检测所述内存的内存头空间、前端检测空间和末端检测空间是否有任意一个发生变化后,还包括:若三者都未发生变化,则判定未发生内存写越界操作,正常释放所述内存,并在全局数组的对应内存分配记录中填入所述内存释放的时间信息。8.如权利要求6所述的堆内存的写越界检测装置,其特征在于,所述根据全局数组中记录的各个内存块的信息,分析所述越界操作的来源,包括:遍历全局数组中的所有非空闲数组元素,并输出内存头内容、前端检测空间或末端检测空间任一位置发生变化的内存块的相关记录信息;根据所述相关记录信息分析所述越界操作的来源,可被分析的信息包括:各个内存发生变化的位置、内存的地址范围、分配释放的时序信息。9.如权利要求6所述的堆内存的写越界检测装置,其特征在于,所述堆内存的写越界检测装置,还包括:使用自定义的连续内存操作函数替代系统库中的默认函数,所述自定义的连续内存操作函数用于:当进行连续内存操作时,将所述连续内存操作的操作地址范围与全局数组中的未释放内存块的地址范围进行对比,判定所述连续内存操作的操作地址范围是否发生越界。10.如权利要求6所述的堆内存的写越界检测装置,其特征在于,所述堆内存的写越界检测装置,还包括:读取全局数组各个数组元素对应记录的内存信息,以内存地址范围为横轴,以内存的分配释放时序为纵轴,绘制二维图像,其中,每个数组元素存放的内存信息在所述二维图像中表现为互不重叠的矩形区间;针对每个数组元素的矩形区间,所述矩形的上、下两边界分别表示分配该内存块时间信息或释放该内存块的时间信息,所述矩形的左、右两边界分别表示该内存块地址范围的起点和终点。

百度查询: 杭州迪普信息技术有限公司 一种堆内存的写越界检测方法和装置

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。