一种防止堆栈溢出的保护方法及相关设备与流程

文档序号:31873278发布日期:2022-10-21 20:18阅读:120来源:国知局
一种防止堆栈溢出的保护方法及相关设备与流程

1.本发明涉及计算机应用技术领域,特别涉及一种防止堆栈溢出的保护方法及相关设备。
背景技术
2.堆栈(这里单指栈区)是一种数据项按序排列的数据结构,总是遵循“先进后出”的原则,并且所有的操作都必须在栈顶端进行。堆栈的主要功能是暂存数据和地址,通常用来保护断点和现场。通常在程序开始的时候,需要手动的分配堆栈的大小,但是堆栈分配太大,容易造成内存空间的浪费,堆栈分配太小,就会导致堆栈溢出,即任务运行过程中会导致程序的跑飞或者覆盖关键信息,带来内存异常,程序运行错误乃至系统崩溃等一系列问题。
3.现有的技术主要采用以下方法对堆栈进行溢出检测:
4.1.采用标识符检测,具体是在栈区后面紧跟一个缓冲区,在缓冲区写入特定的值,然后循环检测该值是否被修改,如果被修改,则说明内存溢出;如果没有被修改,则说明还没有溢出。
5.但是这种方法存在以下弊端:即当溢出的值和特定的值是一样的时候,或当堆栈溢出的非常多,导致整个系统崩溃,根本无法检测到堆栈的溢出,这个现象在rtos(实时操作系统(rtos)是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统做出快速响应,调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统)中经常出现。
6.2.采用共享堆栈的方法,即至少空余出来一个堆栈,然后在堆栈溢出的时候,将所述目标堆栈里面的内容数据迁移到所述共享堆栈。
7.但是,此方案也存在弊端,即浪费空间,也即使数据很小的时候,也必须有一个空闲的堆栈。
8.因而现有技术还有待改进和提高。


技术实现要素:

9.本发明的主要目的在于提供一种防止堆栈溢出的保护方法及相关设备,旨在解决现有技术中堆栈出现溢出时,而导致的程序运行错误乃至系统崩溃的问题。
10.为了达到上述目的,本发明采取了以下技术方案:
11.一种防止堆栈溢出的保护方法,所述防止堆栈溢出的保护方法包括以下步骤:
12.将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志;
13.若初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;
14.若当前堆栈地址比当前堆栈栈底的地址小时,则判断是否存在扩展堆栈,当存在
所述扩展堆栈时,则生成第二堆栈异常标志;
15.当不存在所述扩展堆栈时,计算初始堆栈栈顶的地址与ram的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈和第四堆栈异常标志;
16.根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。
17.所述防止堆栈溢出的保护方法中,所述将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志的步骤之前还包括:
18.定义当前堆栈地址寄存器、初始堆栈栈顶寄存器、初始堆栈大小寄存器、堆栈异常标志寄存器、扩展堆栈大小寄存器和扩展堆栈栈顶寄存器,并分别对应存放当前堆栈地址、初始堆栈栈顶、初始堆栈大小、堆栈异常标志、扩展堆栈大小和扩展堆栈栈顶。
19.所述防止堆栈溢出的保护方法中,所述将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志的步骤具体包括:
20.根据ram基地址和ram大小计算得到ram的最高地址;
21.比较所述初始堆栈栈顶的地址与ram的最高地址,若初始堆栈栈顶的地址大于ram的最高地址,则生成所述第一堆栈异常标志。
22.所述防止堆栈溢出的保护方法中,所述若初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小的步骤具体包括:
23.根据所述初始堆栈栈顶和所述初始堆栈大小计算得到初始堆栈栈底的地址;
24.当初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,将初始堆栈栈底的地址作为当前堆栈栈底的地址,并与当前堆栈地址的大小进行比较。
25.所述防止堆栈溢出的保护方法中,所述若初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小的步骤还包括:
26.若当前堆栈地址不小于当前堆栈栈底的地址时,正常运行所述程序。
27.所述防止堆栈溢出的保护方法中,所述第一堆栈异常标志表示初始堆栈栈顶的地址大于ram的最高地址。
28.所述防止堆栈溢出的保护方法中,所述第二堆栈异常标志表示当前堆栈溢出和所述扩展堆栈溢出;所述第三堆栈异常标志表示所述当前堆栈溢出,无足够的空间扩展堆栈;所述第四堆栈异常标志表示所述当前堆栈溢出,所述扩展堆栈未溢出。
29.一种防止堆栈溢出的保护系统,所述防止堆栈溢出的保护系统包括:
30.第一堆栈异常标志生成模块,用于将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志;
31.当前堆栈地址比较模块,用于若初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;
32.第二堆栈异常标志生成模块,用于若当前堆栈地址比当前堆栈栈底的地址小时,则判断是否存在扩展堆栈,当存在所述扩展堆栈时,则生成第二堆栈异常标志;
33.预设阈值比较模块,用于当不存在所述扩展堆栈时,计算初始堆栈栈顶的地址与ram的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈和第四堆栈异常标志;
34.指示和处理模块,用于根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。
35.一种控制器,所述控制器包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的防止堆栈溢出的保护程序,所述防止堆栈溢出的保护程序被所述处理器执行时实现如上所述的防止堆栈溢出的保护方法的步骤。
36.一种计算机可读存储介质,所述计算机可读存储介质存储有防止堆栈溢出的保护程序,所述防止堆栈溢出的保护程序被处理器执行时实现如上所述的防止堆栈溢出的保护方法的步骤。
37.相较于现有技术,本发明提供的一种防止堆栈溢出的保护方法及相关设备,所述方法包括:将初始堆栈栈顶的地址与ram的最高地址进行比较,若大于则生成第一堆栈异常标志,若不大于,且当堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;若当前堆栈地址比当前堆栈栈底的地址小时,判断是否存在扩展堆栈,当存在扩展堆栈时生成第二堆栈异常标志;当不存在扩展堆栈时,计算初始堆栈栈顶的地址与ram的最高地址的差值后,与预设阈值进行比较,若小于则生成第三堆栈异常标志,若不小于,则生成一个扩展堆栈和第四堆栈异常标志;根据四个堆栈异常标志指示不同的溢出情况,并作出相应的处理。通过判断出不同的溢出情况并指示不同的溢出情况,并作出相应的处理,从而形成了有效地溢出保护。
附图说明
38.图1为本发明提供的防止堆栈溢出的保护方法的较佳实施例的流程图;
39.图2为本发明提供的防止堆栈溢出的保护方法的较佳实施例中步骤s100的流程图;
40.图3为本发明提供的防止堆栈溢出的保护方法的较佳实施例中堆栈溢出保护逻辑结构图;
41.图4为本发明提供的防止堆栈溢出的保护方法的较佳实施例中堆栈溢出保护的寄存器的关系图;
42.图5为本发明提供的防止堆栈溢出的保护方法的较佳实施例中步骤s200的流程图;
43.图6为本发明提供的防止堆栈溢出的保护方法的较佳实施例中堆栈溢出保护结构示意图;
44.图7为本发明提供的所述防止堆栈溢出的保护方法的步骤流程简图;
45.图8为本发明提供的所述防止堆栈溢出的保护方法的具体步骤流程图;
46.图9为本发明提供的防止堆栈溢出的保护系统的架构关系图;
47.图10为本发明提供的控制器的较佳实施例的运行环境示意图。
具体实施方式
48.为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
49.本技术领域技术人员可以理解,除非特意声明,这里使用的单数形式“一”、“一个”、“所述”和“该”也可包括复数形式。应该进一步理解的是,本发明的说明书中使用的措辞“包括”是指存在所述特征、整数、步骤、操作、元件和/或组件,但是并不排除存在或添加一个或多个其他特征、整数、步骤、操作、元件、组件和/或它们的组。应该理解,当我们称元件被“连接”或“耦接”到另一元件时,它可以直接连接或耦接到其他元件,或者也可以存在中间元件。此外,这里使用的“连接”或“耦接”可以包括无线连接或无线耦接。这里使用的措辞“和/或”包括一个或更多个相关联的列出项的全部或任一单元和全部组合。
50.本技术领域技术人员可以理解,除非另外定义,这里使用的所有术语(包括技术术语和科学术语),具有与本发明所属领域中的普通技术人员的一般理解相同的意义。还应该理解的是,诸如通用字典中定义的那些术语,应该被理解为具有与现有技术的上下文中的意义一致的意义,并且除非像这里一样被特定定义,否则不会用理想化或过于正式的含义来解释。
51.为了方便理解本技术实施例,首先在此介绍本发明实施例涉及到的

背景技术:

52.程序正在运行的时候,当嵌套函数过多或者程序的局部变量过多时,将导致了事先开辟的堆栈空间不够用,这时候就会导致堆栈溢出,甚至可能导致系统崩溃。
53.为了解决上述现有技术问题,本发明提供了一种防止堆栈溢出的保护方法及相关设备。本发明中首先通过将初始堆栈栈顶的地址与ram的最高地址进行比较:在初始堆栈栈顶的地址大于ram的最高地址时生成第一堆栈异常标志,而在初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;然后,在当前堆栈地址比初始堆栈栈底的地址小时,则进一步地判断是否存在扩展堆栈:在判断出存在所述扩展堆栈时生成第二堆栈异常标志,否则生成第四堆栈异常标志,并计算初始堆栈栈顶的地址与ram的最高地址的差值,再者,将所述差值与预设阈值进行比较:若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈;最后,根据四个堆栈异常标志指示不同的溢出情况,并作出相应的处理。通过判断出四种不同的溢出情况,并指示不同的溢出情况,并作出相应的处理,有效地避免因为堆栈溢出导致的系统异常或者崩溃,从而形成了有效地溢出保护,并且,在需要的时候才生成扩展堆栈,从而节省了内存空间。
54.下面通过具体示例性的实施例对防止堆栈溢出的保护方法设计方案进行描述,需要说明的是,下列实施例只用于对发明的技术方案进行解释说明,并不做具体限定:
55.请参阅图1,本发明提供的一种防止堆栈溢出的保护方法,所述防止堆栈溢出的保护方法包括以下步骤:
56.s100、将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志。其中,所述第一堆栈异常标志表示初始堆栈栈顶的地址大于ram的最高地址。
57.具体地,在单片机上电之后开始运行程序时,首先,将初始堆栈栈顶的地址与ram
的最高地址进行比较,在判断出初始堆栈栈顶的地址大于ram的最高地址时,生成第一堆栈异常标志,即表示此时初始堆栈栈顶的地址大于ram的最高地址,从而实现根据初始堆栈栈顶的地址与ram的最高地址进行比较,判断出初始堆栈栈顶的地址是否大于ram的最高地址。
58.更进一步地,请参阅图2,所述s100、将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志的步骤具体包括:
59.s110、根据ram基地址和ram大小计算得到ram的最高地址;
60.s120、比较所述初始堆栈栈顶的地址与ram的最高地址,若初始堆栈栈顶的地址大于ram的最高地址,则生成所述第一堆栈异常标志。
61.具体地,在单片机上电之后开始运行程序时,首先,将所述ram基地址加上所述ram大小计算得到ram的最高地址之后,将所述初始堆栈栈顶的地址与ram的最高地址进行比较:若初始堆栈栈顶的地址大于ram的最高地址,则生成所述第一堆栈异常标志。
62.进一步地,所述100、将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志的步骤之前还包括:
63.s10、定义当前堆栈地址寄存器、初始堆栈栈顶寄存器、初始堆栈大小寄存器、堆栈异常标志寄存器、扩展堆栈大小寄存器和扩展堆栈栈顶寄存器,并分别对应存放当前堆栈地址、初始堆栈栈顶、初始堆栈大小、堆栈异常标志、扩展堆栈大小和扩展堆栈栈顶。其中,所述堆栈异常标志包括所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志。
64.具体地,在进行初始堆栈栈顶的地址与ram的最高地址比较前,首先,需要定义多种堆栈寄存器:所述当前堆栈地址寄存器、所述初始堆栈栈顶寄存器、所述初始堆栈大小寄存器、所述堆栈异常标志寄存器、所述扩展堆栈大小寄存器和所述扩展堆栈栈顶寄存器,并读预设的始堆栈大小,保存在所述初始堆栈大小寄存器中;同理,读取所述堆栈栈顶,保存在所述初始堆栈栈顶寄存器中;实时读取sp指针的值作为所述当前堆栈地址,并实时保存在所述当前堆栈地址寄存器中,以实现实时刷新;读取ram基地址和ram大小;并且,所述堆栈异常标志寄存器、所述扩展堆栈大小寄存器和所述扩展堆栈栈顶寄存器中分别对应存放所述堆栈异常标志、所述扩展堆栈大小和所述扩展堆栈栈顶,从而实现将各种指示参数相应地存放在预先定义的寄存器中。
65.其中,具体地堆栈溢出保护逻辑结构图如图3所示,图3中主要表示堆栈寄存器组与总线互联网的通讯。每个寄存器都和总线有数据交换的功能,ram也是挂在总线上的,由于当前堆栈地址寄存器的值就是sp指针的值,所以这里直接读取sp指针的值作为当前堆栈地址寄存器的值。
66.其中,具体地堆栈溢出保护的寄存器的关系图如图4所示,主要包括所述当前堆栈地址寄存器、所述初始堆栈栈顶寄存器、所述初始堆栈大小寄存器、所述堆栈异常标志寄存器、所述扩展堆栈大小寄存器和所述扩展堆栈栈顶寄存器。其中,所述堆栈异常标志寄存器有4个位(第一堆栈异常标志、第二堆栈异常标志、第三堆栈异常标志和第四堆栈异常标志)来表示堆栈的各种异常分别是:一、初始堆栈溢出(当前堆栈溢出),但扩展堆栈未溢出;二、初始堆栈溢出,扩展堆栈也溢出;三、初始堆栈栈顶的地址大于ram的最高地址;四、初始堆
栈溢出,无足够的空间扩展堆栈。
67.进一步地,请继续参阅图1,s200、当初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,将初始堆栈栈底的地址作为当前堆栈栈底的地址,并与当前堆栈地址的大小进行比较。
68.具体地,在将初始堆栈栈顶的地址与ram的最高地址进行比较时,若判断出初始堆栈栈顶的地址不大于ram的最高地址,则正常运行程序;但是若此时出现当嵌套函数过多或者程序的局部变量过多时,将导致事先开辟的堆栈空间不够用,这时候就会导致堆栈溢出,从而判断出所述堆栈出现溢出,则需要进一步地比较当前堆栈地址与当前堆栈栈底的地址的大小,以便判断所述扩展堆栈是否也出现溢出。
69.更进一步地,请参阅图5,所述s200、若初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小的步骤具体包括:
70.s210、根据所述初始堆栈栈顶和所述初始堆栈大小计算得到初始堆栈栈底的地址;
71.s220、当初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,将初始堆栈栈底的地址作为当前堆栈栈底的地址,并与当前堆栈地址的大小进行比较。
72.具体地,在将初始堆栈栈顶的地址与ram的最高地址进行比较时,若判断出初始堆栈栈顶的地址不大于ram的最高地址,且此时判断出所述堆栈出现溢出,则进一步地比较所述当前堆栈地址与当前堆栈栈底(此时为初始堆栈栈底)的地址的大小,即进一步地比较此时所述当前堆栈地址与初始堆栈栈底的地址的大小,而初始堆栈栈底的地址则通过所述初始堆栈栈顶减去所述初始堆栈大小计算得到,其中,所述初始堆栈栈顶的值由编译器产生,地址固定,然后由硬件或者软件写入所述初始堆栈栈顶寄存器中,所述初始堆栈大小则是由用户自定义。
73.进一步地,请继续参阅图1,s300、若当前堆栈地址比当前堆栈栈底的地址小时,则判断是否存在扩展堆栈,当存在所述扩展堆栈时,则生成第二堆栈异常标志。其中,所述第二堆栈异常标志表示当前堆栈溢出和所述扩展堆栈溢出。
74.具体地,在比较所述当前堆栈地址与当前堆栈栈底的地址的大小时,若当前堆栈地址比当前堆栈栈底的地址小时,则更进一步地判断是否存在所述扩展堆栈:当判断出存在所述扩展堆栈时,则生成所述第二堆栈异常标志(所述第二堆栈异常标志表示当前堆栈溢出和所述扩展堆栈溢出),从而有效地判断出所述扩展堆栈也出现溢出的现象。
75.更进一步地,所述200、若初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小的步骤还包括:
76.a210、若当前堆栈地址不小于当前堆栈栈底的地址时,正常运行所述程序。
77.具体地,在比较所述当前堆栈地址与当前堆栈栈底的地址的大小时,若当前堆栈地址不小于当前堆栈栈底的地址时,正常运行所述程序。
78.进一步地,请继续参阅图1,s400、当不存在所述扩展堆栈时,计算初始堆栈栈顶的地址与ram的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈和第四堆栈异常标志。其中,所述第三堆栈异常标志表示所述当前堆栈溢出,无足够的空间扩展堆栈;所述第四堆栈异常标志表示所述当前堆栈溢出,所述扩展堆栈未溢出。
79.具体地,在判断出当前堆栈地址比当前堆栈栈底的地址小,且更进一步地判断是否存在所述扩展堆栈时,若判断出不存在所述扩展堆栈,则计算初始堆栈栈顶的地址与ram的最高地址的差值,并将所述差值与所述预设阈值进行比较:若所述差值小于所述预设阈值(比如256字节),则生成所述第三堆栈异常标志,以指示所述当前堆栈溢出,无足够的空间扩展堆栈的现象;而若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈,从而自动地扩展一个堆栈(扩展堆栈),并且在新扩展的堆栈里面继续对变量进行压栈,与此同时生成所述第四堆栈异常标志,以指示所述当前堆栈溢出,所述扩展堆栈未溢出的现象。
80.在扩展堆栈之后,当前堆栈地址就会指向扩展堆栈的栈顶,从而继续运行所述程序。需要说明的是:本实施例中只允许堆栈扩展一次,不允许堆栈一直扩展(因为预先大概知道堆栈空间的需求,只是有少量的溢出情况)。
81.其中,具体地堆栈溢出保护结构示意图如图6,堆栈主要是存放在ram中的,所以ram一般存放数据的顺序是数据区、栈区(如果有)、堆区,并且堆的地址是向下生长的,即堆的地址从上到下依次增大。
82.进一步地,请继续参阅图1,s500、根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。
83.具体地,所述第一堆栈异常标志指示初始堆栈栈顶的地址大于ram的最高地址的情况,所述第二堆栈异常标志指示所述当前堆栈溢出和所述扩展堆栈溢出的情况,所述第三堆栈异常标志则指示所述当前堆栈溢出,无足够的空间扩展堆栈的情况,所述第四堆栈异常标志指示所述当前堆栈溢出,所述扩展堆栈未溢出的情况。而用户可以通过编写相应程序后,在软件里面通过中断或者轮询的方式去读取所述堆栈异常标志寄存器内所述堆栈异常标志的值,来判断具体是哪种溢出情况,并在出现溢出时停止所述程序的运行,或发出警报,以提醒用户这里存在堆栈溢出风险。
84.本发明中通过自动地判断堆栈溢出的不同情况,产生相应的标识,并根据相应的标识进行相应的处理,同时,当堆栈溢出的时候,自动的扩充堆栈大小,从而有效地避免因为堆栈溢出导致的系统异常或者崩溃,形成了有效地溢出保护。再者,由于在需要的时候才生成扩展堆栈,所以能够节省内存空间。
85.那么,本发明中所述防止堆栈溢出的保护方法的步骤流程简图可以用图7表示,步骤如下:当所述程序正常运行时,首先,通过比较初始堆栈栈顶的地址是否大于ram的最高地址:若初始堆栈栈顶的地址大于ram的最高地址,则堆栈异常标志中的一个位置位,即所述第一堆栈异常标志置为“1”;否则,正常运行所述程序。然后,当出现程序局部变量或者内嵌函数过多时,即所述堆栈出现溢出时,比较当前堆栈地址是否比初始堆栈栈底地址小:若当前堆栈地址不比初始堆栈栈底地址小,则正常运行所述程序;否则,进一步地判断是否扩展了堆栈,即判断是否已经存在所述扩展堆栈:是的话,就同样堆栈异常标志中的一个位置位,即所述第二堆栈异常标志置为“1”;否则的话,则进一步地判断初始堆栈栈顶寄存器的值与ram的最高地址的差值是否过小,即计算初始堆栈栈顶的地址与ram的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,就说明过小,则堆栈异常标志中的一个位置位,即所述第三堆栈异常标志置为“1”,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈,同时堆栈异常标志中的一个位置位,即所述第四堆栈异常标志置为“1”,这里,图7未标出;最后,当扩展了堆栈之后,当前堆栈地址就会偏移到扩展堆栈栈顶,继续地运行程序。
86.本发明中所述防止堆栈溢出的保护方法的具体步骤流程图则可以用图8表示,其中,置位是指堆栈异常标志位上置为“1”;当前遇到局部变量或者内嵌函数的时候,即出现堆栈溢出时,数据就会入栈,此时,sp指针递减,当前堆栈地址寄存器也跟着递减;用户处理或系统异常是指当出现其中任一个堆栈异常标志时,就说明系统异常,或提醒用户进行处理,例如控制停止运行所述程序等;当产生所述扩展堆栈时,初始堆栈栈顶寄存器的值作为扩展堆栈栈底的值,并且,会自动扩展一定空间,把空间大小保存在扩展堆栈大小寄存器中,然后,计算扩展堆栈栈顶位置,并保存扩展堆栈栈顶的值到扩展堆栈栈顶寄存器中。
87.进一步地,请参阅图9,一种防止堆栈溢出的保护系统,所述防止堆栈溢出的保护系统包括:
88.第一堆栈异常标志生成模块10,用于将初始堆栈栈顶的地址与ram的最高地址进行比较,若初始堆栈栈顶的地址大于ram的最高地址,则生成第一堆栈异常标志;
89.当前堆栈地址比较模块20,用于若初始堆栈栈顶的地址不大于ram的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;
90.第二堆栈异常标志生成模块30,用于若当前堆栈地址比当前堆栈栈底的地址小时,则判断是否存在扩展堆栈,当存在所述扩展堆栈时,则生成第二堆栈异常标志;
91.预设阈值比较模块40,用于当不存在所述扩展堆栈时,计算初始堆栈栈顶的地址与ram的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈和第四堆栈异常标志;
92.指示和处理模块50,用于根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。
93.具体地,在单片机上电之后开始运行程序时,首先,所述第一堆栈异常标志生成模块10将初始堆栈栈顶的地址与ram的最高地址进行比较,在判断出初始堆栈栈顶的地址大于ram的最高地址时,生成第一堆栈异常标志,即所述堆栈异常标志寄存器的某个位被置1,用以表示此时初始堆栈栈顶的地址大于ram的最高地址。
94.然后,若所述第一堆栈异常标志生成模块10判断出初始堆栈栈顶的地址不大于ram的最高地址时,则正常运行程序,但是若此时出现当嵌套函数过多或者程序的局部变量过多时,将导致事先开辟的堆栈空间不够用,这时候就会导致堆栈溢出,则需要当前堆栈地址比较模块20进一步地比较当前堆栈地址与当前堆栈栈底的地址的大小。
95.其次,若所述当前堆栈地址比较模块20比较出当前堆栈地址比初始堆栈栈底的地址小时,所述第二堆栈异常标志生成模块30则进行判断是否存在所述扩展堆栈:当判断出存在所述扩展堆栈时,则生成所述第二堆栈异常标志,即所述堆栈异常标志寄存器的某个位被置1,用以所述第二堆栈异常标志表示当前堆栈溢出和所述扩展堆栈溢出的情况。
96.再者,若所述第二堆栈异常标志生成模块30判断出不存在所述扩展堆栈,则所述预设阈值比较模块40计算初始堆栈栈顶的地址与ram的最高地址的差值,并将所述差值与所述预设阈值进行比较:若所述差值小于所述预设阈值(比如256字节),所述预设阈值比较模块40则生成所述第三堆栈异常标志,以指示所述当前堆栈溢出,无足够的空间扩展堆栈
的现象;而若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈,同时生成所述第四堆栈异常标志,以指示所述当前堆栈溢出,所述扩展堆栈未溢出的现象。
97.最后,所述指示和处理模块50根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。即所述第一堆栈异常标志指示初始堆栈栈顶的地址大于ram的最高地址的情况,所述第二堆栈异常标志指示所述当前堆栈溢出和所述扩展堆栈溢出的情况,所述第三堆栈异常标志则指示所述当前堆栈溢出,无足够的空间扩展堆栈的情况,所述第四堆栈异常标志指示所述当前堆栈溢出,所述扩展堆栈未溢出的情况。而用户可以通过编写相应程序后,在软件里面通过中断或者轮询的方式去读取所述堆栈异常标志寄存器内所述堆栈异常标志的值,来判断具体是哪种溢出情况,并在出现溢出时停止所述程序的运行,或发出警报,以提醒用户这里存在堆栈溢出风险。
98.进一步地,如图10所示,基于上述防止堆栈溢出的保护方法,本发明还相应提供了一种控制器,所述智能电视包括处理器10、存储器20及显示器30。图10仅示出了智能电视的部分组件,但是应理解的是,并不要求实施所有示出的组件,可以替代的实施更多或者更少的组件。
99.所述存储器20在一些实施例中可以是所述智能电视的内部存储单元,例如智能电视的硬盘或内存。所述存储器20在另一些实施例中也可以是所述智能电视的外部存储设备,例如所述智能电视上配备的插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。进一步地,所述存储器20还可以既包括所述智能电视的内部存储单元也包括外部存储设备。所述存储器20用于存储安装于所述智能电视的应用软件及各类数据,例如所述安装智能电视的程序代码等。所述存储器20还可以用于暂时地存储已经输出或者将要输出的数据。在一实施例中,存储器20上存储有防止堆栈溢出的保护程序40,该防止堆栈溢出的保护程序40可被处理器10所执行,从而实现本技术中防止堆栈溢出的保护方法。
100.所述处理器10在一些实施例中可以是一中央处理器(central processing unit,cpu),微处理器或其他数据处理芯片,用于运行所述存储器20中存储的程序代码或处理数据,例如执行所述防止堆栈溢出的保护方法等。
101.所述显示器30在一些实施例中可以是led显示器、液晶显示器、触控式液晶显示器以及oled(organic light-emitting diode,有机发光二极管)触摸器等。所述显示器30用于显示在所述智能电视的信息以及用于显示可视化的用户界面。所述智能电视的部件10-30通过系统总线相互通信。
102.在一实施例中,当处理器10执行所述存储器20中防止堆栈溢出的保护程序40时实现的步骤,可以参照上述防止堆栈溢出的保护方法中的对应描述,在此不再赘述。
103.进一步地,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质存储有防止堆栈溢出的保护程序,所述防止堆栈溢出的保护程序被处理器执行时实现如上所述的防止堆栈溢出的保护方法的步骤;由于上述对该所述防止堆栈溢出的保护方法的步骤进行了详细的描述,在此不再赘述。
104.综上所述,本发明提供的一种防止堆栈溢出的保护方法及相关设备,所述方法包括:将初始堆栈栈顶的地址与ram的最高地址进行比较,若大于则生成第一堆栈异常标志,
若不大于,且当堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;若当前堆栈地址比当前堆栈栈底的地址小时,判断是否存在扩展堆栈,当存在扩展堆栈时生成第二堆栈异常标志;当不存在扩展堆栈时,计算初始堆栈栈顶的地址与ram的最高地址的差值后,与预设阈值进行比较,若小于则生成第三堆栈异常标志,若不小于,则生成一个扩展堆栈和第四堆栈异常标志;根据四个堆栈异常标志指示不同的溢出情况,并作出相应的处理。通过判断出不同的溢出情况并指示不同的溢出情况,并作出相应的处理,从而形成了有效地溢出保护。
105.可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1