如何强制我的代码出错?

时间:2017-07-16 03:38:40

标签: c segmentation-fault

我想知道一块C代码可靠地分段错误的最佳方法是什么?

我完全清楚这是不好的行为,不应该在一个软件中使用,但我想知道我是如何能够一直强迫它发生的。

编辑:优先考虑平台。

EDIT2:SIGSEGV是一个有趣的解决方案,但我更喜欢不使用信号的答案。为了便于讨论,我们将操作系统限制在Linux /其他基于unix的发行版中。

3 个答案:

答案 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,绝对是非法的。