一种防止堆栈溢出的保护方法及相关设备技术

技术编号:35299565 阅读:26 留言:0更新日期:2022-10-22 12:47
本发明专利技术公开一种防止堆栈溢出的保护方法及相关设备,所述方法包括:将初始堆栈栈顶的地址与RAM的最高地址进行比较,若大于则生成第一堆栈异常标志,若不大于,且当堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;若当前堆栈地址更小时,判断是否存在扩展堆栈,当存在扩展堆栈时生成第二堆栈异常标志;当不存在扩展堆栈时,计算初始堆栈栈顶的地址与RAM的最高地址的差值后,与预设阈值进行比较,若小于则生成第三堆栈异常标志,若不小于,则生成一个扩展堆栈和第四堆栈异常标志;根据四个堆栈异常标志指示不同的溢出情况并停止运行程序。通过判断出不同的溢出情况并进行相应地处理,形成有效地溢出保护。形成有效地溢出保护。形成有效地溢出保护。

【技术实现步骤摘要】
一种防止堆栈溢出的保护方法及相关设备


[0001]本专利技术涉及计算机应用
,特别涉及一种防止堆栈溢出的保护方法及相关设备。

技术介绍

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

技术实现思路

[0009]本专利技术的主要目的在于提供一种防止堆栈溢出的保护方法及相关设备,旨在解决现有技术中堆栈出现溢出时,而导致的程序运行错误乃至系统崩溃的问题。
[0010]为了达到上述目的,本专利技术采取了以下技术方案:
[0011]一种防止堆栈溢出的保护方法,所述防止堆栈溢出的保护方法包括以下步骤:
[0012]将初始堆栈栈顶的地址与RAM的最高地址进行比较,若初始堆栈栈顶的地址大于RAM的最高地址,则生成第一堆栈异常标志;
[0013]若初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;
[0014]若当前堆栈地址比当前堆栈栈底的地址小时,则判断是否存在扩展堆栈,当存在
所述扩展堆栈时,则生成第二堆栈异常标志;
[0015]当不存在所述扩展堆栈时,计算初始堆栈栈顶的地址与RAM的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈和第四堆栈异常标志;
[0016]根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。
[0017]所述防止堆栈溢出的保护方法中,所述将初始堆栈栈顶的地址与RAM的最高地址进行比较,若初始堆栈栈顶的地址大于RAM的最高地址,则生成第一堆栈异常标志的步骤之前还包括:
[0018]定义当前堆栈地址寄存器、初始堆栈栈顶寄存器、初始堆栈大小寄存器、堆栈异常标志寄存器、扩展堆栈大小寄存器和扩展堆栈栈顶寄存器,并分别对应存放当前堆栈地址、初始堆栈栈顶、初始堆栈大小、堆栈异常标志、扩展堆栈大小和扩展堆栈栈顶。
[0019]所述防止堆栈溢出的保护方法中,所述将初始堆栈栈顶的地址与RAM的最高地址进行比较,若初始堆栈栈顶的地址大于RAM的最高地址,则生成第一堆栈异常标志的步骤具体包括:
[0020]根据RAM基地址和RAM大小计算得到RAM的最高地址;
[0021]比较所述初始堆栈栈顶的地址与RAM的最高地址,若初始堆栈栈顶的地址大于RAM的最高地址,则生成所述第一堆栈异常标志。
[0022]所述防止堆栈溢出的保护方法中,所述若初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小的步骤具体包括:
[0023]根据所述初始堆栈栈顶和所述初始堆栈大小计算得到初始堆栈栈底的地址;
[0024]当初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,将初始堆栈栈底的地址作为当前堆栈栈底的地址,并与当前堆栈地址的大小进行比较。
[0025]所述防止堆栈溢出的保护方法中,所述若初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小的步骤还包括:
[0026]若当前堆栈地址不小于当前堆栈栈底的地址时,正常运行所述程序。
[0027]所述防止堆栈溢出的保护方法中,所述第一堆栈异常标志表示初始堆栈栈顶的地址大于RAM的最高地址。
[0028]所述防止堆栈溢出的保护方法中,所述第二堆栈异常标志表示当前堆栈溢出和所述扩展堆栈溢出;所述第三堆栈异常标志表示所述当前堆栈溢出,无足够的空间扩展堆栈;所述第四堆栈异常标志表示所述当前堆栈溢出,所述扩展堆栈未溢出。
[0029]一种防止堆栈溢出的保护系统,所述防止堆栈溢出的保护系统包括:
[0030]第一堆栈异常标志生成模块,用于将初始堆栈栈顶的地址与RAM的最高地址进行比较,若初始堆栈栈顶的地址大于RAM的最高地址,则生成第一堆栈异常标志;
[0031]当前堆栈地址比较模块,用于若初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;
[0032]第二堆栈异常标志生成模块,用于若当前堆栈地址比当前堆栈栈底的地址小时,则判断是否存在扩展堆栈,当存在所述扩展堆栈时,则生成第二堆栈异常标志;
[0033]预设阈值比较模块,用于当不存在所述扩展堆栈时,计算初始堆栈栈顶的地址与RAM的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈和第四堆栈异常标志;
[0034]指示和处理模块,用于根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。
[0035]一种控制器,所述控制器包括:存储器、处理器及存储在所述存储器上并可在所述处理器上运行的防止堆栈溢出的保护程序,所述防止堆栈溢出的保护程序被所述处理器执行时实现如上所述的防止堆栈溢出的保护方法的步骤。
[0036]一种计算机可读存储介质,所述计算机可读存储介质存储有防止堆栈溢出的保护程序,所述防止堆栈溢出的保护程序被处理器执行时实现如上所述的防止堆栈溢出的保护方法的步骤。
[0037]相较于现有技术,本专利技术提供的一种防止本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种防止堆栈溢出的保护方法,其特征在于,所述防止堆栈溢出的保护方法包括以下步骤:将初始堆栈栈顶的地址与RAM的最高地址进行比较,若初始堆栈栈顶的地址大于RAM的最高地址,则生成第一堆栈异常标志;若初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小;若当前堆栈地址比当前堆栈栈底的地址小时,则判断是否存在扩展堆栈,当存在所述扩展堆栈时,则生成第二堆栈异常标志;当不存在所述扩展堆栈时,计算初始堆栈栈顶的地址与RAM的最高地址的差值后,与预设阈值进行比较,若所述差值小于所述预设阈值,则生成第三堆栈异常标志,若所述差值不小于所述预设阈值,则生成一个所述扩展堆栈和第四堆栈异常标志;根据所述第一堆栈异常标志、所述第二堆栈异常标志、所述第三堆栈异常标志和所述第四堆栈异常标志,指示不同的溢出情况,并作出相应的处理。2.根据权利要求1所述的防止堆栈溢出的保护方法,其特征在于,所述将初始堆栈栈顶的地址与RAM的最高地址进行比较,若初始堆栈栈顶的地址大于RAM的最高地址,则生成第一堆栈异常标志的步骤之前还包括:定义当前堆栈地址寄存器、初始堆栈栈顶寄存器、初始堆栈大小寄存器、堆栈异常标志寄存器、扩展堆栈大小寄存器和扩展堆栈栈顶寄存器,并分别对应存放当前堆栈地址、初始堆栈栈顶、初始堆栈大小、堆栈异常标志、扩展堆栈大小和扩展堆栈栈顶。3.根据权利要求1所述的防止堆栈溢出的保护方法,其特征在于,所述将初始堆栈栈顶的地址与RAM的最高地址进行比较,若初始堆栈栈顶的地址大于RAM的最高地址,则生成第一堆栈异常标志的步骤具体包括:根据RAM基地址和RAM大小计算得到RAM的最高地址;比较所述初始堆栈栈顶的地址与RAM的最高地址,若初始堆栈栈顶的地址大于RAM的最高地址,则生成所述第一堆栈异常标志。4.根据权利要求1所述的防止堆栈溢出的保护方法,其特征在于,所述若初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,比较当前堆栈地址与当前堆栈栈底的地址的大小的步骤具体包括:根据所述初始堆栈栈顶和所述初始堆栈大小计算得到初始堆栈栈底的地址;当初始堆栈栈顶的地址不大于RAM的最高地址,且堆栈出现溢出时,将初始堆栈栈底的地址作为当前堆栈栈底的地址,并与当前堆栈地址的大小进行比较。5.根据权利要求1所述的防止堆栈溢出...

【专利技术属性】
技术研发人员:刘吉平宾豪王翔郑增忠
申请(专利权)人:深圳市航顺芯片技术研发有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1