Nat! bio photo

Nat!

Senior Mull.

Twitter RSS

Github

My best bug ever

This is obscure, but who said programming is always easy. Maybe more on this later, if I know whats going on. This is the disassembled code for -value:

0x35204c8a  <+0000>  push   %ebp
0x35204c8b  <+0001>  mov    %esp,%ebp
0x35204c8d  <+0003>  sub    $0x8,%esp
0x35204c90  <+0006>  mov    0x8(%ebp),%eax
0x35204c93  <+0009>  mov    0xc(%eax),%eax
0x35204c96  <+0012>  leave  
0x35204c97  <+0013>  ret 

and this is -key:

0x35204ea6  <+0000>  push   %ebp
0x35204ea7  <+0001>  mov    %esp,%ebp
0x35204ea9  <+0003>  sub    $0x8,%esp
0x35204eac  <+0006>  mov    0x8(%ebp),%eax
0x35204eaf  <+0009>  mov    0x8(%eax),%eax
0x35204eb2  <+0012>  leave  
0x35204eb3  <+0013>  ret    

I hightlighted the only difference in the assembly code between the two functions.

Stepping through the code, with the same object

There are breakpoints on 0x35204c90 and 0x35204eac -value works as expected but -key doesn't

(gdb) stepi
(gdb) p/x $eax
$16 = 0x30de9f0
(gdb) x/4 $eax
0x30de9f0: 0x35231f20 0x925c93a8 0x04a053c0 0x00d7dfa0
(gdb) x/x $eip
0x35204c93 <-[xxx value]+9>:      0xc90c408b
(gdb) stepi
(gdb) p/x $eax
$17 = 0xd7dfa0
(gdb) c
Continuing.
(gdb) stepi
(gdb) p/x $eax
$18 = 0x30de9f0
(gdb) x/4x 0x30de9f0
0x30de9f0: 0x35231f20 0x925c93a8 0x04a053c0 0x00d7dfa0
(gdb) x/x $eip
0x35204eaf <-[xxx key]+9>:        0xc908408b
(gdb) stepi
(gdb) p/x $eax
$19 = 0x20454c4c
(gdb) set $eip = 0x35204eaf
(gdb) set $eax = 0x30de9f0
(gdb) stepi
(gdb) p/x $eax
$20 = 0x20454c4c
(gdb) set $eip = 0x35204c93
(gdb) set $eax = 0x30de9f0
(gdb) stepi
(gdb) p/x $eax
$21 = 0xd7dfa0
(gdb) 
(gdb) x/4x 0x30de9f0
0x30de9f0: 0x35231f20 0x925c93a8 0x04a053c0 0x00d7dfa0

There is nothing ommitted, there is no other thread of mine running. 0xc908408b in Visual Studio is also mov eax,dword ptr [eax+8].