sql >> Databasteknik >  >> NoSQL >> Redis

Vad betyder *((char*)-1) ='x'-koden?

Uppdatera

Jag hittade raden i debug.c som nämns i OP och vi kan se från två rader ovanför denna kod:

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

och samma kod finns i _redisPanic likaså, så det ser ut som deras sätt att tvinga fram en SIGSEGV när ett påstående misslyckas eller det uppstår panik.

Original

Detta ser ut som ett felsökningsverktyg, vi kan se från detta dokument Redis felsökningsguide och relevant avsnitt säger:

Redis har ett kommando för att simulera ett segmenteringsfel (med andra ord en dålig krasch) med kommandot DEBUG SEGFAULT (använd det inte mot en riktig produktionsinstans förstås;). Så jag använder det här kommandot för att krascha min instans för att visa vad som händer på GDB-sidan:

och visar denna gdb-utgång:

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

Vad den gör är att casta -1 till en *char ** och utför sedan inriktning på den och tilldelar 'x' till den minnesplatsen. Som tråden som alk länkade Är ((void *) -1) en giltig adress? säger att det på de flesta system inte kommer att vara giltigt att komma åt, än mindre tilldela ett värde till. Detta kommer att generera ett segmenteringsfel på de flesta moderna operativsystem.

Detta är ett odefinierat beteende och som beskrevs i tråden. Vilket är det enklaste standardkonforma sättet att producera en Segfault i C? det går inte att lita på. Kompilatorer blir smartare och det finns några kända exempel där kompilatorn är smart när det gäller att utnyttja odefinierat beteende på oväntade och dåliga sätt.



  1. MongoDB mongoose utfasningsvarning

  2. Ansluter till MongoDB över SSL med Node.js

  3. Uppdatering av inbäddad dokumentegenskap i Mongodb

  4. infoga Många Hantera Duplicate Errors