Что означает "* ((char *) - 1) = 'x';" код означает?

У меня возникла проблема с чтением исходного кода redis, может ли кто-нибудь сказать мне, что является использованием последнего оператора в функции _redisAssert в debug.c:

*((char*)-1) = 'x';

Ответ 1

Обновление

Я нашел строку в debug.c, упомянутую в OP, и мы можем видеть из двух строк выше этого кода:

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

и тот же код можно найти и в _redisPanic, поэтому он выглядит как способ заставить SIGSEGV, когда утверждение терпит неудачу или возникает паника.

Оригинал

Это выглядит как инструмент отладки, мы можем видеть из этого документа руководство по отладке Redis и соответствующий раздел говорит:

Redis имеет команду для имитации ошибки сегментации (другими словами, плохой сбой) с использованием команды DEBUG SEGFAULT (не используйте ее, конечно, для реального экземпляра); Поэтому я буду использовать эту команду для сбоя моего экземпляра, чтобы показать, что происходит со стороны GDB:

и показывает этот вывод 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';
             ^^^^^^^^^^^^^^^^^^^

То, что он делает, - это лить -1 в * * w980 > **, а затем выполнить на нем косвенность и назначить 'x' этой ячейке памяти. Как нить, которую алк связывает Is ((void *) -1) действительный адрес? говорит, что в большинстве систем он недействителен для доступа, не говоря уже о назначении значения к. Это сгенерирует segmentation fault в большинстве современных операционных систем.

Это undefined поведение и, как это было в потоке Что такое простейший стандартный способ создания Segfault в C? на него нельзя положиться. Компиляторы становятся умнее, и есть некоторые известные примеры, когда компилятор умеет использовать поведение undefined неожиданными и плохими способами.

Ответ 2

В выражении *((char*)-1) = 'x';:

Вы меняете значение -1 на char *, которое дает вам указатель на отрицательный адрес, а затем пытается присвоить значение 'x' содержимому этого адреса, который абсолютично дает ошибка сегментации.