Wat*_*ter 1 c arrays segmentation-fault
假设你分配一些数组arr size n,如下所示:
int arr[n]; // Allocated fine
printf("%d", arr[n]); // Segfault if possible
Run Code Online (Sandbox Code Playgroud)
是否存在这样的数字n,我总是可以在printf线上触发段错误?这可能是某些操作系统特有的.
我知道它的未定义行为,我知道当访问它并将其更改为超出范围将影响另一个内存区域(可能)会导致我以后出现重大问题.
我的教授说它并不总是会出现段错误,而且我很好奇是否在任何情况下都会创建一个某种尺寸的数组,某些类型的操作系统或计算机每次都会可靠地进行段错误.
这是可能的还是没有?是否存在一些我可以创建的条件,这将导致单个越界访问始终触发段错误.
它是理论上可能是永远正确的?但是在实践中不会一直发生这种情况吗?
在一般情况下,正如Ben所说,它是未定义的行为.一般的答案是"不要依赖于未定义的行为,它的效果永远不会是确定性的".
然而,有两种可靠的解决方法可以在特定的,现代化的,普通的系统中实现这一点,这些系统涵盖了大量现代PC的横截面,但它并不能在所有编译器,架构,操作系统中移植,等等
arr[-1],或将其与另一个极端对齐.不能保证,但很有可能,因为操作系统不允许您访问受保护的内存,或者如果您正在写入RODATA段,就是这样.-fstack-protector-strong,并在堆栈粉碎时刻意崩溃你的代码.在代码覆盖率测试期间在软件的测试版本上启用此功能是个好主意:最好在测试阶段崩溃并修复它,然后部署它并让它在生产中崩溃.