这取决于"销毁堆栈"的含义,但这是一个常见的错误,通常会导致重要的堆栈驻留数据损坏:
void dumb()
{
char small[2];
strcpy(small, "too long to fit"); // Writes past the end of "small", overwriting vital information
}
Run Code Online (Sandbox Code Playgroud)
这是安全漏洞的常见来源.它可能用于劫持指令指针,使恶意代码能够执行.见缓冲区溢出.
可能被描述为"破坏堆栈"的另一个错误是无限递归(在该页面上向下滚动):
int add(int n)
{
return n + add(n + 1);
}
Run Code Online (Sandbox Code Playgroud)
因为它没有退出条件,所以会将如此多的帧推入堆栈,最终会"满".(除非编译器可以应用尾调用优化 ;见下文)
这两个例子都没有使用GCC 4.4.3进行编译.
注意:正如Billy ONeal在下面指出的那样,这些示例的行为特定于x86,而不是C作为一种语言,并且可能因编译器而异.这并不是说他们没有演示如何在C的特定(并且非常常见)实现中打破堆栈.
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |