Re: unhandled instruction bytes

Eliot Moss <[email protected]> Tue, 18 Apr 2023 11:32:37 -0400
Newsgroups gmane.comp.debugging.valgrind
Message-ID <[email protected]>
On 4/18/2023 10:51 AM, folkert wrote:
> Hi,
> 
> I wrote a compiler for brainfuck to x86.
> The result is quite fast but I was curious if I could tune it even more.
> So I ran it in callgrind but this resulted in:
> 
> folkert@snsv ~/Projects/bf-compiler (master)$ valgrind --tool=callgrind ./test
> ==77043== Callgrind, a call-graph generating cache profiler
> ==77043== Copyright (C) 2002-2017, and GNU GPL'd, by Josef Weidendorfer et al.
> ==77043== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
> ==77043== Command: ./test
> ==77043==
> ==77043== For interactive control, run 'callgrind_control -h'.
> vex amd64->IR: unhandled instruction bytes: 0xCD 0x80 0xC3 0x67 0x80 0x3E 0x0 0x74 0x5 0x83
> vex amd64->IR:   REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
> vex amd64->IR:   VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=NONE
> vex amd64->IR:   PFX.66=0 PFX.F2=0 PFX.F3=0
> ==77043== valgrind: Unrecognised instruction at address 0x40274e.
> ==77043==    at 0x40274E: ??? (in /home/folkert/Projects/bf-compiler/test)
> ==77043==    by 0x4020EE: ??? (in /home/folkert/Projects/bf-compiler/test)
> ==77043== Your program just tried to execute an instruction that Valgrind
> ==77043== did not recognise.  There are two possible reasons for this.
> ==77043== 1. Your program has a bug and erroneously jumped to a non-code
> ==77043==    location.  If you are running Memcheck and you just saw a
> ==77043==    warning about a bad jump, it's probably your program's fault.
> ==77043== 2. The instruction is legitimate but Valgrind doesn't handle it,
> ==77043==    i.e. it's Valgrind's fault.  If you think this is the case or
> ==77043==    you are not sure, please let us know and we'll try to fix it.
> ==77043== Either way, Valgrind will now raise a SIGILL signal which will
> ==77043== probably kill your program.
> ==77043==
> ==77043== Process terminating with default action of signal 4 (SIGILL)
> ==77043==  Illegal opcode at address 0x40274E
> ==77043==    at 0x40274E: ??? (in /home/folkert/Projects/bf-compiler/test)
> ==77043==    by 0x4020EE: ??? (in /home/folkert/Projects/bf-compiler/test)
> ==77043==
> ==77043== Events    : Ir
> ==77043== Collected : 28836
> ==77043==
> ==77043== I   refs:      28,836
> Illegal instruction (core dumped)
> 
> If you're curious what is going wrong here, the source assembly and the
> x86 binary can be retrieved from
> https://vanheusden.com/permshare/callgrind-error.tar.xz
> 
> Oh and if you would like to assemble the assembly yourself:
> 
> as -g mandelbrot.s
> ld -g a.out -o test
> 
> ./test then results in the mandelbrot-fractal.

Using an online disassembler, I found that the initial bytes decode to
int 0x80, which (under Linux) is a system call.  Maybe you're making a
system call that valgrind does not recognize?  One would need to know
register contents to go further with that.

Btw, naming a program "test" is not necessarily a wonderful idea if
the current directory happens to be on your path, since "test" is a
program often used by scripts.

Cheers - Eliot Moss