Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

valgrind unrecognizes memcmp instruction in raspberry Pi

I'm testing my aplication in Valgrind an i can't understand why it throws error on unrecognised instruction in this here:

unsigned char *temp=SearchStartPtr;
unsigned char *NrStartPos=NULL;
unsigned char *Param=(unsigned char*)ParamName; //this is originally *char with "PAR#" inside

if(0==memcmp(temp,Param,4)) 
        {
        NrStartPos=temp;
        break;
        }       

Valgrind throws this and exits my application.

disInstr(arm): unhandled instruction: 0xF1010200
cond=15(0xF) 27:20=16(0x10) 4:4=0 3:0=0(0x0)
==7679== valgrind: Unrecognised instruction at address 0x4843588.
==7679==    at 0x4843588: ??? (in /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so)
Your program just tried to execute an instruction that Valgrind
==7679== did not recognise.  There are two possible reasons for this.
==7679== 1. Your program has a bug and erroneously jumped to a non-code
==7679==    location.  If you are running Memcheck and you just saw a
==7679==    warning about a bad jump, it's probably your program's fault.
==7679== 2. The instruction is legitimate but Valgrind doesn't handle it,
==7679==    i.e. it's Valgrind's fault.  If you think this is the case or
==7679==    you are not sure, please let us know and we'll try to fix it.
==7679== Either way, Valgrind will now raise a SIGILL signal which will
==7679== probably kill your program.
==7679== 
==7679== Process terminating with default action of signal 4 (SIGILL)
==7679==  Illegal opcode at address 0x4843588
==7679==    at 0x4843588: ??? (in /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so)

Normally the code works fine (however i don't know if it doesn't have some memory leaks).

I know for sure that the problem is memcmp instruction but i don't understand what is wrong.

Earlier in the code i have another instruction which did the same thing but i could just comment it away before checking:

  memcmp(ReadPtr,ToWritePtr,sizeof(struct termios)
like image 526
Gregorek Avatar asked Nov 19 '13 08:11

Gregorek


1 Answers

You need to patch libarmmem.so to operate in little-endian-mode only. To build on @nigelharper's answer, Valgrind does not support operation in reverse endian, and so traps on the SETEND instruction. However, memcmp() can be implemented without SETEND, as done here: https://github.com/rsaxvc/arm-mem/commit/b836e465c2fd0bb006b428abce99e31607072834

@user167752 is also correct, that disabling libarmmem will also work, but this will change out all of libarmmem, not just memcmp()

like image 140
rsaxvc Avatar answered Nov 16 '22 01:11

rsaxvc