2012-09-13 49 views
1

我試圖設置我的服務器處理核心轉儲的方式。爲了測試它,我需要一個總是出現段錯誤的程序。段錯誤最小的C/C++程序?

有沒有一個簡單的示例程序總是segfaults?

+2

Coredump or segfault?通常'abort()'足以導致核心轉儲,而這實際上是* real *程序的一部分。段錯從來沒有。 –

+0

這是C還是C++?標籤說C,標題說這兩個。 –

+0

@ShafikYaghmour:我的意思是最小的程序,用C或C++編寫*,即段錯誤。如果需要,您可以添加C++標記。 –

回答

4

main;

是可移植的,段錯誤5chars。

7

main() { *(int *)0xdeadbeef = 37; }應該這樣做。

+6

爲什麼37?它應該是42! –

4

試試這個:

long* ptr = 0x0; //-- you can also use other random values and likely you will segfault 
printf("%f", *ptr); 
2

你可以試試:

main() { 
char *p = NULL; 
char c = *p; 
} 
+1

這可以通過編譯器的優化器消除。你需要指針指向一個易失性對象才能工作。 –

+0

@AlexeyFrunze:只是不要優化:) –

0

這應該死:

int main() { 
    char *die; 
    printf("%d",(int *)die * 200); 
    return 0; 
} 

編輯:

int main() { 
    char *die; 
    int killer = 200; 
    while(1) { 
     printf("%d",(int *)die * killer); 
     killer = killer * killer; 
    } 
    return 0; 
} 
+1

爲什麼要這樣做?它是UB,所以它可能,但它也可以打印任意數字。 –

+0

啊,甚至不用gcc編譯。你必須明確地將'char *'轉換爲整數才能編譯(不確定編譯器是否允許隱式轉換,標準沒有,但我認爲只需要診斷,而不是終止彙編)。 –

+0

現在它仍然是UB,因爲您正在使用未初始化指針的不確定值,但我不知道實際上會崩潰的任何實現。什麼是你想如何導致崩潰的想法? –