记得之前看过一篇文章说,最好查的bug是语法错误,因为编译器会告诉你,最不好查的bug是栈溢出,因为啥,因为不仅编译器不会告诉你,连你自己有可能都找不到原因出在哪。
经过了一段时间的摸索,算是基本搞清楚了栈溢出的原理,写下来以防日后出现问题无从下手。
前言
开发过单片机的同学应该不陌生这个名词,一般我们也说堆栈,其实这里有两个意思:一般我们说堆栈其实指的就是帧本身,而说堆指的就是堆。这是两个不同的分区。便于理解给出一张典型的C语言在linux系统下的占区图:

可以看出,对于Linux系统下的,存储空间的分配有着较为层次清晰的分层。单片机大概也遵循这个分区架构。
二进制代码以及常量(CONST修饰)以及全局变量在最底层,存储空间最靠前的部分
然后是堆区,堆区向上增长,我们常用到的molloc()、free()等函数操作的就是这个区,这也是芯片系统中唯一可以让程序员通过代码操作的一片存储空间
再然后是动态链接库
在往上(高地址)便是栈区。 最高地址一般为操作系统内核,用户无法访问
了解了这个之后我们开始详解何为栈、栈为什么会溢出以及在代码级如何预防栈溢出,最后说一下栈溢出攻击的事情。
那么什么是栈呢
在计算机中,栈可以理解为一个特殊的容器,用户可以将数据依次放入栈中,然后再将数据按照相反的顺序从栈中取出。也就是说,先放入的数据最后才能取出,而最后放入的数据必须先取出。这称为先进后出(First In Last Out)原则。
放入数据常称为入栈或压栈(Push),取出数据常称为出栈或弹出(Pop)。

2127

被折叠的 条评论
为什么被折叠?



