C程序中堆栈破坏的典型示例

Der*_*unk 1 c stack memory-management

有人可以教我一个常见的例子,你(!)你在C程序中销毁堆栈?我在Ubuntu中使用GCC.谢谢.

Mar*_*all 5

这取决于"销毁堆栈"的含义,但这是一个常见的错误,通常会导致重要的堆栈驻留数据损坏:

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的特定(并且非常常见)实现中打破堆栈.