2017-07-16 77 views
1

我想知道什么最好的方法是可靠地将错误分段为一段C代码?我该如何强制我的代码分段错误?

我完全意识到这是不好的行为,绝对不应该用在一个软件中,但我想知道如何能够一致地强制它发生。

编辑:最好不管平台。

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

+1

可靠地针对您的特定平台或独立于平台的方式吗? –

+3

尝试类似'*((char *)0)='\ 0';' –

+0

@Mad Physicist最好是独立于平台 – Erich

回答

2

很难定义方法分段错误未定义平台上的程序。 A 分段错误是一个没有为所有平台定义的松散术语(例如,简单的小型计算机)。

仅考虑支持进程的操作系统,进程可以接收发生分段错误的通知。

此外,限制操作系统“UNIX像”操作系统,用于处理接收SIGSEGV信号的可靠方法是kill(getpid(),SIGSEGV)

正如大多数跨平台的问题的情况下,每个平台可(一个通常做)对区段错误有不同的定义。

但要实用,并回答EDIT2,当前MAC,林,赢得操作系统将段错误的

*(int*)0 = 0; 

而且,这不是不良行为造成段错误。 assert()的某些实现会导致产生核心文件的SIGSEGV信号。当你需要尸体解剖时非常有用。

有什么比使段错误更糟糕的是隐藏它:

try 
{ 
    anyfunc(); 
} 
catch (...) 
{ 
    printf("?\n"); 
} 

其中隐藏着一个错误的起源和所有你必须去的是:

? 

+0

*什么是分段错误* https://stackoverflow.com/questions/2346806/what-is-a-segmentation-fault –

0

只要尝试读取或写入非法内存位置。例如:

memset(NULL, 1, 1); 

在这里,您正在编写一个地址为0,绝对是非法的。

+0

不是一个真正的零大小的数组,而是一个无效的内存位置。 –

+0

是的,你是对的,我太困了xD – hedgar2017

+0

@RetiredNinja好,没有办法强制在每个平台上发生段错误。很显然,对此的任何回答只会在某些情况下起作用 –

1

C语言本身没有指定有关分段错误的任何内容。它表示如果您尝试访问无效内存,则行为未定义。分段错误或SIGSEGV是来自某些底层平台的常见信号,表示无效的内存访问。但显然,底层平台可以决定它如何表现这种错误。

话虽如此,如果你对C和“最好不管平台”的态度是严格的话,那么就没有办法强制这个在世界上每个平台上都能工作的方法。