在C++中,堆栈溢出通常会导致程序不可恢复的崩溃。对于需要真正健壮的程序,这是不可接受的行为,特别是因为堆栈大小是有限的。关于如何处理这个问题的几个问题。
:这样的事情在C++中是可能的吗?
对于C++行为的解决方案,任何其他有用的意见都将不胜感激。
发布于 2012-08-28 01:42:22
您可以使用良好的编程实践来防止堆栈溢出,例如:
这些是我在过去几年中见过的最多的原因。
对于自动查找SO,您应该能够找到一些静态代码分析工具。
发布于 2012-08-28 02:02:33
Re:可扩展堆栈。你可以像这样给你自己更多的堆栈空间:
#include <iostream>
int main()
{
int sp=0;
// you probably want this a lot larger
int *mystack = new int[64*1024];
int *top = (mystack + 64*1024);
// Save SP and set SP to our newly created
// stack frame
__asm__ (
"mov %%esp,%%eax; mov %%ebx,%%esp":
"=a"(sp)
:"b"(top)
:
);
std::cout << "sp=" << sp << std::endl;
// call bad code here
// restore old SP so we can return to OS
__asm__(
"mov %%eax,%%esp":
:
"a"(sp)
:);
std::cout << "Done." << std::endl;
delete [] mystack;
return 0;
}
这是gcc的汇编语法。
发布于 2012-08-28 01:20:49
C++是一种强大的语言,随之而来的是搬起石头砸自己的脚的能力。我不知道有什么便携机制可以在发生堆栈溢出时检测和纠正/中止。当然,任何这样的检测都是特定于实现的。例如,g++提供了-fstack-protector
来帮助监控堆栈使用情况。
一般来说,您最好的办法是主动避免大型基于堆栈的变量,并小心处理递归调用。
https://stackoverflow.com/questions/12146201
复制相似问题