Perbarui
Saya menemukan baris di debug.c yang disebutkan di OP dan kita dapat melihat dari dua baris di atas kode ini:
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");
dan kode yang sama dapat ditemukan di _redisPanic
juga, jadi sepertinya cara mereka untuk memaksa SIGSEGV
saat pernyataan gagal atau terjadi kepanikan.
Asli
Ini terlihat seperti alat debugging, kita dapat melihat dari dokumen ini Panduan debugging Redis dan bagian yang relevan mengatakan:
Redis memiliki perintah untuk mensimulasikan kesalahan segmentasi (dengan kata lain crash yang buruk) menggunakan perintah DEBUG SEGFAULT (jangan gunakan itu terhadap instance produksi nyata tentu saja;). Jadi saya akan menggunakan perintah ini untuk membuat crash instance saya untuk menunjukkan apa yang terjadi di sisi GDB:
dan menunjukkan keluaran gdb ini:
(gdb) continue
Continuing.
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0xffffffffffffffff
debugCommand (c=0x7ffc32005000) at debug.c:220
220 *((char*)-1) = 'x';
^^^^^^^^^^^^^^^^^^^
Apa yang dilakukannya adalah casting -1
ke *char ** dan kemudian melakukan tipuan padanya dan menetapkan 'x'
ke lokasi memori itu. Sebagai utas yang ditautkan, Apakah ((void *) -1) alamat yang valid? mengatakan pada sebagian besar sistem itu tidak akan valid untuk diakses, apalagi menetapkan nilai. Ini akan menghasilkan kesalahan segmentasi pada sebagian besar sistem operasi modern.
Ini adalah perilaku yang tidak terdefinisi dan seperti yang telah dibahas di utas Apa cara standar yang paling sederhana untuk menghasilkan Segfault di C? itu tidak bisa diandalkan. Kompiler semakin pintar dan ada beberapa contoh terkenal di mana kompiler pintar dalam mengeksploitasi perilaku yang tidak ditentukan dengan cara yang tidak terduga dan buruk.