堆栈溢出检测方法、装置及家用电器与流程

文档序号:16630116发布日期:2019-01-16 06:29阅读:211来源:国知局
本发明涉及计算机
技术领域
:,特别涉及一种堆栈溢出检测方法、一种计算机可读存储介质、一种堆栈溢出检测装置和一种具有该装置的家用电器。
背景技术
::目前,家用电器中使用mcu(microcontrollerunit,微控制单元)控制的电控器越来越多,在使用芯片堆栈时,由于程序嵌套层数多或者一些隐含的错误逻辑,会造成堆栈溢出,程序跑飞。而目前的家用电器中并没有对堆栈是否溢出进行检测,当堆栈溢出,程序跑飞时,造成的故障无法预估,很可能发生安全事故。技术实现要素:本发明旨在至少在一定程度上解决相关技术中的技术问题之一。为此,本发明的第一个目的在于提出一种堆栈溢出检测方法,通过自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。本发明的第二个目的在于提出一种计算机可读存储介质。本发明的第三个目的在于提出一种堆栈溢出检测装置。本发明的第四个目的在于提出一种家用电器。为实现上述目的,本发明第一方面实施例提出了一种堆栈溢出检测方法,包括以下步骤:获取程序中的变量总数,并根据所述变量总数获取堆栈的栈顶地址;根据所述堆栈的栈顶地址对预设的栈顶数组进行赋值;在所述程序运行的过程中,判断所述栈顶数组中的元素的值是否被修改;如果所述栈顶数组中存在任一元素的值被修改,则判断所述堆栈存在溢出风险。根据本发明实施例的堆栈溢出检测方法,首先获取程序中的变量总数,并根据变量总数获取堆栈的栈顶地址,以及根据堆栈的栈顶地址对预设的栈顶数组进行赋值。然后,在程序运行的过程中,判断栈顶数组中的元素的值是否被修改,如果栈顶数组中存在任一元素的值被修改,则判断堆栈存在溢出风险。该方法通过自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。另外,根据本发明上述实施例提出的堆栈溢出检测方法还可以具有如下附加的技术特征:根据本发明的一个实施例,所述根据所述堆栈的栈顶地址对预设的栈顶数组进行赋值,包括:将所述栈顶数组的首地址赋值为所述栈顶地址,并对所述栈顶数组中的每一个元素赋初值。根据本发明的一个实施例,在判断所述堆栈存在溢出风险时,执行复位程序并发出报警提示。根据本发明的一个实施例,所述栈顶数组包括至少一个元素。为实现上述目的,本发明第二方面实施例提出了一种计算机可读存储介质,用于存储应用程序,所述应用程序用于执行本发明第一方面实施例提出的堆栈溢出检测方法。本发明实施例的计算机可读存储介质,通过执行上述的堆栈溢出检测方法,能够自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。为实现上述目的,本发明第三方面实施例提出了一种堆栈溢出检测装置,包括:获取模块,用于获取程序中的变量总数,并根据所述变量总数获取堆栈的栈顶地址;赋值模块,所述赋值模块与所述获取模块相连,所述赋值模块用于根据所述堆栈的栈顶地址对预设的栈顶数组的首地址进行赋值,并对所述栈顶数组中的每一个元素赋初值;判断模块,所述判断模块与所述赋值模块相连,所述判断模块用于在所述程序运行的过程中,判断所述栈顶数组中的元素的值是否被修改,如果所述栈顶数组中存在任一元素的值被修改,则判断所述堆栈存在溢出风险。根据本发明实施例的堆栈溢出检测装置,通过获取模块获取程序中的变量总数,并根据变量总数获取堆栈的栈顶地址,赋值模块根据堆栈的栈顶地址对预设的栈顶数组进行赋值,判断模块在程序运行的过程中,判断栈顶数组中的元素的值是否被修改,如果栈顶数组中存在任一元素的值被修改,则判断堆栈存在溢出风险。该装置通过自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。另外,根据本发明上述实施例提出的堆栈溢出检测装置还可以具有如下附加的技术特征:根据本发明的一个实施例,所述赋值模块在根据所述堆栈的栈顶地址对预设的栈顶数组进行赋值时,其中,所述赋值模块将所述栈顶数组的首地址赋值为所述栈顶地址,并对所述栈顶数组中的每一个元素赋初值。根据本发明的一个实施例,上述的堆栈溢出检测装置还包括:复位模块和报警模块,所述复位模块和所述报警模块分别与所述判断模块相连,其中,当所述判断模块判断所述堆栈存在溢出风险时,通过所述复位模块执行复位程序,并通过所述报警模块发出报警提示。根据本发明的一个实施例,所述栈顶数组包括至少一个元素。为实现上述目的,本发明第四方面实施例提出了一种家用电器,其包括本发明第三方面实施例提出的堆栈溢出检测装置。本发明实施例的家用电器,通过上述的堆栈溢出检测装置,能够自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。附图说明图1是根据本发明实施例的堆栈溢出检测方法的流程图;图2是单片机中flash区的数据结构示意图;图3是根据本发明一个具体示例的堆栈溢出检测方法的流程图;图4是根据本发明实施例的堆栈溢出检测装置的方框示意图;以及图5是根据本发明一个实施例的堆栈溢出检测装置的方框示意图。具体实施方式下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。下面结合附图来描述根据本发明实施例提出的堆栈溢出检测方法、计算机可读存储介质、堆栈溢出检测装置和具有该装置的家用电器。图1是根据本发明实施例的堆栈溢出检测方法的流程图。如图1所示,本发明实施例的堆栈溢出检测方法可包括以下步骤:s1,获取程序中的变量总数,并根据变量总数获取堆栈的栈顶地址。具体地,以图2所示的单片机的flash区为例。如图2所示,单片机的flash区主要包括直接寻址区、扩展直接寻址区、禁止访问区、扩展i/o区以及程序区等。其中,扩展直接寻址区也称数据区,用于存储程序运行时的变量,即程序中的变量地址为0x0080至0x47f。在程序设计完成后,可通过编译器获得程序中的变量总数,假设当前程序中用到的变量总数为0x0100个,那么这些变量在数据区的地址为0x0080至0x0180,根据变量总数可以计算出堆栈的栈顶地址,即栈顶地址=变量起始地址+变量总数+0x0001=0x0080+0x0100+0x0001=ox0181。s2,根据堆栈的栈顶地址对预设的栈顶数组进行赋值。根据本发明的一个实施例,根据堆栈的栈顶地址对预设的栈顶数组进行赋值,包括:将栈顶数组的首地址赋值为栈顶地址,并对栈顶数组中的每一个元素赋初值。其中,栈顶数组包括至少一个元素。具体地,假设预设的栈顶数组有一个元素,那么预设的栈顶数组可以为intstacktable[1],当获取的堆栈的栈顶地址为ox0181时,栈顶数组stacktable[1]的首地址为ox0181。由此,将堆栈的栈顶地址与栈顶数组的首地址关联,即使在程序编程时对堆栈的大小进行修改,也无需手动计算栈顶数组stacktable[1]的首地址,只要将获取的栈顶地址传递给栈顶数组stacktable[1]即可。然后,对栈顶数组stacktable[1]赋初值,如stacktable[1]={0xaa}。当预设的栈顶数组有四个元素时,该栈顶数组可以为intstacktable[4],其中,栈顶数组stacktable[4]的首地址为ox0181,那么整个栈顶数组的地址将从0x0181开始到0x0184。然后,对栈顶数组stacktable[4]赋初值,如stacktable[4]={0xaa,0xbb,0xcc,0xdd}。s3,在程序运行的过程中,判断栈顶数组中的元素的值是否被修改。s4,如果栈顶数组中存在任一元素的值被修改,则判断堆栈存在溢出风险。其中,需要说明的是,本发明实施例中的堆栈溢出是指堆栈顶部的数据也被用来进行计算的情况。具体地,堆栈的最主要特征是遵循“先进后出”的原则,即最先入栈的数据放在栈的最底部,最后入栈的数据放在栈的顶部,并且最后入栈的数据最先出栈,最先入栈的数据最后出栈。由于堆栈的长度是由程序中的变量总数确定,所以当向堆栈中填充超过其处理能力的数据时,例如,出现过多的函数调用、递归或者错误赋值等,将导致堆栈溢出。当发生堆栈溢出时,将会占用正常变量的地址,导致变量的值发生突变,影响单片机正常运行,从而造成不可估量的风险。所以,在本发明的实施例中,通过对栈顶地址对应的栈顶数组进行赋值,以在程序运行的过程中,判断该栈顶数组中的元素是否被篡改,如果被篡改,则说明栈顶地址被使用,此时存在堆栈溢出的风险。例如,当函数调用过多时,程序运行中的变量可能超过正常情况下程序中所用到的变量总数0x0100,那么堆栈的栈顶地址0x0181将被占用,即对栈顶地址0x0181对应的变量赋值,而在对数据区的堆栈的栈顶地址0x0181对应的变量进行赋值的同时,栈顶数组的首地址对应的元素也将重新被赋值,即不再是0xaa,由此可判断堆栈存在溢出风险。因此,根据本发明实施例的堆栈溢出检测方法,通过自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。进一步地,根据本发明的一个实施例,在判断堆栈存在溢出风险时,执行复位程序并发出报警提示。具体地,在判断堆栈存在溢出风险时,可通过看门狗进行复位,例如,程序中停止喂狗,引起看门狗对mcu进行强制复位。或者,预先设定一个转移地址,当判断堆栈存在溢出风险时,转去执行设定好的堆栈溢出处理程序,例如,可关闭与安全有关的负载的输出,或者控制整个设备停止工作,从而保证系统硬件不会发生损坏,提高系统的安全性和可靠性。另外,在判断堆栈存在溢出风险时,还发出报警提示,如声光报警提示,以对用户进行提醒。具体地,图3是根据本发明一个具体示例的堆栈溢出检测方法的流程图。如图3所示,本发明实施例的堆栈溢出检测方法可包括以下步骤:s101,家用电器上电。s102,根据程序所使用的变量总数获取栈顶地址,并将栈顶地址传给栈顶数组首地址。s103,对栈顶数组进行初始化,如栈顶数组stacktable[4]={0xaa,0xbb,0xcc,0xdd}。s104,for(;;)循环。s105,判断(*stacktable)[0]!=0xaa。如果是,执行步骤s106;如果否,执行步骤s107。s106,执行f_failsafe()。该f_failsafe()函数是在判断程序即将溢出时的处理函数,在该函数中,可以设置报警程序或者关闭与安全相关的负载的程序,如关闭家用电器的加热装置,关闭家用电器中功率开关管的驱动信号等,使得用户的财产不受损害。s107,判断(*stacktable)[1]!=0xbb。如果是,执行步骤s108;如果否,执行步骤s109。s108,执行f_failsafe()。s109,判断(*stacktable)[2]!=0xcc。如果是,执行步骤s110;如果否,执行步骤s111。s110,执行f_failsafe()。s111,判断(*stacktable)[3]!=0xdd。如果是,执行步骤s112;如果否,返回步骤s104。s112,执行f_failsafe()。综上所述,根据本发明实施例的堆栈溢出检测方法,利用堆栈的结构和原理,通过自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现堆栈溢出的有效判断,并在堆栈即将溢出时,进行故障处理,防止对家用电器造成损坏,避免危险事故发生。另外,本发明的实施例还提出了一种计算机可读存储介质,其用于存储应用程序,所述应用程序用于执行上述的堆栈溢出检测方法。本发明实施例的计算机可读存储介质,通过执行上述的堆栈溢出检测方法,能够自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。图4是根据本发明实施例的堆栈溢出检测装置的方框示意图。如图4所示,本发明实施例的堆栈溢出检测装置可包括:获取模块10、赋值模块20和判断模块30。其中,获取模块10用于获取程序中的变量总数,并根据变量总数获取堆栈的栈顶地址。赋值模块20与获取模块10相连,赋值模块20用于根据堆栈的栈顶地址对预设的栈顶数组进行赋值。判断模块30与赋值模块20相连,判断模块30用于在程序运行的过程中,判断栈顶数组中的元素的值是否被修改,如果栈顶数组中存在任一元素的值被修改,则判断堆栈存在溢出风险。根据本发明的一个实施例,赋值模块20在根据堆栈的栈顶地址对预设的栈顶数组进行赋值时,其中,赋值模块20将栈顶数组的首地址赋值为栈顶地址,并对栈顶数组中的每一个元素赋初值。其中,栈顶数组包括至少一个元素。根据本发明的一个实施例,如图5所示,上述的堆栈溢出检测装置还可包括:复位模块40和报警模块50,复位模块40和报警模块50分别与判断模块30相连,其中,当判断模块30判断堆栈存在溢出风险时,通过所复位模块40执行复位程序,并通过报警模块50发出报警提示。需要说明的是,本发明实施例的堆栈溢出检测装置中未披露的细节,请参照本发明实施例的堆栈溢出检测方法中所披露的细节,具体这里不再详述。根据本发明实施例的堆栈溢出检测装置,通过获取模块获取程序中的变量总数,并根据变量总数获取堆栈的栈顶地址,赋值模块根据堆栈的栈顶地址对预设的栈顶数组进行赋值,判断模块在程序运行的过程中,判断栈顶数组中的元素的值是否被修改,如果栈顶数组中存在任一元素的值被修改,则判断堆栈存在溢出风险。该装置通过自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。此外,本发明的实施例还提出了一种家用电器,其包括上述的堆栈溢出检测装置。本发明实施例的家用电器,通过上述的堆栈溢出检测装置,能够自动识别程序中的堆栈大小,并根据堆栈大小对栈顶数组进行赋初值,以在程序运行的过程中,通过判断栈顶数组的初值是否被篡改来判断堆栈是否即将溢出,从而实现预防堆栈溢出的有效判断,以根据判断结果采取有效措施,防止由于mcu异常导致设备损坏和安全事故。在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“长度”、“宽度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”、“顺时针”、“逆时针”、“轴向”、“径向”、“周向”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。在本发明中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”、“固定”等术语应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系,除非另有明确的限定。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。在本发明中,除非另有明确的规定和限定,第一特征在第二特征“上”或“下”可以是第一和第二特征直接接触,或第一和第二特征通过中间媒介间接接触。而且,第一特征在第二特征“之上”、“上方”和“上面”可是第一特征在第二特征正上方或斜上方,或仅仅表示第一特征水平高度高于第二特征。第一特征在第二特征“之下”、“下方”和“下面”可以是第一特征在第二特征正下方或斜下方,或仅仅表示第一特征水平高度小于第二特征。在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现定制逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属
技术领域
:的技术人员所理解。在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(ram),只读存储器(rom),可擦除可编辑只读存储器(eprom或闪速存储器),光纤装置,以及便携式光盘只读存储器(cdrom)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。如,如果用硬件来实现和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(pga),现场可编程门阵列(fpga)等。本
技术领域
:的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。上述提到的存储介质可以是只读存储器,磁盘或光盘等。尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1