如何解决栈溢出

如何解决栈溢出,第1张

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

扩展资料

针对堆栈溢出可能造成的计算机安全问题,通常有以下这些防范措施:

1、强制按照正确的规则写代码。

2、通过 *** 作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。但由于攻击者并不一定要通过植入代码来实现攻击,同时linux在信号传递和GCC的在线重用都使用了可执行堆栈的属性,因此该方法依然有一定弱点。

3、利用编译器的边界检查来实现缓冲区的保护。该方法使得缓冲区溢出不可能出现,完全消除了缓冲区溢出的威胁,但代价较大,如性能速度变慢。

4、程序指针完整性检查,该方法能阻止绝大多数缓冲区溢出攻击。该方法就是说在程序使用指针之前,检查指针的内容是否发生了变化。

参考资料来源:百度百科-堆栈溢出

参考资料来源:百度百科-栈溢出

while循环中的else中printf("%s",mail)有问题,recv(sockfd,message,250,0)接收到的字符串中不含有结束符号“\0”所以当你用printf去输出mail字符串时找不到结束标记,所以会产生越界行为。你应该把if(size<250)中的mail[Size]=0放到Size=recv(sockfd,mail,250,0)的后面;这个问题应该就可以解决了。还有请记住不要用编译器自带的默认初始化值,那个不可靠。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7634200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存