我想知道什麼最好的方法是可靠地將錯誤分段爲一段C代碼?我該如何強制我的代碼分段錯誤?
我完全意識到這是不好的行爲,絕對不應該用在一個軟件中,但我想知道如何能夠一致地強制它發生。
編輯:最好不管平臺。
編輯2:SIGSEGV是一個有趣的解決方案,但我更喜歡不使用信號的答案。爲了討論的緣故,我們把操作系統限制在Linux /其他基於unix的發行版中。
我想知道什麼最好的方法是可靠地將錯誤分段爲一段C代碼?我該如何強制我的代碼分段錯誤?
我完全意識到這是不好的行爲,絕對不應該用在一個軟件中,但我想知道如何能夠一致地強制它發生。
編輯:最好不管平臺。
編輯2:SIGSEGV是一個有趣的解決方案,但我更喜歡不使用信號的答案。爲了討論的緣故,我們把操作系統限制在Linux /其他基於unix的發行版中。
很難定義方法分段錯誤未定義平臺上的程序。 A 分段錯誤是一個沒有爲所有平臺定義的鬆散術語(例如,簡單的小型計算機)。
僅考慮支持進程的操作系統,進程可以接收發生分段錯誤的通知。
此外,限制操作系統「UNIX像」操作系統,用於處理接收SIGSEGV信號的可靠方法是kill(getpid(),SIGSEGV)
正如大多數跨平臺的問題的情況下,每個平臺可(一個通常做)對區段錯誤有不同的定義。
但要實用,並回答EDIT2,當前MAC,林,贏得操作系統將段錯誤的
*(int*)0 = 0;
而且,這不是不良行爲造成段錯誤。 assert()
的某些實現會導致產生核心文件的SIGSEGV信號。當你需要屍體解剖時非常有用。
有什麼比使段錯誤更糟糕的是隱藏它:
try
{
anyfunc();
}
catch (...)
{
printf("?\n");
}
其中隱藏着一個錯誤的起源和所有你必須去的是:
?
。
*什麼是分段錯誤* https://stackoverflow.com/questions/2346806/what-is-a-segmentation-fault –
只要嘗試讀取或寫入非法內存位置。例如:
memset(NULL, 1, 1);
在這裏,您正在編寫一個地址爲0,絕對是非法的。
不是一個真正的零大小的數組,而是一個無效的內存位置。 –
是的,你是對的,我太困了xD – hedgar2017
@RetiredNinja好,沒有辦法強制在每個平臺上發生段錯誤。很顯然,對此的任何回答只會在某些情況下起作用 –
C語言本身沒有指定有關分段錯誤的任何內容。它表示如果您嘗試訪問無效內存,則行爲未定義。分段錯誤或SIGSEGV
是來自某些底層平臺的常見信號,表示無效的內存訪問。但顯然,底層平臺可以決定它如何表現這種錯誤。
話雖如此,如果你對C和「最好不管平臺」的態度是嚴格的話,那麼就沒有辦法強制這個在世界上每個平臺上都能工作的方法。
可靠地針對您的特定平臺或獨立於平臺的方式嗎? –
嘗試類似'*((char *)0)='\ 0';' –
@Mad Physicist最好是獨立於平臺 – Erich