其他分享
首页 > 其他分享> > c – 堆栈溢出是否会导致除分段错误之外的其他内容?

c – 堆栈溢出是否会导致除分段错误之外的其他内容?

作者:互联网

在一个已编译的程序中(假设C或C,但我想这个问题可以扩展到任何带有调用堆栈的非VM语言) – 很常见当你溢出堆栈时,you get a segmentation fault

Stack overflow is [a] cause, segmentation fault is the result.

但这总是如此吗?堆栈溢出是否会导致其他类型的程序/操作系统行为?

我也问过非Linux,非Windows操作系统和非X86硬件. (当然,如果你没有硬件内存保护或操作系统支持(例如MS-DOS)那么就没有分段错误;我问的是你可能会遇到分段错误的情况但是还会发生其他事情).

注意:假设除了堆栈溢出之外,程序是有效的,并且不会尝试访问超出其边界的数组,取消引用无效指针等.

解决方法:

是的,即使在标准OS(Linux)和标准硬件(x86)上也是如此.

void f(void) {
    char arr[BIG_NUMBER];
    arr[0] = 0; // stack overflow
}

请注意,在x86上,堆栈会增长,因此我们将分配到数组的开头以触发溢出.通常的免责声明适用……确切的行为取决于比本答案中讨论的更多因素,包括C编译器的细节.

如果BIG_NUMBER刚刚大到足以溢出,您将遇到堆栈保护并获得分段错误.这就是堆栈保护的用途,它可以小到单个4 KiB页面(但不小,在Linux 4.12之前使用这个4 KiB大小)或者它可以更大(Linux 4.12上默认为1 MiB) ,见mm: large stack guard gap),但它总是一些特定的大小.

如果BIG_NUMBER足够大,溢出可以跳过堆栈保护并落在其他一块内存上,可能是有效的内存.这可能会导致您的程序行为不正确但不会崩溃,这基本上是最糟糕的情况:我们希望我们的程序在错误时崩溃,而不是做一些无意识的事情.

标签:c-3,c,stack-overflow,segmentation-fault
来源: https://codeday.me/bug/20190910/1798975.html