Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

O que significa *((char*)-1) =código 'x'?


Atualizar

Encontrei a linha em debug.c mencionada no OP e podemos ver em duas linhas acima deste código:
redisLog(REDIS_WARNING,"(forcing SIGSEGV to print the bug report.)");

e o mesmo código pode ser encontrado em _redisPanic também, então parece que eles forçam um SIGSEGV quando uma afirmação falha ou há pânico.

Original

Isso parece uma ferramenta de depuração, podemos ver neste documento o guia de depuração do Redis e a seção relevante diz:

O Redis tem um comando para simular uma falha de segmentação (em outras palavras, uma falha grave) usando o comando DEBUG SEGFAULT (não o use contra uma instância de produção real, é claro;). Então, usarei este comando para travar minha instância para mostrar o que acontece no lado do GDB:

e mostra esta saída 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';
             ^^^^^^^^^^^^^^^^^^^

O que ele está fazendo é lançar -1 para um *char ** e, em seguida, realizando a indireção nele e atribuindo 'x' para esse local de memória. Como o thread que alk linkou é ((void *) -1) um endereço válido? diz que na maioria dos sistemas não será válido acessar, muito menos atribuir um valor. Isso gerará uma falha de segmentação na maioria dos sistemas operacionais modernos.

Este é um comportamento indefinido e como foi abordado no thread Qual é a maneira mais simples de conformidade padrão para produzir um Segfault em C? não pode ser invocado. Os compiladores estão ficando mais inteligentes e há alguns exemplos famosos em que o compilador é inteligente em explorar o comportamento indefinido de maneiras inesperadas e ruins.