Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Apa yang dimaksud dengan kode *((char*)-1) ='x'?

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mematikan Redis

  2. Redis tidak dapat terhubung dalam beban sibuk

  3. Bagaimana saya bisa menemukan ukuran topik redis (subset kunci)?

  4. Redis - Tabel Lua sebagai nilai balik - mengapa ini tidak berfungsi?

  5. Redis Stack Exchange cara menghapus atau mendapatkan kunci berdasarkan pola