gpt4 book ai didi

c++ - 堆栈溢出会导致段错误以外的其他原因吗?

转载 作者:IT老高 更新时间:2023-10-28 12:33:28 24 4
gpt4 key购买 nike

在已编译的程序中(假设是 C 或 C++,但我猜这个问题可能会扩展到任何具有调用堆栈的非 VM-ish 语言) - 通常当您溢出堆栈时,you get a segmentation fault :

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

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

我也在询问非 Linux、非 Windows 操作系统和非 X86 硬件。 (当然,如果您没有硬件内存保护或操作系统支持(例如 MS-DOS),那么就没有段错误之类的东西;我问的是您可能得到的情况段错误,但发生了其他事情)。

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

最佳答案

是的,即使在标准操作系统 (Linux) 和标准硬件 (x86) 上也是如此。

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

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

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

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

关于c++ - 堆栈溢出会导致段错误以外的其他原因吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50728345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com