functions - valgrind no reconoce la instrucción memcmp en raspberry Pi
memset c (3)
Estoy probando mi aplicación en Valgrind y no puedo entender por qué arroja un error en las instrucciones no reconocidas aquí:
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 lanza esto y sale de mi aplicación.
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)
Normalmente, el código funciona bien (sin embargo, no sé si no tiene algunas pérdidas de memoria).
Sé con certeza que el problema es la instrucción memcmp pero no entiendo qué está mal.
Anteriormente en el código tengo otra instrucción que hizo lo mismo, pero podría comentarlo antes de verificar:
memcmp(ReadPtr,ToWritePtr,sizeof(struct termios)
Parece que este es un problema conocido con Valgrind en el Pi.
Para resumir, la versión en stock de memcmp en Raspbian usa una instrucción de ensamblaje que Valgrind actual simplemente no puede manejar. Desafortunadamente, esta instrucción en particular sería aparentemente muy difícil de soportar para Valgrind, por lo que es poco probable que suceda; se detectó un error en el rastreador de Valgrind pero se ha cerrado como WONTFIX.
La única manera que puedo ver para evitar esto sería sustituir tu propia versión de memcmp y esperar que no se compile para incluir las instrucciones problemáticas.
Tengo el mismo problema contigo.
Compruebo el repositorio de memcmp
brazo y parece que se reemplazó el memcmp
en libc . Así que mi solución para usar valgrind es eliminar arm-mem temporalmente y luego usar la implementación original en libc .
Prueba esto:
$ sudo mv /usr/lib/arm-linux-gnueabihf/libarmmem.so /usr/lib/arm-linux-gnueabihf/libarmmem.so.orig
$ sudo ln -s /lib/arm-linux-gnueabihf/libc.so.6 /usr/lib/arm-linux-gnueabihf/libarmmem.so
$ sudo ldconfig
Ahora intenta volver a ejecutar valgrind ...
Más tarde, muévelo de nuevo con:
$ sudo rm /usr/lib/arm-linux-gnueabihf/libarmmem.so
$ sudo mv /usr/lib/arm-linux-gnueabihf/libarmmem.so.orig /usr/lib/arm-linux-gnueabihf/libarmmem.so
$ sudo ldconfig
Necesita parchear libarmmem.so para operar en modo little-endian solamente. Para construir sobre la respuesta de @ nigelharper, Valgrind no admite la operación en endian inversa, y así atrapa la instrucción SETEND. Sin embargo, memcmp () se puede implementar sin SETEND, como se hace aquí: https://github.com/rsaxvc/arm-mem/commit/b836e465c2fd0bb006b428abce99e31607072834
@ user167752 también es correcto, la desactivación de libarmmem también funcionará, pero esto cambiará todo libarmmem, no solo memcmp ()