[Cuis-dev] Another puzzle

Jan Vraný Jan.Vrany at labware.com
Fri Jun 14 04:46:07 PDT 2024


On Fri, 2024-06-14 at 08:59 +0000, Jaromir Matas via Cuis-dev wrote:
> 
> On 14-Jun-24 1:12:35 AM, "Andres Valloud via Cuis-dev" 
> <cuis-dev at lists.cuis.st> wrote:
> 
> > Hello, continuing with the puzzling behavior, here's one from a
> > book signature I got back in the year 1999 or so.
> > 
> > a := Array new: 2.
> > a at: 1 put: #perform:withArguments:.
> > a at: 2 put: a.
> > a perform: (a at: 1) withArguments: (a at: 2)
> 
> wicked :)  My guess is because #perform:withArguments: is a primitive
> the infinite loop happens inside the VM when the VM tries to evaluate
> the arguments. 

The VM just runs out of stack. Let's have a look in GDB:

...
Thread 1 "pharo" received signal SIGSEGV, Segmentation fault.
0x00005555555cc1cf in primitivePerformWithArgs ()
    at /redacted/Pharo/pharo-vm/spur64src/vm/gcc3x-cointerp.c:37631
37631	{   DECL_MAYBE_SQ_GLOBAL_STRUCT

What the VM was doing when it crashed? 

(gdb) bt 5
#0  0x00005555555cc1cf in primitivePerformWithArgs ()
    at /redacted/Pharo/pharo-vm/spur64src/vm/gcc3x-cointerp.c:37631
#1  0x00005555555ca33b in slowPrimitiveResponse ()
    at /redacted/Pharo/pharo-vm/spur64src/vm/gcc3x-cointerp.c:24422
#2  executeNewMethod () at /redacted/Pharo/pharo-vm/spur64src/vm/gcc3x-
cointerp.c:19557
#3  0x00005555555cc318 in primitivePerformWithArgs ()
    at /redacted/Pharo/pharo-vm/spur64src/vm/gcc3x-cointerp.c:37735
#4  0x00005555555ca33b in slowPrimitiveResponse ()
    at /redacted/Pharo/pharo-vm/spur64src/vm/gcc3x-cointerp.c:24422
#5  executeNewMethod () at /redacted/Pharo/pharo-vm/spur64src/vm/gcc3x-
cointerp.c:19557
(More stack frames follow...)

Let's see what code exactly was executed when it crashed? 

Dump of assembler code from 0x5555555cc1c5 to 0x5555555cc1d9:
   0x00005555555cc1c5 <primitivePerformWithArgs+37>:	jne   
0x5555555cc330 <primitivePerformWithArgs+400>
   0x00005555555cc1cb <primitivePerformWithArgs+43>:	push   %rbp
   0x00005555555cc1cc <primitivePerformWithArgs+44>:	mov   
%rsp,%rbp
=> 0x00005555555cc1cf <primitivePerformWithArgs+47>:	push   %r14
   0x00005555555cc1d1 <primitivePerformWithArgs+49>:	push   %r13
   0x00005555555cc1d3 <primitivePerformWithArgs+51>:	push   %r12
   0x00005555555cc1d5 <primitivePerformWithArgs+53>:	push   %rbx
   0x00005555555cc1d6 <primitivePerformWithArgs+54>:	movzbl
0x7(%rcx),%r12d
End of assembler dump.

Pushing a value onto a stack, what's the value of stack pointer: 

(gdb) p $rsp
$1 = (void *) 0x7fffff7ff000

That's a bit funny value...

(gdb) info proc mapping $rsp
Mapped address space for 0x7fffff7ff000:

          Start Addr           End Addr       Size     Offset  Perms 
objfile
      0x7fffff7ff000     0x7ffffffff000   0x800000        0x0  rw-p  
[stack]

So, stack pointer points just to the bottom of the stack segment.
Executing push instruction would store value to unmapped address,
causing the crash.

Fixing this issue is left as an excercise for the reader :-) 

Best, Jan


> I have no idea whether it is even possible to interrupt 
> such a loop by `Alt+.` escape sequence. I'm looking forward to what 
> others have to say. Thanks! Jaromir
> 
> 
> > 
> > 
> > Currently this expression crashes the VM.
> > 
> > Eem... the person that signed that in my book is well aware of this
> > example :p.
> > 
> > Even if this doesn't crash, you should still be able to break out
> > of it by invoking the debugger.  An infinite loop that you can't
> > interrupt is unacceptable behavior too.
> > 
> > Andres.
> > -- Cuis-dev mailing list
> > Cuis-dev at lists.cuis.st
> > https://lists.cuis.st/mailman/listinfo/cuis-dev
> > 
> > 



More information about the Cuis-dev mailing list