void breakStack(int num){
// Implied check to see if addition will cause integer overflow
int tmp = num + 1;
// Code to see if next call will cause a stack
// overflow and avoid it
breakStack(tmp);
}
或者:
void breakStack(int num){
// Implied check to see if addition will cause integer overflow
int tmp = num + 1;
breakStack(tmp);
}
void stackOverFlowHandler(int signum){
// Code to handle stack overflow
}
我找到的两个解决方法是:“不使用递归”和“编译器优化可以消除尾递归,因此问题得以解决”。但我正在寻找另一种解决方案。编辑:我发现了一种避免它的方法(见已接受的答案)。
避免解决方案:
假设您有函数的大小(例如50字节)和堆栈上剩余的空闲空间量(例如200字节),那么:
void tryToBreakStack(int num){
// Implied check to see if addition will cause integer overflow
int tmp = num + 1;
if(functionSize>leftSpace){
return;
}
tryToBreakStack(tmp);
}
现在,我可能能够使用 nm -S 函数获取函数大小并进行硬编码(我知道被接受的答案说这是不可能的)。另外需要注意的是:我几乎可以确定不能通过调用 sizeof(tryToBreak) 或 sizeof(&tryToBreak) 来获得此值。
此外,我可能能够设置堆栈大小并大致估算堆栈上的空闲空间。
在我开始尝试这种解决方案之前(也许会失败),我想知道是否有其他方法可以做到这一点(也许更容易和更精确)。
编辑:既然我找到了避免它的方法,那么真正的问题是:如何使用信号处理从堆栈溢出中恢复。
处理方案:
当进程收到“分段错误”信号并且必须处理它时,我不确定该怎么做。首先:如何知道这是由堆栈溢出引起的?其次:如何从堆栈溢出中恢复?