У меня возникла проблема с чтением исходного кода redis, может ли кто-нибудь сказать мне, что является использованием последнего оператора в функции _redisAssert
в debug.c:
*((char*)-1) = 'x';
У меня возникла проблема с чтением исходного кода redis, может ли кто-нибудь сказать мне, что является использованием последнего оператора в функции _redisAssert
в debug.c:
*((char*)-1) = 'x';
Обновление
Я нашел строку в 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 неожиданными и плохими способами.
В выражении *((char*)-1) = 'x';
:
Вы меняете значение -1
на char *
, которое дает вам указатель на отрицательный адрес, а затем пытается присвоить значение 'x'
содержимому этого адреса, который абсолютично дает
ошибка сегментации.