一种检测内存访问越界的方法及装置

阅读: 评论:0

著录项
  • CN201110179665.X
  • 20110629
  • CN102214147A
  • 20111012
  • 深圳市五巨科技有限公司
  • 张田博
  • G06F12/14
  • G06F12/14

  • 广东省深圳市福田区天安数码城创新科技广场二期西座1203室
  • 中国,CN,广东(44)
  • 北京凯特来知识产权代理有限公司
  • 郑立明;孟丽娟
摘要
本发明属于嵌入式系统技术领域,尤其涉及一种检测内存访问越界的方法及装置。本发明检测内存访问越界的方法,包括:步骤a:申请内存块时在所申请内存块的尾部添加固定长度的检测字段;步骤b:进行内存块操作时,逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值不是初始设置值,执行步骤c;步骤c:提示该尾部检测字段对应的内存块存在内存访问越界的现象。本发明检测内存访问越界的方法及装置使得嵌入式系统中不恰当的内存越界操作能够及时被发现和进行针对性地维护操作,从而加强对系统内存数据的保护强度,提高嵌入式系统中有限内存的使用效率。
权利要求

1.一种检测内存访问越界的方法,包括:

步骤a:申请内存块时在所申请内存块的尾部添加固定长度的检测字段;

步骤b:进行内存块操作时,逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值是初始设置值,提示该尾部检测字段对应的内存块内存访问正常;如果尾部检测字段的数值不是初始设置值,执行步骤c;

步骤c:提示该尾部检测字段对应的内存块存在内存访问越界的现象。

2.根据权利要求1所述的检测内存访问越界的方法,其特征在于,在所述步骤a中,所述检测字段的数值默认设置为容易被检测的数值。

3.根据权利要求1所述的检测内存访问越界的方法,其特征在于,所述步骤a还包括,将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的尾部检测字段长度。

4.根据权利要求1所述的检测内存访问越界的方法,其特征在于,所述步骤a还包括,将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址。

5.根据权利要求1至4任一项所述的检测内存访问越界的方法,其特征在于,所述步骤a还包括,在所申请内存块的头部添加固定长度的头部检测字段,并将该头部检测字段的数值默认设置为容易被检测的数值。

6.根据权利要求5所述的检测内存访问越界的方法,其特征在于,所述步骤a还包括,将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的头部检测字段长度及尾部检测字段长度。

7.根据权利要求6所述的检测内存访问越界的方法,其特征在于,所述步骤c后还包括,逐一检测每一个内存块的头部检测字段,并判断相应内存块对应的头部检测字段的数值是否为初始设置值,如果头部检测字段的数值不是初始设置值,提示该头部检测字段对应的内存块写操作正常,并继续判断下一个内存块的头部检测字段;如果头部检测字段的数值是初始设置值,提示该头部检测字段对应的内存块写操作不当。

8.一种检测内存访问越界的装置,包括内存申请模块和地址返回模块,所述内存申请模块用于为需要使用的程序申请内存块,所述地址返回模块用于将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址,其特征在于,还包括内存设置模块、第一内存判断模块和状态提示模块,所述内存设置模块用于在所申请内存块的尾部添加固定长度的检测字段,所述第一内存判断模块用于逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值为初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块内存访问正常;如果尾部检测字段的数值不是初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块存在内存访问越界的现象;所述状态提示模块用于根据第一内存判断模块的判断结果进行相应的内存状态提示。

9.根据权利要求8所述的检测内存访问越界的装置,其特征在于,还包括第二内存判断模块和操作提示模块,所述第二内存判断模块用于逐一检测每一个内存块的头部检测字段,并判断相应内存块对应的头部检测字段的数值是否为初始设置值,如果头部检测字段的数值不是初始设置值,通过操作提示模块提示该头部检测字段对应的内存块写操作正 常;如果头部检测字段的数值是初始设置值,通过操作提示模块提示该头部检测字段对应的内存块写操作不当;所述操作提示模块用于根据第二内存判断模块的判断结果进行相应的提示。

10.根据权利要求8或9所述的检测内存访问越界的装置,其特征在于,还包括内存分配模块,所述内存分配模块用于将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的尾部检测字段长度或/和头部检测字段长度。

说明书
技术领域

技术领域

本发明属于嵌入式系统技术领域,尤其涉及一种检测内存访问越界的方法及装置。

背景技术

目前的嵌入式实时系统中,应用程序对内存的使用频率相当高,尤其是需要频繁地申请和释放内存,但由于嵌入式系统的资源比较受限,因而有效的使用内存显得尤为重要,如何利用有限的内存发挥最大的使用效率,成为了嵌入式系统进一步发展的问题关键。

在实际应用过程中,通常会由于不恰当的内存操作阻碍内存的使用,比如“内存访问越界”便是一种常见的不合法内存操作。很多情况下,由于程序代码编写上的疏忽,会造成内存访问越界的问题,例如,写入数据时超出了所申请内存块的地址范围,覆盖了其他内存区域,便可能造成内存访问越界的状况。由于内存访问越界可能会覆盖运行中的程序的数据,甚至覆盖程序代码,因而极有可能破坏到程序中正在使用的其他数据,严重的时候还可能对其他正在运行的程序或者整个系统造成影响,如果操作系统缺少保护,甚至有可能使整个系统崩溃;同时,由于内存访问越界影响其他数据的访问,会降低嵌入式系统中有限内存的使用效率。

发明内容

本发明提供了一种检测内存访问越界的方法及装置,旨在解决现有技术中由于内存访问越界造成影响程序及系统运行、降低内存使用效率的问题。

本发明是这样实现的,一种检测内存访问越界的方法,包括:

步骤a:申请内存块时在所申请内存块的尾部添加固定长度的检测字段;

步骤b:进行内存块操作时,逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值是初始设置值,提示该尾部检测字段对应的内存块内存访问正常;如果尾部检测字段的数值不是初始设置值,执行步骤c;

步骤c:提示该尾部检测字段对应的内存块存在内存访问越界的现象。

本发明的技术方案还包括:在所述步骤a中,所述检测字段的数值默认设置为容易被检测的数值。

本发明的技术方案还包括:所述步骤a还包括,将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的尾部检测字段长度。

本发明的技术方案还包括:所述步骤a还包括,将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址。

本发明的技术方案还包括:所述步骤a还包括,在所申请内存块的头部添加固定长度的头部检测字段,并将该头部检测字段的数值默认设置为容易被检测的数值。

本发明的技术方案还包括:所述步骤a还包括,将所申请内存块的长度分配为该 内存块的初始申请长度加上该内存块对应的头部检测字段长度及尾部检测字段长度。

本发明的技术方案还包括:所述步骤c后还包括,逐一检测每一个内存块的头部检测字段,并判断相应内存块对应的头部检测字段的数值是否为初始设置值,如果头部检测字段的数值不是初始设置值,提示该头部检测字段对应的内存块写操作正常,并继续判断下一个内存块的头部检测字段;如果头部检测字段的数值是初始设置值,提示该头部检测字段对应的内存块写操作不当。

本发明的另一技术方案:一种检测内存访问越界的装置,包括内存申请模块、地址返回模块、内存设置模块、第一内存判断模块和状态提示模块,所述内存申请模块用于为需要使用的程序申请内存块,所述地址返回模块用于将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址,所述内存设置模块用于在所申请内存块的尾部添加固定长度的检测字段,所述第一内存判断模块用于逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值为初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块内存访问正常;如果尾部检测字段的数值不是初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块存在内存访问越界的现象;所述状态提示模块用于根据第一内存判断模块的判断结果进行相应的内存状态提示。

本发明的技术方案还包括:还包括第二内存判断模块和操作提示模块,所述第二内存判断模块用于逐一检测每一个内存块的头部检测字段,并判断相应内存块对应的头部检测字段的数值是否为初始设置值,如果头部检测字段的数值不是初始设置值,通过操作提示模块提示该头部检测字段对应的内存块写操作正常;如果头部检测字段的数值是初始设置值,通过操作提示模块提示该头部检测字段对应的内存块写操作不当;所述操作提示模块用于根据第二内存判断模块的判断结果进行相应的提示。

本发明的技术方案还包括:还包括内存分配模块,所述内存分配模块用于将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的尾部检测字段长度或/和头部检测字段长度。

本发明的技术方案具有如下优点或有益效果:本发明检测内存访问越界的方法及装置通过在申请分配内存块时,自动在分配的内存块的头部及尾部添加设置初始默认值的检测字段,当对内存块进行相应操作时,分别对尾部和头部检测字段进行检测,从而快速有效地检测出内存访问越界的现象,并进一步检测出造成内存访问越界现象的原因,使得嵌入式系统中不恰当的内存越界操作能够及时被发现和进行针对性地维护操作,从而加强对系统内存数据的保护强度,提高嵌入式系统中有限内存的使用效率。

附图说明

附图1是本发明第一实施例的检测内存访问越界的方法的流程图;

附图2是本发明第二实施例的检测内存访问越界的方法的流程图;

附图3是本发明第三实施例的检测内存访问越界的方法的流程图;

附图4是本发明第一实施例的检测内存访问越界的装置的结构示意图;

附图5是本发明第二实施例的检测内存访问越界的装置的结构示意图;

附图6是本发明第三实施例的检测内存访问越界的装置的结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

请参阅图1,是本发明第一实施例的检测内存访问越界的方法的流程图。本发明第一实施例的检测内存访问越界的方法包括以下步骤:

步骤100:申请内存块时在所申请内存块的尾部添加固定长度的检测字段;

该步骤中,为了便于检测,该检测字段的数值默认设置为容易被检测的数值;可将检测字段的每一位数值设置为同样的值,以检测字段的长度为4bit为例,可以将该4位字段的检测字段设置为FFFF或者1111;其中,可将所有内存块的检测字段设置为统一值,也可将每一个内存块的检测字段区分设置。

步骤110:进行内存块操作时,逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值是初始设置值,执行步骤120;如果尾部检测字段的数值不是初始设置值,执行步骤130;

该步骤中,具体的检测方法为:为保证日常代码的健壮性,可以在任何一个有内存申请和释放或者对内存进行其他操作的接口里进行内存越界的检测,即将检测函数插入至malloc、free、memcpy等相应类别的内存申请或释放函数中,在每次调用内存申请或释放函数时,检测内存链表中内存块的尾部检测字段是否为初始设置值,由于检测字段的初始设置值的特殊性,且由于内存块的初始申请长度通常相对实际应用会有所盈余,因而如果检测到尾部检测字段的数值并非初始设置值时,与该检测字段对应的内存块便极有可能存在内存访问越界的现象,如果检测到尾部检测字段的数值为初始设置值时,则说明该检测字段对应的内存块内存访问正常。其中,设置的检测字段越长时,检测的可靠性越高,但如果太长会造成内存浪费的现象,在本发明实施方式中,检测字段的长度设置为4bit时为最佳方案。

步骤120:提示该尾部检测字段对应的内存块内存访问正常;

步骤130:提示该尾部检测字段对应的内存块存在内存访问越界的现象。

请参阅图2,是本发明第二实施例的的检测内存访问越界的方法的流程图。本发明第二实施例的检测内存访问越界的方法包括以下步骤:

步骤200:为需要使用的程序申请内存块;

步骤210:在所申请内存块的尾部添加固定长度的检测字段,并将该检测字段的数值默认设置为容易被检测的数值;

该步骤中,为了便于检测,可将检测字段的每一位数值设置为同样的值,以检测字段的长度为4bit为例,可以将该4位字段的检测字段设置为FFFF或者1111;其中,可将所有内存块的检测字段设置为统一值,也可将每一个内存块的检测字段区分设置。

步骤220:将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的尾部检测字段长度;

该步骤中,假设内存块的初始申请长度为M,所添加的检测字段长度为N,那么该申请内存块的长度则自动分配为M+N。

步骤230:将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址;

其中,返回的初始地址为实际分配的内存块的初始地址,即初始申请长度(M)的内存块的初始地址。

步骤240:进行内存块操作时,逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值为初始设置值,执行步骤250;如果尾部检测字段的数值不是初始设置值,执行步骤260;

该步骤中,具体的检测方法为:为保证日常代码的健壮性,可以在任何一个有内存申请和释放或者对内存进行其他操作的接口里进行内存越界的检测,即将检测函数插入至malloc、free、memcpy等相应类别的内存申请或释放函数中,在每次调用内存申请或释放函数时,检测内存链表中内存块的尾部检测字段是否为初始设置值,由于检测字段的初始设置值的特殊性,且由于内存块的初始申请长度通常相对实际应用会有所盈余,因而如果检测到尾部检测字段的数值并非初始设置值时,与该检测字段对应的内存块便极有可能存在内存访问越界的现象,如果检测到尾部检测字段的数值为初始设置值时,则说明该检测字段对应的内存块内存访问正常。其中,设置的检测字段越长时,检测的可靠性越高,但如果太长会造成内存浪费的现象,在本发明实施方式中,检测字段的长度设置为4bit时为最佳方案。

步骤250:提示该尾部检测字段对应的内存块内存访问正常,并重新执行步骤240;

步骤260:提示该尾部检测字段对应的内存块存在内存访问越界的现象;

步骤270:结束本次检测。

请参阅图3,是本发明第三实施例的的检测内存访问越界的方法的流程图。本发明第三实施例的检测内存访问越界的方法包括以下步骤:

步骤300:为需要使用的程序申请内存块;

步骤310:在所申请内存块的头部及尾部分别添加固定长度的头部检测字段和尾部检测字段,并将该检测字段的数值默认设置为容易被检测的数值;

该步骤中,为了便于检测,可将检测字段的每一位数值设置为同样的值,以检测字段的长度为4bit为例,可以将该4位字段的检测字段设置为FFFF或者1111;其中,可将所有内存块的检测字段设置为统一值,也可将每一个内存块的头部检测字段和尾部检测字段区分设置。

步骤320:将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的头部检测字段长度及尾部检测字段长度;

该步骤中,假设内存块的初始申请长度为M,所添加的头部检测字段长度为N1,所添加的尾部检测字段长度为N2,那么该申请内存块的长度则自动分配为M+N1+N2。

步骤330:将分配好的内存块接入内存链表中,并返回每个对应内存块对应的初始地址;

其中,返回的初始地址为实际分配的内存块的初始地址(M)加上头部检测字段长度(N1)后的地址。

步骤340:进行内存块操作时,逐一检测每一个内存块的尾部检测字段,并判断相 应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值为初始设置值,执行步骤350;如果尾部检测字段的数值不是初始设置值,执行步骤360;

该步骤中,具体的检测方法为:为保证日常代码的健壮性,可以在任何一个有内存申请和释放或者对内存进行其他操作的接口里进行内存越界的检测,即将检测函数插入至malloc、free、memcpy等相应类别的内存申请或释放函数中,在每次调用内存申请或释放函数时,检测内存链表中内存块的尾部检测字段是否为初始设置值,由于检测字段的初始设置值的特殊性,且由于内存块的初始申请长度通常相对实际应用会有所盈余,因而如果检测到尾部检测字段的数值并非初始设置值时,与该检测字段对应的内存块便极有可能存在内存访问越界的现象,如果检测到尾部检测字段的数值为初始设置值时,则说明该检测字段对应的内存块内存访问正常。其中,设置的检测字段越长时,检测的可靠性越高,但如果太长会造成内存浪费的现象,在本发明实施方式中,检测字段的长度设置为4bit时为最佳方案。

步骤350:提示该尾部检测字段对应的内存块内存访问正常,并重新执行步340;

步骤360:提示该尾部检测字段对应的内存块存在内存访问越界的现象;

步骤370:逐一检测每一个内存块的头部检测字段,并判断相应内存块对应的头部检测字段的数值是否为初始设置值,如果头部检测字段的数值不是初始设置值,执行步骤380;如果头部检测字段的数值是初始设置值,执行步骤390;

该步骤中,例如:检测到内存块3的尾部检测字段与初始设置值不相同,可以判断该内存块3发生了内存访问越界现象,但是此时并不能得知具体是由于哪一个内存块的写操作不当造成的“越界”现象,此时可以进一步检测内存块3的头部检测字段,若内存块3的头部检测字段并没有发现异常,可以断定此“越界”现象是由于对内存块3的写操作不当而造成的,而若检测内存块3的头部检测字段与初始设置值不同,则可以断定该“越界”现象至少是由于对内存块2或是内存块1的写操作不当而造成的,同理,通过依次对内存块2的尾部、头部检测字段,以及内存块1的尾部、头部检测字段进行检测,从而进一步检测出该“越界”现象发生的缘由,从而可以有针对性地进行维护操作。

步骤380:提示该头部检测字段对应的内存块写操作正常,并重新执行步骤370;

步骤390:提示该头部检测字段对应的内存块写操作不当;

步骤400:结束本次检测。

请参阅图4,是本发明第一实施例的的检测内存访问越界的装置的结构示意图。本发明第一实施例的的检测内存访问越界的装置包括内存申请模块、地址返回模块、内存设置模块、第一内存判断模块和状态提示模块,其中,

内存申请模块用于为需要使用的程序申请内存块;

地址返回模块用于将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址;

内存设置模块用于在所申请内存块的尾部添加固定长度的检测字段;其中,为了便于检测,可将检测字段的每一位数值设置为同样的值,以检测字段的长度为4bit为例,可以将该4位字段的检测字段设置为FFFF或者1111;另外,可将所有内存块的检测字段设置为统一值,也可将每一个内存块的检测字段区分设置。

第一内存判断模块用于逐一检测每一个内存块的尾部检测字段,并判断相应内存 块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值为初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块内存访问正常;如果尾部检测字段的数值不是初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块存在内存访问越界的现象;其中,具体的检测方法为:为保证日常代码的健壮性,可以在任何一个有内存申请和释放或者对内存进行其他操作的接口里进行内存越界的检测,即将检测函数插入至malloc、free、memcpy等相应类别的内存申请或释放函数中,在每次调用内存申请或释放函数时,检测内存链表中内存块的尾部检测字段是否为初始设置值,由于检测字段的初始设置值的特殊性,且由于内存块的初始申请长度通常相对实际应用会有所盈余,因而如果检测到尾部检测字段的数值并非初始设置值时,与该检测字段对应的内存块便极有可能存在内存访问越界的现象,如果检测到尾部检测字段的数值为初始设置值时,则说明该检测字段对应的内存块内存访问正常。其中,设置的检测字段越长时,检测的可靠性越高,但如果太长会造成内存浪费的现象,在本发明实施方式中,检测字段的长度设置为4bit时为最佳方案。

状态提示模块用于根据第一内存判断模块的判断结果进行相应的内存状态提示。

请参阅图5,是本发明第二实施例的的检测内存访问越界的装置的结构示意图。本发明第二实施例的的检测内存访问越界的装置包括内存申请模块、内存设置模块、内存分配模块、地址返回模块、第一内存判断模块和状态提示模块,其中

内存申请模块用于为需要使用的程序申请内存块;

内存设置模块用于在所申请内存块的尾部添加固定长度的检测字段,并将该检测字段的数值默认设置为容易被检测的数值;其中,为了便于检测,可将检测字段的每一位数值设置为同样的值,以检测字段的长度为4bit为例,可以将该4位字段的检测字段设置为FFFF或者1111;另外,可将所有内存块的检测字段设置为统一值,也可将每一个内存块的检测字段区分设置。

内存分配模块用于将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的尾部检测字段长度;其中,假设内存块的初始申请长度为M,所添加的检测字段长度为N,那么该申请内存块的长度则自动分配为M+N。

地址返回模块用于将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址;其中,返回的初始地址为实际分配的内存块的初始地址,即初始申请长度(M)的内存块的初始地址。

第一内存判断模块用于逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值为初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块内存访问正常;如果尾部检测字段的数值不是初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块存在内存访问越界的现象;

其中,具体的检测方法为:为保证日常代码的健壮性,可以在任何一个有内存申请和释放或者对内存进行其他操作的接口里进行内存越界的检测,即将检测函数插入至malloc、free、memcpy等相应类别的内存申请或释放函数中,在每次调用内存申请或释放函数时,检测内存链表中内存块的尾部检测字段是否为初始设置值,由于检测字段的初始设置值的特殊性,且由于内存块的初始申请长度通常相对实际应用会有所盈余,因而如果检 测到尾部检测字段的数值并非初始设置值时,与该检测字段对应的内存块便极有可能存在内存访问越界的现象,如果检测到尾部检测字段的数值为初始设置值时,则说明该检测字段对应的内存块内存访问正常。其中,设置的检测字段越长时,检测的可靠性越高,但如果太长会造成内存浪费的现象,在本发明实施方式中,检测字段的长度设置为4bit时为最佳方案。

状态提示模块用于根据第一内存判断模块的判断结果进行相应的内存状态提示。

请参阅图6,是本发明第三实施例的的检测内存访问越界的装置的结构示意图。本发明第三实施例的的检测内存访问越界的装置包括内存申请模块、内存设置模块、内存分配模块、地址返回模块、第一内存判断模块、状态提示模块、第二内存判断模块和操作提示模块,其中

内存申请模块用于为需要使用的程序申请内存块;

内存设置模块用于在所申请内存块的头部及尾部分别添加固定长度的头部检测字段和尾部检测字段,并将该检测字段的数值默认设置为容易被检测的数值;其中,为了便于检测,可将检测字段的每一位数值设置为同样的值,以检测字段的长度为4bit为例,可以将该4位字段的检测字段设置为FFFF或者1111;另外,可将所有内存块的检测字段设置为统一值,也可将每一个内存块的头部检测字段和尾部检测字段区分设置。

内存分配模块用于将所申请内存块的长度分配为该内存块的初始申请长度加上该内存块对应的头部检测字段长度及尾部检测字段长度;其中,假设内存块的初始申请长度为M,所添加的头部检测字段长度为N1,所添加的尾部检测字段长度为N2,那么该申请内存块的长度则自动分配为M+N1+N2。

地址返回模块用于将分配好的内存块接入内存链表中,并返回每个内存块对应的初始地址;其中,返回的初始地址为实际分配的内存块的初始地址(M)加上头部检测字段长度(N1)后的地址。

第一内存判断模块用于逐一检测每一个内存块的尾部检测字段,并判断相应内存块对应的尾部检测字段的数值是否为初始设置值,如果尾部检测字段的数值为初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块内存访问正常;如果尾部检测字段的数值不是初始设置值,通过状态提示模块提示该尾部检测字段对应的内存块存在内存访问越界的现象;

其中,具体的检测方法为:为保证日常代码的健壮性,可以在任何一个有内存申请和释放或者对内存进行其他操作的接口里进行内存越界的检测,即将检测函数插入至malloc、free、memcpy等相应类别的内存申请或释放函数中,在每次调用内存申请或释放函数时,检测内存链表中内存块的尾部检测字段是否为初始设置值,由于检测字段的初始设置值的特殊性,且由于内存块的初始申请长度通常相对实际应用会有所盈余,因而如果检测到尾部检测字段的数值并非初始设置值时,与该检测字段对应的内存块便极有可能存在内存访问越界的现象,如果检测到尾部检测字段的数值为初始设置值时,则说明该检测字段对应的内存块内存访问正常。其中,设置的检测字段越长时,检测的可靠性越高,但如果太长会造成内存浪费的现象,在本发明实施方式中,检测字段的长度设置为4bit时为最佳方案。

状态提示模块用于根据第一内存判断模块的判断结果进行相应的内存状态提 示;

第二内存判断模块用于逐一检测每一个内存块的头部检测字段,并判断相应内存块对应的头部检测字段的数值是否为初始设置值,如果头部检测字段的数值不是初始设置值,通过操作提示模块提示该头部检测字段对应的内存块写操作正常;如果头部检测字段的数值是初始设置值,通过操作提示模块提示该头部检测字段对应的内存块写操作不当;

其中,例如:检测到内存块3的尾部检测字段与初始设置值不相同,可以判断该内存块3发生了内存访问越界现象,但是此时并不能得知具体是由于哪一个内存块的写操作不当造成的“越界”现象,此时可以进一步检测内存块3的头部检测字段,若内存块3的头部检测字段并没有发现异常,可以断定此“越界”现象是由于对内存块3的写操作不当而造成的,而若检测内存块3的头部检测字段与初始设置值不同,则可以断定该“越界”现象至少是由于对内存块2或是内存块1的写操作不当而造成的,同理,通过依次对内存块2的尾部、头部检测字段,以及内存块1的尾部、头部检测字段进行检测,从而进一步检测出该“越界”现象发生的缘由,从而可以有针对性地进行维护操作。

操作提示模块用于根据第二内存判断模块的判断结果进行相应的提示。

本发明检测内存访问越界的方法及装置通过在申请分配内存块时,自动在分配的内存块的头部及尾部添加设置初始默认值的检测字段,当对内存块进行相应操作时,调用检测函数对分别对尾部和头部检测字段进行检测,从而快速有效地检测出内存访问越界的现象,并进一步检测出造成内存访问越界现象的原因,使得嵌入式系统中不恰当的内存越界操作能够及时被发现和进行针对性地维护操作,从而加强对系统内存数据的保护强度,提高嵌入式系统中有限内存的使用效率。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

本文发布于:2023-04-14 17:36:57,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/86609.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图