sql >> Database >  >> NoSQL >> Redis

Wat betekent *((char*)-1) ='x'-code?

Bijwerken

Ik vond de regel in debug.c die in de OP wordt genoemd en we kunnen zien aan de twee regels boven deze code:

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

en dezelfde code is te vinden in _redisPanic ook, dus het lijkt op hun manier om een ​​SIGSEGV . te forceren wanneer een bewering faalt of er is paniek.

Origineel

Dit ziet eruit als een debugging-tool, we kunnen zien in dit document Redis debugging guide en de relevante sectie zegt:

Redis heeft een commando om een ​​segmentatiefout (met andere woorden een slechte crash) te simuleren met behulp van het DEBUG SEGFAULT commando (gebruik het natuurlijk niet tegen een echte productie-instantie;)). Dus ik gebruik deze opdracht om mijn instantie te laten crashen om te laten zien wat er gebeurt in de GDB-kant:

en toont deze gdb-uitvoer:

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

Wat het doet is het casten van -1 aan een *char ** en er vervolgens indirectheid op uitvoeren en 'x' . toewijzen naar die geheugenlocatie. Als de thread die alk heeft gelinkt Is ((void *) -1) een geldig adres? zegt dat het op de meeste systemen niet geldig is om toegang te krijgen, laat staan ​​een waarde toe te kennen. Dit genereert een segmentatiefout op de meeste moderne besturingssystemen.

Dit is ongedefinieerd gedrag en zoals in de thread is besproken. Wat is de eenvoudigste standaard conforme manier om een ​​Segfault in C te produceren? er kan niet op worden vertrouwd. Compilers worden steeds slimmer en er zijn enkele bekende voorbeelden waarbij de compiler slim is in het misbruiken van ongedefinieerd gedrag op onverwachte en slechte manieren.



  1. Detecteren of een waarde ten minste één numeriek cijfer in SQL bevat

  2. Redis scan sleutels overslaan

  3. Verzamelobject kan niet worden opgeroepen fout met PyMongo

  4. MongoDB dropIndexes()