2017-07-16 68 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和「最好不管平臺」的態度是嚴格的話,那麼就沒有辦法強制這個在世界上每個平臺上都能工作的方法。