Saya mencoba membuat program Python yang berinteraksi dengan proses crash yang berbeda (itu di luar kendali saya). Sayangnya program saya berinteraksi dengan bahkan tidak crash dengan andal! Jadi saya ingin membuat program C ++ cepat yang macet dengan sengaja tapi saya tidak benar-benar tahu cara terbaik dan terpendek untuk melakukan itu, apakah ada yang tahu apa yang harus dimasukkan di antara saya:
int main() {
crashyCodeGoesHere();
}
untuk membuat crash program C ++ saya andal
asm { cli; };
*((char*)-1) = 'x';
kode berikut untuk memicu kerusakan agar dapat melakukan debug, baca selengkapnya di jawabanJawaban:
The
abort()
fungsi mungkin Anda terbaik. Ini adalah bagian dari pustaka standar C, dan didefinisikan sebagai "menyebabkan penghentian program yang tidak normal" (misalnya, kesalahan fatal atau crash).sumber
abort()
tidak memanggil destruktor atauatexit
fungsi apa pun , meskipun itu mungkin tidak masalah di sini.atexit
s, itu tidak akan menjadi crash sekarang kan?abort()
jawaban yang benar, maka apakah 'keluar (-1); `dapat diterima?Mencoba:
Ditemukan di:
sumber
signal()
. Namun, sebagian besar aplikasi waras tidak.raise()
. Ini memungkinkan Anda menguji banyak jenis pengecualian dengan hanya mengubah argumen.Membagi dengan nol akan merusak aplikasi:
sumber
main
sepenuhnya dihapus termasukret
instruksi. Eksekusi bisa saja jatuh ke dalam fungsi berikut.sumber
Nah, apakah kita berada di stack overflow , atau tidak?
(Tidak dijamin macet dengan standar apa pun, tetapi tidak ada jawaban yang disarankan termasuk yang diterima karena
SIGABRT
bisa saja tertangkap. Dalam praktiknya, ini akan macet di mana-mana.)sumber
(&i)[i] += !i
, tetapi saya khawatir kompilernya mungkin cukup pintar dan ingin mengoptimalkannya. :-)Hanya jawabannya ... :)
sumber
assert(false);
cukup bagus juga.Menurut ISO / IEC 9899: 1999 dijamin macet ketika NDEBUG tidak didefinisikan:
sumber
assert
dibuat setara dengan((void)0)
dalam mode Rilis.Karena crash adalah gejala dari memanggil perilaku yang tidak terdefinisi, dan karena memanggil perilaku yang tidak terdefinisi dapat menyebabkan apa saja, termasuk crash, saya tidak berpikir Anda ingin benar-benar crash program Anda, tetapi hanya memasukkannya ke debugger. Cara yang paling portabel untuk melakukannya adalah mungkin
abort()
.Walaupun
raise(SIGABRT)
memiliki efek yang sama, tentu lebih untuk menulis. Namun kedua cara dapat dicegat dengan memasang pengatur sinyal untukSIGABRT
. Jadi tergantung pada situasi Anda, Anda mungkin ingin / perlu menaikkan sinyal lain.SIGFPE
,SIGILL
,SIGINT
,SIGTERM
AtauSIGSEGV
mungkin cara untuk pergi, tetapi mereka semua dapat disadap.Ketika Anda tidak bisa diport, pilihan Anda mungkin lebih luas, seperti menggunakan
SIGBUS
di linux.sumber
Satu-satunya flash yang saya miliki adalah fungsi abort () :
Ini membatalkan proses dengan penghentian program yang tidak normal. Ini menghasilkan sinyal SIGABRT , yang secara default menyebabkan program untuk menghentikan mengembalikan kode kesalahan terminasi yang tidak berhasil ke lingkungan host. Program ini diakhiri tanpa mengeksekusi destruktor untuk objek durasi penyimpanan otomatis atau statis. , dan tanpa menyebut setiap atexit (yang disebut oleh exit () sebelum berakhir Program) fungsi. Itu tidak pernah kembali ke peneleponnya.
sumber
Jawabannya adalah spesifik platform dan tergantung pada tujuan Anda. Tapi inilah fungsi crash Mozilla Javascript, yang menurut saya menggambarkan banyak tantangan untuk membuat ini bekerja:
sumber
Saya melihat ada banyak jawaban diposting di sini yang akan jatuh ke dalam kasus beruntung untuk menyelesaikan pekerjaan, tetapi tidak satupun dari mereka yang 100% deterministik untuk crash. Beberapa akan crash pada satu perangkat keras dan OS, yang lain tidak. Namun, ada cara standar sesuai standar C ++ resmi untuk membuatnya crash.
Mengutip dari C ++ Standard ISO / IEC 14882 §15.1-7 :
Saya telah menulis kode kecil untuk menunjukkan ini dan dapat ditemukan dan dicoba di Ideone di sini .
ISO / IEC 14882 §15.1 / 9 menyebutkan lemparan tanpa blok percobaan yang mengakibatkan panggilan implisit untuk dibatalkan:
Lainnya termasuk: throw from destructor: ISO / IEC 14882 §15.2 / 3
sumber
Ini akan menghasilkan kesalahan segmentasi.
sumber
Yang ini tidak ada:
sumber
Bagaimana dengan stack overflow oleh pemanggilan metode recursive loop mati?
Lihat contoh asli pada Microsoft KB
sumber
Ini macet di sistem Linux saya, karena string literal disimpan dalam memori hanya baca:
Omong-omong, g ++ menolak untuk mengkompilasi ini. Kompiler semakin pintar dan pintar :)
sumber
Kompiler Anda mungkin akan memperingatkan Anda tentang hal ini, tetapi kompilasi dengan baik di bawah GCC 4.4.3 Ini mungkin akan menyebabkan SIGFPE (floating-point exception), yang mungkin tidak mungkin dalam aplikasi nyata seperti SIGSEGV (pelanggaran segmentasi memori) sebagai jawaban yang lain menyebabkan, tetapi masih crash. Menurut pendapat saya, ini jauh lebih mudah dibaca.
Cara lain, jika kita akan menipu dan menggunakan
signal.h
, adalah:Ini dijamin untuk membunuh subproses, berbeda dengan SIGSEGV.
sumber
Ini adalah versi yang lebih terjamin dari pembatalan yang disajikan dalam jawaban di atas. Ini menangani situasi saat sigabrt diblokir.
sumber
Ini juga harus crash. Pada Windows crash dengan AccessViolation dan seharusnya melakukan hal yang sama pada semua OS-es kurasa.
sumber
on all OS-es
Tidak, itu tidak crash di OS non lindung (misalnya MS-DOS.) Sebenarnya, kadang-kadang ada yang sesuatu di alamat 0! Untuk mode real x86, Interrupt Vector Table ada di alamat 0.main()
.Ini cuplikan yang disediakan oleh Google di Breakpad.
sumber
sumber
Meskipun pertanyaan ini sudah memiliki jawaban yang diterima ...
Atau...
void main(){throw 1;}
sumber
Menulis ke memori read-only akan menyebabkan kesalahan segmentasi kecuali jika sistem Anda tidak mendukung blok memori read-only.
Saya telah mengujinya dengan MingGW 5.3.0 di Windows 7 dan GCC di Linux Mint. Saya kira kompiler dan sistem lain akan memberikan efek yang sama.
sumber
Atau cara lain karena kita berada di kereta band.
Sepotong indah rekursi tak terbatas. Dijamin akan meniup tumpukan Anda.
Mencetak:
sumber
main
diri sendiri sebenarnya adalah perilaku yang tidak terdefinisi, jika Anda tidak tahu :) Juga, rekursi ekor tidak dijamin akan meledakkan tumpukan Anda. Jika Anda menginginkan "jaminan", Anda harus melakukan sesuatu setelah panggilan rekursif, jika tidak kompiler dapat mengoptimalkan rekursi menjadi loop tak terbatas.Satu yang belum disebutkan:
Ini akan memperlakukan pointer nol sebagai pointer fungsi dan kemudian menyebutnya. Sama seperti kebanyakan metode, ini tidak dijamin untuk crash program, tetapi kemungkinan OS memungkinkan ini untuk tidak dicentang dan program yang pernah kembali diabaikan.
sumber
Semoga ini macet. Bersulang.
sumber
sumber
long long
atausize_t
dan mulai denganp
nilai maksimum masing-masing, atau mendekati itu, untuk crash lebih cepat. Meskipun itu masih belum dijamin macet bahkan dalam kasus itu.Cara bergaya untuk melakukan ini adalah panggilan fungsi virtual murni:
Dikompilasi dengan gcc, ini mencetak:
sumber
Anda dapat menggunakan perakitan di c ++
code
BUT AndaINT 3
hanya untuk sistem x86 sistem lain mungkin memiliki instruksi trap / breakpoint lainnya.INT 3
menyebabkan interupsi dan memanggil vektor interupsi yang diatur oleh OS.sumber
Gunakan __builtin_trap () di GCC atau dentang, atau __debugbreak () di MSVC. Tidak menangani breakpoints / traps ini akan menyebabkan eksepsi / crash breakpoint yang tidak tertangani. Saran lain yang menggunakan batalkan () atau keluar (): yang mungkin ditangani oleh utas lainnya, membuatnya lebih sulit untuk melihat tumpukan utas yang menyebarkan crash.
sumber
Membebaskan pointer yang tidak diinisialisasi adalah perilaku yang tidak terdefinisi. Pada banyak platform / kompiler,
freeThis
akan memiliki nilai acak (apa pun yang ada di lokasi memori itu sebelumnya). Membebaskannya akan meminta sistem untuk membebaskan memori di alamat itu, yang biasanya akan menyebabkan kesalahan segmentasi dan membuat program macet.sumber