It looks like live_cons_p (M, P) may be true if P is a cons cell from
the spare_memory[X], X = 1..4. So, mark_maybe_{object, pointer} may
call to mark_object for an uninitialized cons from spare blocks, with
random results (most probably a crash). This is very hard to reproduce
because it depends from the values found on a C stack.
The same looks to be true for live_string_p and spare_memory[5, 6].
Suggested fix is to use MEM_TYPE_NON_LISP for spare memory, e.g.: