假设你分配一些 arr 大小的数组 n 如下:
int arr[n]; // Allocated fine
printf("%d", arr[n]); // Segfault if possible
是否存在这样一个数字n,我可以总是在 printf 行上触发段错误?这可能特定于某些操作系统。
我知道它的未定义行为,而且我知道当访问它并越界更改它时会影响另一个内存区域,这将(很可能)在以后给我带来重大问题。
我的教授说它不会总是出现段错误,我很好奇是否有在某些情况下使用某种类型的操作系统或计算机创建一定大小的数组,每次都会可靠地出现段错误。
这可能吗?我是否可以创建某些条件来导致单个越界访问始终触发段错误。
理论上是否有可能永远为真?但在实践中不会一直发生吗?
最佳答案
在一般情况下,正如 Ben 所指出的,这是未定义的行为。一般的答案是“永远不要依赖未定义的行为,它的效果永远不会是确定性的”。
但是,有两种确定的方法可以在特定的、现代的、普通的系统上引起这种情况,这涵盖了现代 PC 的大部分横截面,但它不是可移植到所有编译器、架构、操作系统等。
- 只需创建一个数组和align it to the stack boundary .尝试访问元素
arr[-1]
,或将其对齐到另一个极端。不能保证,但很有可能,因为操作系统不允许您访问 protected 内存,或者如果您正在写入 RODATA 段,那就是这样。 - 在 Linux 上,just compile your code with the
-fstack-protector-strong
, and watch your code deliberately crash when you stack smash .最好在代码覆盖测试期间在软件的测试版本上启用此功能:最好在测试阶段崩溃并修复它,然后部署它并让它在生产中崩溃。
关于c - 在 C 中是否有可能总是在数组大小为 1 时产生段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34888974/