发明内容
为解决上述问题,本发明提出了一种内存越界的检测方法、装置、设备和存储介质,能够有效检测内存越界的问题,为避免发生内存越界而导致程序崩溃奠定了基础。
第一方面,本申请实施例提供一种内存越界的检测方法,该方法包括:
检测到访问内存空间的目标写入指令,确定出所述目标写入指令对应的目标内存空间;其中,所述目标内存空间的前后两端均设置有处于不可访问状态的目标缓冲区;
调用所述目标写入指令所对应的检测接口,利用所述检测接口检测所述目标写入指令的运行过程是否占用所述目标内存空间所对应的目标缓冲区;
基于检测结果确定是否存在内存越界问题。
这样,由于目标内存空间的前后两端设置有处于不可访问状态的目标缓冲区,换言之,本申请实施例所述目标内存空间比目标写入指令运行所占用的实际内存空间多,即多出额外设置的目标缓冲区,且所述目标缓冲区处于实际内存空间的前后两端,如此,便于基于检测接口来检测目标写入指令的运行过程中是否存在占用目标缓冲区的内存越界问题,进而为有效检测出内存越界问题奠定了基础,同时,为避免发生内存越界而导致程序崩溃奠定了基础。
在一实施例中,所述利用所述检测接口检测所述目标写入指令的运行过程是否占用所述目标内存空间所对应的目标缓冲区,包括:
利用所述检测接口检测所述目标写入指令的运行过程是否修改所述目标内存空间所对应的目标缓冲区的状态值。
这里,实际应用中,处于不可访问状态的目标缓冲区的状态值设置为预设的固定值,因此,可以通过检测接口检测目标写入指令的运行过程是否存在修改所述目标内存空间所对应的目标缓冲区的状态值的修改操作来判断是否存在内存越界问题,如此,通过管理目标缓冲区的状态值即可有效检测检测内存越界问题,且在内存越界事件发生的时刻即可检测出,因此,该检测方式检测效率高,性能代价低,为工程化应用奠定了基础。
在一实施例中,所述方法还包括:确定检测结果表征检测到存在占用所述目标内存空间所对应的目标缓冲区的内存越界问题,至少基于所述目标写入指令所对应的目标内存空间生成越界信息,并发布所述越界信息。
在一实施例中,当检测结果确定出存在内存越界问题,则生成并发布越界信息,如此,最大化避免了发生内存越界而导致程序崩溃的问题,同时,也避免了程序发布后发生越界问题而导致程序崩溃的情况,进而为提升程序的稳定性以及提升用户体验奠定了基础。
在一实施例中,在检测到访问内存空间的目标写入指令之前,所述方法还包括:
将函数访问函数栈上内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征函数栈上的内存空间;和/或,
将访问全局作用域的内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征全局作用域所针对的全局内存空间。
在一实施例中,在调用所述目标写入指令所对应的检测接口之前,所述方法还包括:
在所述目标写入指令中设置检测接口,其中,所述检测接口能够检测所述目标写入指令的运行过程中是否存在占用目标内存空间所对应的目标缓冲区的内存越界问题。
在一实施例中,所述方法还包括:检测到函数使用函数栈上的内存空间,在函数栈上函数对应的内存空间的前后端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的内存空间作为函数对应的目标内存空间,其中,所述目标缓冲区处于不可访问状态;
或者,
检测到使用全局作用域的全局内存空间,在全局作用域的全局内存空间的前后两端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的全局内存空间作为全局作用域对应的目标内存空间;其中,所述目标缓冲区处于不可访问状态。
这里,为避免发生内存越界而导致程序崩溃后再去解决问题,本申请实施例在程序编译期间即对特定内存空间(即函数栈上函数对应的内存空间,或者,全局作用域对应的全局内存空间)进行处理,以在特定内存空间的前后端额外增加内存缓冲区(也即目标缓冲区),该额外设置的目标缓冲区处于不可访问状态,如此,为后续提高检测效率,有效避免发生内存越界而导致程序崩溃的问题奠定了基础。
第二方面,本申请实施例提供一种内存越界的检测装置,所述装置包括:
检测单元,用于检测到访问内存空间的目标写入指令,确定出所述目标写入指令对应的目标内存空间;其中,所述目标内存空间的前后两端均设置有处于不可访问状态的目标缓冲区;
处理单元,用于调用所述目标写入指令所对应的检测接口,利用所述检测接口检测所述目标写入指令的运行过程是否占用所述目标内存空间所对应的目标缓冲区;基于检测结果确定是否存在内存越界问题。
在一实施例中,处理单元,还用于利用所述检测接口检测所述目标写入指令的运行过程是否修改所述目标内存空间所对应的目标缓冲区的状态值。
在一实施例中,处理单元,还用于确定检测结果表征检测到存在占用所述目标内存空间所对应的目标缓冲区的内存越界问题,至少基于所述目标写入指令所对应的目标内存空间生成越界信息,并发布所述越界信息。
在一实施例中,处理单元,还用于:
将函数访问函数栈上内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征函数栈上的内存空间;和/或,
将访问全局作用域的内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征全局作用域所针对的全局内存空间。
在一实施例中,处理单元,还用于在所述目标写入指令中设置检测接口,其中,所述检测接口能够检测所述目标写入指令的运行过程中是否存在占用目标内存空间所对应的目标缓冲区的内存越界问题。
在一实施例中,处理单元,还用于:
检测到函数使用函数栈上的内存空间,在函数栈上函数对应的内存空间的前后端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的内存空间作为函数对应的目标内存空间,其中,所述目标缓冲区处于不可访问状态;
或者,
检测到使用全局作用域的全局内存空间,在全局作用域的全局内存空间的前后两端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的全局内存空间作为全局作用域对应的目标内存空间;其中,所述目标缓冲区处于不可访问状态。
第三方面,本申请实施例提供一种内存越界的检测设备,包括:
一个或多个处理器;
与所述一个或多个处理器通信连接的存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序被配置为执行以上所述的方法。
第四方面,本申请实施例提供一种计算机可读存储介质,其存储有计算机程序,该程序被处理器执行时实现以上所述的方法。
这样,本发明实施例所述的内存越界的检测方法、装置、设备和存储介质,由于目标内存空间的前后两端设置有处于不可访问状态的目标缓冲区,换言之,本申请实施例所述目标内存空间比目标写入指令运行所占用的实际内存空间多,即多出额外设置的目标缓冲区,且所述目标缓冲区处于实际内存空间的前后两端,如此,便于基于检测接口来检测目标写入指令的运行过程中是否存在占用目标缓冲区的内存越界问题,进而为有效检测出内存越界问题奠定了基础,同时,为避免发生内存越界而导致程序崩溃奠定了基础。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在本申请的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。
通过C/C++语言编写的高级语言代码常会基于需求声明并使用内存变量,如下场景:
场景一:通过C/C++语言编写的高级语言代码会在函数调用栈上声明并使用栈上的内存变量,进而访问内存空间,在使用的过程中如果出现异常状态,就会发生栈上内存溢出的越界情况,一旦越界就会导致函数栈上保存的上一级函数中的寄存器数据被异常修改,从而导致返回上一级函数时发生程序崩溃。
场景二:通过C/C++语言编写的高级语言代码会在全局作用域中声明并使用全局内存变量,进而访问内存空间,在使用的过程中如果出现异常状态,就会发生全局内存溢出的越界情况,一旦越界就会导致全局内存以及代码段被异常修改,从而导致程序崩溃。
上述场景出现的技术问题,对程序开发者以及应用而言,都是一个缺陷和潜在的问题;基于此,本申请实施例提供了一种内存越界的检测方法、装置、设备和存储介质;具体地,图1为本发明实施例内存越界的检测方法的实现流程示意图,如图1所示,所述方法包括:
步骤101:检测到访问内存空间的目标写入指令,确定出所述目标写入指令对应的目标内存空间;其中,所述目标内存空间的前后两端均设置有处于不可访问状态的目标缓冲区。
本实施例中,所述目标内存空间比目标写入指令运行所占用的实际内存空间多,即多出额外设置的目标缓冲区,且所述目标缓冲区处于实际内存空间的前后两端,这样,便可通过检测目标写入指令的运行过程中是否会占用目标缓冲区来确定是否存在内存越界问题;这里,由于目标内存空间大于目标写入指令运行过程中所占用的实际内存空间,所以,能够最大化避免发生内存越界而导致程序崩溃的问题,而且,能够在内存越界发生的初始阶段检测出,所以,进一步为避免发生内存越界而导致程序崩溃提供了技术保证,同时,也为提升程序的稳定性以及提升用户体验奠定了基础。
在一具体示例中,所述目标写入指令可以具体为存储指令(store指令),或加载指令(load指令)。进一步地,实际应用中,所述目标写入指令可以具体为如下场景下的写入指令;比如,在检测到访问内存空间的目标写入指令之前,可以采用如下方式来确定目标写入指令,具体地:
方式一:将函数访问函数栈上内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征函数栈上的内存空间;也就是说,目标写入指令为函数访问函数栈上内存空间所对应的写入指令。
方式二:将访问全局作用域的内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征全局作用域所针对的全局内存空间;也就是说,目标写入指令为访问全局作用域的内存空间所对应的写入指令。
实际应用中,目标写入指令可以为上述两种方式所确定出的任一指令。
在一具体示例中,为避免发生内存越界而导致程序崩溃后再去解决问题,在程序编译期间即对特定内存空间进行处理,具体地,可以采用如下方式进行处理:
方式一:检测到函数使用函数栈上的内存空间,在函数栈上函数对应的内存空间的前后端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的内存空间作为函数对应的目标内存空间,其中,所述目标缓冲区处于不可访问状态;相应地,此时,将函数使用函数栈上目标内存空间的写入指令作为目标写入指令,所述目标写入指令所对应的内存空间即为目标内存空间。
方式二:检测到使用全局作用域的全局内存空间,在全局作用域的全局内存空间的前后两端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的全局内存空间作为全局作用域对应的目标内存空间;其中,所述目标缓冲区处于不可访问状态;相应地,此时,将使用全局作用域的目标内存空间的写入指令作为目标写入指令,所述目标写入指令所对应的内存空间即为目标内存空间。
实际应用中,目标内存空间的形成方式可以采用上述两种方式中的任意一种。
在一具体示例中,为最大化避免发生内存越界而导致程序崩溃的问题,本申请实施例可以在调用所述目标写入指令所对应的检测接口之前,在所述目标写入指令中设置检测接口,如此,利用所述检测接口检测所述目标写入指令的运行过程中是否存在占用目标内存空间所对应的目标缓冲区的内存越界问题。
步骤102:调用所述目标写入指令所对应的检测接口,利用所述检测接口检测所述目标写入指令的运行过程是否占用所述目标内存空间所对应的目标缓冲区。
实际应用中,处于不可访问状态的目标缓冲区的状态值设置为预设的固定值,因此,可以通过检测接口检测目标写入指令的运行过程是否存在修改所述目标内存空间所对应的目标缓冲区的状态值的修改操作来判断是否存在内存越界问题,具体地,利用所述检测接口检测所述目标写入指令的运行过程是否修改所述目标内存空间所对应的至少一个目标缓冲区的状态值,如此,通过管理目标缓冲区的状态值即可有效检测检测内存越界问题,且在内存越界事件发生的时刻即可检测出,因此,该检测方式检测效率高,性能代价低,为工程化应用奠定了基础。
步骤103:基于检测结果确定是否存在内存越界问题。
实际应用中,当检测结果表征所述目标写入指令的运行过程中存在占用所述目标内存空间所对应的目标缓冲区的情况,则确定存在内存越界问题;而当检测结果表征所述目标写入指令的运行过程中不存在占用所述目标内存空间所对应的目标缓冲区的情况,则确定不存在内存越界问题。进一步地,为及时通知技术人员,及时解决越界问题,本申请实施例中,在确定检测结果表征检测到存在占用所述目标内存空间所对应的目标缓冲区的内存越界问题后,还会至少基于所述目标写入指令所对应的目标内存空间生成越界信息,并发布所述越界信息,比如,越界信息至少包括:函数栈的特征信息,及函数栈上发生越界的函数的特征信息;或者,全局作用域的特征信息,全局内存空间中发生越界问题的特征信息,等能够定位到越界问题发生位置的相关信息,如此,便于技术基于越界信息对越界问题进行修正,进而避免程序崩溃。
这样,由于目标内存空间的前后两端设置有处于不可访问状态的目标缓冲区,换言之,本申请实施例所述目标内存空间比目标写入指令运行所占用的实际内存空间多,即多出额外设置的目标缓冲区,且所述目标缓冲区处于实际内存空间的前后两端,如此,便于基于检测接口来检测目标写入指令的运行过程中是否存在占用目标缓冲区的内存越界问题,进而为有效检测出内存越界问题奠定了基础,同时,为避免发生内存越界而导致程序崩溃奠定了基础。
以下结合具体应用场景对本发明实施例做进一步详细说明;具体地,
场景一,针对函数栈上内存越界问题,为解决该问题,在程序编译时在函数栈上的内存变量(也即内存空间)前后两端添加内存缓冲区(也即以上所述的目标缓冲区),并添加记录内存缓冲区的状态的管理块信息(用于管理内存缓冲区的状态值),一旦在程序代码运行时出现访问内存缓冲区的越界问题,就能够及时被发现,且该过程是在程序代码开发期间发现的,如此,便可在程序开发期间解决越界问题,避免程序代码发布后发生崩溃。
具体地,在编译器中增加专门的针对函数栈的内存处理模块,并利用所述内存处理模块在编译每一个函数时均对函数中声明使用的函数栈上内存变量进行处理,以在函数栈上的内存变量的前后两端增加额外的内存缓冲区,并增加设置内存缓冲区状态(也即内存缓冲区的状态值)的额外代码;同时,对每一个操作栈上内存的写入指令(load指令,和/或,store指令)进行处理,以在前面增加额外的检测代码(即检测接口),一旦程序运行中发生函数栈上内存越界,就会修改额外设置的内存缓冲区的状态值,由于额外设置的内存缓冲区已经被设置为特殊的不可访问状态值,因此,当存在修改额外设置的内存缓冲区的状态值的情况,就会被预先在编译时添加的检测代码所发现,内存越界问题就会被发现,并将内存越界的越界信息提供出来,如此,程序开发者便可基于越界信息对越界问题进行修正,从而避免问题发布后在用户终端上发生崩溃。
具体步骤,如图2所示,编译程序源码,发现函数中有使用函数栈上的内存变量,在函数栈上的内存变量的前后端额外添加内存缓冲区,设置内存缓冲区为不可修改状态,为针对函数的每一个访问内存空间的load/store指令添加检测代码;进一步地,运行程序,当执行load/store指令时,调用检测代码,若发生内存越界,就会需要改变内存缓冲区的状态值,也即检测代码会判断写入的地址是否在内存缓冲区,若在,则存在内存越界,否则,不存在内存越界;当存在内存越界时,打印具体的越界信息,程序开发者会基于越界信息修复内存越界问题,修复完毕后,程序正常发布或执行。
这样,利用本申请实施例的检测方法能够在程序开发和测试阶段提前发现并解决函数栈上内存越界的问题,因此,避免了程序发布后发生内存越界并导致程序崩溃的问题,提升了程序的稳定性,同时也提升了基础用户体验。
场景二:针对全局作用域上的全局内存越界问题,为解决该问题,在程序编译时在全局作用域的内存变量(也即内存空间)前后两端添加内存缓冲区(也即以上所述的目标缓冲区),并添加记录内存缓冲区的状态的管理块信息(用于管理内存缓冲区的状态值),一旦在程序代码运行时出现访问内存缓冲区的越界问题,就能够及时被发现,且该过程是在程序代码开发期间发现的,如此,便可在程序开发期间解决越界问题,避免程序代码发布后发生崩溃。
具体地,在编译器中增加专门的针对全局作用域的内存处理模块,并利用所述内存处理模块在编译每一个源码文件时都对全局作用域中声明使用的全局内存变量进行处理,以在全局内存变量(也即全局内存空间)的前后两端增加额外的内存缓冲区,并增加设置内存缓冲区状态(也即内存缓冲区的状态值)的额外代码;同时,对每一个操作全局内存的写入指令(load指令,和/或,store指令)进行处理,以在前面增加额外的检测代码(即检测接口),一旦程序运行中发生内存越界,就会修改额外设置的内存缓冲区的状态值,由于额外设置的内存缓冲区已经被设置为特殊的不可访问状态值,因此,当存在修改额外设置的内存缓冲区的状态值的情况,就会被预先在编译时添加的检测代码所发现,内存越界问题就会被发现,并将越界的具体信息提供出来,如此,程序开发者便可基于越界信息对越界问题进行修正,从而避免问题发布后在用户终端上发生崩溃。
具体步骤,如图3所示,编译程序源码,发现源码中有使用全局作用域的全局内存变量,在全局内存变量的前后两端额外添加内存缓冲区,设置内存缓冲区为不可修改状态,为每一个访问内存的load/store指令添加检测代码;进一步地,运行程序,当执行load/store指令时,调用检测代码,若发生内存越界,就会需要改变内存缓冲区的状态值,也即检测代码会判断写入的地址是否在内存缓冲区,若在,则存在内存越界,否则,不存在内存越界;当存在内存越界时,打印具体的越界信息,程序开发者会基于越界信息修复内存越界问题,修复完毕后,程序正常发布或执行。
这样,利用本申请实施例的检测方法能够在程序开发和测试阶段提前发现并解决全局内存越界的问题,因此,避免了程序发布后发生内存越界并导致程序崩溃的问题,提升了程序的稳定性,同时也提升了基础用户体验。
本申请实施例还提供了一种内存越界的检测装置,如图4所示,所述装置包括:
检测单元41,用于检测到访问内存空间的目标写入指令,确定出所述目标写入指令对应的目标内存空间;其中,所述目标内存空间的前后两端均设置有处于不可访问状态的目标缓冲区;
处理单元42,用于调用所述目标写入指令所对应的检测接口,利用所述检测接口检测所述目标写入指令的运行过程是否占用所述目标内存空间所对应的目标缓冲区;基于检测结果确定是否存在内存越界问题。
在一实施例中,处理单元42,还用于利用所述检测接口检测所述目标写入指令的运行过程是否修改所述目标内存空间所对应的目标缓冲区的状态值。
在一实施例中,处理单元42,还用于确定检测结果表征检测到存在占用所述目标内存空间所对应的目标缓冲区的内存越界问题,至少基于所述目标写入指令所对应的目标内存空间生成越界信息,并发布所述越界信息。
在一实施例中,处理单元42,还用于:
将函数访问函数栈上内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征函数栈上的内存空间;和/或,
将访问全局作用域的内存空间的写入指令作为目标写入指令,其中,所述目标写入指令对应的目标内存空间表征全局作用域所针对的全局内存空间。
在一实施例中,处理单元42,还用于在所述目标写入指令中设置检测接口,其中,所述检测接口能够检测所述目标写入指令的运行过程中是否存在占用目标内存空间所对应的目标缓冲区的内存越界问题。
在一实施例中,处理单元42,还用于:
检测到函数使用函数栈上的内存空间,在函数栈上函数对应的内存空间的前后端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的内存空间作为函数对应的目标内存空间,其中,所述目标缓冲区处于不可访问状态;
或者,
检测到使用全局作用域的全局内存空间,在全局作用域的全局内存空间的前后两端分别设置额外的目标缓冲区后,将包含有额外的目标缓冲区的全局内存空间作为全局作用域对应的目标内存空间;其中,所述目标缓冲区处于不可访问状态。
这里需要指出的是:以上装置实施例项的描述,与上述方法描述是类似的,具有同方法实施例相同的有益效果,因此不做赘述。对于本发明装置实施例中未披露的技术细节,本领域的技术人员请参照本发明方法实施例的描述而理解,为节约篇幅,这里不再赘述。
本申请实施例还提供了一种内存越界的检测设备,包括:一个或多个处理器;与所述一个或多个处理器通信连接的存储器;一个或多个应用程序;其中,所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序被配置为执行以上所述的方法。
在一具体示例中,本申请实施例所述的检测设备可具体为如图5所示的结构,所述检测设备至少包括处理器51、存储介质52以及至少一个外部通信接口53;所述处理器51、存储介质52以及外部通信接口53均通过总线54连接。所述处理器51可为微处理器、中央处理器、数字信号处理器或可编程逻辑阵列等具有处理功能的电子元器件。所述存储介质中存储有计算机可执行代码,所述计算机可执行代码能够执行以上任一实施例所述的方法。在实际应用中,所述检测单元41以及处理单元42均可以通过所述处理器51实现。
这里需要指出的是:以上检测设备实施例项的描述,与上述方法描述是类似的,具有同方法实施例相同的有益效果,因此不做赘述。对于本发明检测设备实施例中未披露的技术细节,本领域的技术人员请参照本发明方法实施例的描述而理解,为节约篇幅,这里不再赘述。
本申请实施例还提供了一种计算机可读存储介质,其存储有计算机程序,该程序被处理器执行时实现以上所述的方法。
这里,计算机可读存储介质可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读存储介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式只读存储器(CDROM)。另外,计算机可读存储介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读存储介质中。所述存储介质可以是只读存储器,磁盘或光盘等。
上述所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。