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.