Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Was bedeutet *((char*)-1) ='x'-Code?

Aktualisieren

Ich habe die Zeile in debug.c gefunden, die im OP erwähnt wird, und wir können zwei Zeilen über diesem Code sehen:

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

und derselbe Code kann in _redisPanic gefunden werden auch, also sieht es so aus, als würden sie ein SIGSEGV erzwingen wenn eine Assertion fehlschlägt oder es eine Panik gibt.

Original

Dies sieht aus wie ein Debugging-Tool, wie wir in diesem Dokument Redis-Debugging-Leitfaden sehen können, und der relevante Abschnitt sagt:

Redis hat einen Befehl, um einen Segmentierungsfehler (mit anderen Worten einen schweren Absturz) mit dem Befehl DEBUG SEGFAULT zu simulieren (verwenden Sie ihn natürlich nicht gegen eine echte Produktionsinstanz;). Also werde ich diesen Befehl verwenden, um meine Instanz zum Absturz zu bringen, um zu zeigen, was auf der GDB-Seite passiert:

und zeigt diese gdb-Ausgabe:

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

Was es tut, ist -1 zu casten zu einem *char ** und führt dann eine Indirektion darauf aus und weist 'x' zu zu diesem Speicherort. Da der Thread, den alk verlinkt hat, ist ((void *) -1) eine gültige Adresse? sagt, dass es auf den meisten Systemen nicht gültig ist, darauf zuzugreifen, geschweige denn einen Wert zuzuweisen. Dies wird auf den meisten modernen Betriebssystemen einen Segmentierungsfehler erzeugen.

Dies ist ein undefiniertes Verhalten und wurde im Thread besprochen. Was ist der einfachste standardkonforme Weg, um einen Segfault in C zu erzeugen? darauf kann man sich nicht verlassen. Compiler werden immer klüger und es gibt einige berühmte Beispiele, wo der Compiler schlau darin ist, undefiniertes Verhalten auf unerwartete und schlechte Weise auszunutzen.