cvalgrindraspberry-piraspbian

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)

Solution

  • It would appear that this is a known issue with Valgrind on the Pi.

    To summarise the stock version of memcmp in Raspbian uses an assembly instruction which current Valgrind simply can't handle. Unfortunately this particular instruction would apparently be very difficult for Valgrind to support so it's unlikely it'll happen - a bug was raised in the Valgrind tracker but has been closed as WONTFIX.

    About the only way I can see to work around this would be to substitute your own version of memcmp and hope it doesn't compile down to include the problematic instruction.