Redis
 sql >> Database >  >> NoSQL >> Redis

Cosa significa codice *((char*)-1) ='x'?

Aggiorna

Ho trovato la riga in debug.c menzionata nell'OP e possiamo vedere da due righe sopra questo codice:

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

e lo stesso codice può essere trovato in _redisPanic anche, quindi sembra il loro modo per forzare un SIGSEGV quando un'affermazione fallisce o c'è il panico.

Originale

Sembra uno strumento di debug, possiamo vedere da questo documento Guida al debug di Redis e la sezione pertinente dice:

Redis ha un comando per simulare un errore di segmentazione (in altre parole un brutto crash) usando il comando DEBUG SEGFAULT (ovviamente non usarlo contro un'istanza di produzione reale;). Quindi userò questo comando per arrestare in modo anomalo la mia istanza per mostrare cosa succede sul lato GDB:

e mostra questo output di 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';
             ^^^^^^^^^^^^^^^^^^^

Quello che sta facendo è trasmettere -1 a un *char ** e quindi eseguire l'indirizzamento su di esso e assegnare 'x' in quella posizione di memoria. Poiché il thread collegato è ((void *) -1) un indirizzo valido? dice che sulla maggior parte dei sistemi non sarà valido per l'accesso, per non parlare di assegnare un valore a. Ciò genererà un errore di segmentazione sulla maggior parte dei sistemi operativi moderni.

Questo è un comportamento indefinito e come è stato spiegato nel thread Qual è il modo più semplice conforme allo standard per produrre un Segfault in C? non si può fare affidamento. I compilatori stanno diventando più intelligenti e ci sono alcuni esempi famosi in cui il compilatore è intelligente nello sfruttare comportamenti indefiniti in modi imprevisti e cattivi.