考虑 C 的以下两行:
int a[1] = {0};
a[1] = 0;
第二行在内存中不应该写的地方进行了写访问。有时这样的程序会在执行过程中出现段错误,有时不会,这取决于我假设的环境,也可能是其他因素。
我想知道是否有办法尽可能地强制此类程序发生段错误(例如,通过以特殊方式编译它们,或者在某个虚拟机中执行它们,我不知道)。
这是出于教学目的。
最佳答案
根据 C 语言标准,这些类型的访问是未定义的行为,编译器和运行时没有义务使它们发生段错误(尽管它们有时显然会发生)。
出于教学目的,您可以查看 GCC(https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html 中的 -fsanitize=address
)和 Clang(https://clang.llvm.org/docs/AddressSanitizer.html)等流行编译器中的地址清理器。
简单来说,这些选项会导致编译器使用额外的逻辑来检测内存访问,以捕获越界内存访问并产生用户可见的错误(尽管不完全是段错误消息),从而允许用户发现此类错误并修复它们。
这可能就是您正在寻找的。p>
关于c - 如何始终使错误的 C 程序出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47419044/