sql >> Databáze >  >> NoSQL >> Redis

Co znamená kód *((char*)-1) ='x'?

Aktualizovat

Našel jsem řádek v debug.c zmíněný v OP a ze dvou řádků nad tímto kódem vidíme:

redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");

a stejný kód lze nalézt v _redisPanic také, takže to vypadá jako jejich způsob, jak vynutit SIGSEGV když tvrzení selže nebo dojde k panice.

Původní

Vypadá to jako nástroj pro ladění, můžeme vidět z tohoto dokumentu Průvodce laděním Redis a příslušná sekce říká:

Redis má příkaz pro simulaci chyby segmentace (jinými slovy špatného pádu) pomocí příkazu DEBUG SEGFAULT (samozřejmě jej nepoužívejte proti skutečné produkční instanci;). Takže použiji tento příkaz ke zhroucení mé instance, abych ukázal, co se děje na straně GDB:

a zobrazí tento výstup gdb:

 (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';
             ^^^^^^^^^^^^^^^^^^^

To, co dělá, je casting -1 na *znak ** a poté na něj provedeme nepřímé směrování a přiřadíme 'x' do tohoto paměťového místa. Jako vlákno, které alk propojil Je ((void *) -1) platná adresa? říká, že na většině systémů nebude platný přístup, natož přiřazení hodnoty. To způsobí chybu segmentace na většině moderních operačních systémů.

Toto je nedefinované chování a jak bylo uvedeno ve vláknu Jaký je nejjednodušší standardní způsob, jak vytvořit Segfault v C? nedá se na to spoléhat. Kompilátory jsou stále chytřejší a existuje několik slavných příkladů, kdy kompilátor chytře zneužívá nedefinované chování neočekávaným a špatným způsobem.



  1. Nasadit Meteor.js na example.com nebo www.example.com?

  2. Přehled indexování databáze pro MongoDB

  3. Mongoose:Je vyžadována cesta chyby ověření

  4. Chyba ověření Redis u Node.js a socket.io