sql >> Base de Datos >  >> NoSQL >> Redis

¿Qué significa el código *((char*)-1) ='x'?

Actualizar

Encontré la línea en debug.c mencionada en el OP y podemos ver dos líneas arriba de este código:

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

y el mismo código se puede encontrar en _redisPanic también, por lo que parece su forma de forzar un SIGSEGV cuando una aserción falla o hay pánico.

Originales

Esto parece una herramienta de depuración, podemos ver en este documento la guía de depuración de Redis y la sección relevante dice:

Redis tiene un comando para simular una falla de segmentación (en otras palabras, un mal bloqueo) usando el comando DEBUG SEGFAULT (no lo use contra una instancia de producción real, por supuesto;). Así que usaré este comando para bloquear mi instancia y mostrar lo que sucede en el lado de GDB:

y muestra esta salida de 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';
             ^^^^^^^^^^^^^^^^^^^

Lo que está haciendo es lanzar -1 a un *char ** y luego realizar una indirección en él y asignarle 'x' a esa ubicación de memoria. Como el hilo que alk vinculó ¿Es ((void *) -1) una dirección válida? dice que en la mayoría de los sistemas no será válido acceder, y mucho menos asignarle un valor. Esto generará una falla de segmentación en la mayoría de los sistemas operativos modernos.

Este es un comportamiento indefinido y, como se explicó en el hilo. ¿Cuál es la forma estándar más simple de producir un Segfault en C? no se puede confiar en. Los compiladores se están volviendo más inteligentes y hay algunos ejemplos famosos en los que el compilador es inteligente para explotar comportamientos indefinidos de maneras inesperadas y malas.