我想知道一块C代码可靠地分段错误的最佳方法是什么?
我完全清楚这是不好的行为,不应该在一个软件中使用,但我想知道我是如何能够一直强迫它发生的。
编辑:优先考虑平台。
EDIT2:SIGSEGV是一个有趣的解决方案,但我更喜欢不使用信号的答案。为了便于讨论,我们将操作系统限制在Linux /其他基于unix的发行版中。
答案 0 :(得分:2)
在未定义的平台上定义分段错误程序的方法很难。 分段错误是一个松散的术语,没有为所有平台定义(例如,简单的小型计算机)。
仅考虑支持进程的操作系统,进程可以收到发生分段错误的通知。
此外,将操作系统限制为'unix like'OSes,这是接收SIGSEGV信号的过程的可靠方法是*(int*)0 = 0;
与大多数跨平台问题一样,每个平台可能(通常都是)对seg-faulting有不同的定义。
但要切实可行,并回答EDIT2,当前的mac,lin和win操作系统将会出现段错误
assert()
此外,导致段错误的行为也不错。 try
{
anyfunc();
}
catch (...)
{
printf("?\n");
}
的某些实现会导致SIGSEGV信号产生核心文件。当你需要尸检时非常有用。
导致段错误的更糟糕的是隐藏它:
?
隐藏了错误的起源,你必须继续下去:
{{1}}
。
答案 1 :(得分:1)
C语言本身没有指定任何有关分段错误的内容。它表示如果您尝试访问无效内存,则行为未定义。分段错误或SIGSEGV
是来自某些底层平台的常见信号,表示无效的内存访问。但很明显,底层平台可以决定它对这种错误的行为方式。
如果说你严格遵守C和“优先考虑平台”的方式,那么就没有办法强制推出适用于世界上每个平台的产品。
答案 2 :(得分:0)
尝试读取或写入非法内存位置。例如:
memset(NULL, 1, 1);
在这里你写一个地址为0,绝对是非法的。