Esto ha estado pendiente por mucho tiempo en mi lista ahora. En resumen: necesito ejecutar mocked_dummy()
en el lugar de dummy()
EN TIEMPO DE EJECUCIÓN, sin modificar factorial()
. No me importa el punto de entrada del software. Puedo agregar cualquier cantidad de funciones adicionales (pero no puedo modificar el código dentro de /*---- do not modify ----*/
).burlarse en tiempo de ejecución en C?
¿Por qué necesito esto?
Para realizar pruebas unitarias de algunos módulos C heredados. Sé que hay muchas herramientas disponibles, pero si es posible burlarme en el tiempo de ejecución, puedo cambiar mi enfoque UT (agregar componentes reutilizables) para facilitar mi vida :).
Plataforma/Medio ambiente?
Linux, ARM, gcc.
¿Enfoque que estoy intentando?
- Sé que GDB usa instrucciones trap/ilegales para sumar puntos de corte (gdb internals).
- Haga que el código sea auto modificable.
- Reemplace el segmento de código
dummy()
con instrucciones ilegales, y devuelva como próxima instrucción inmediata. - Control de transferencias al manipulador de trampa.
- Trap handler es una función reutilizable que se lee desde un socket de dominio Unix.
- Dirección de la función
mocked_dummy()
se pasa (leer del archivo de mapa). - Se ejecuta la función de simulacro.
Hay problemas para seguir adelante desde aquí. También encontré que el enfoque es tedioso y requiere buena cantidad de codificación, algunos también en ensamblaje.
También encontré, en gcc, cada llamada a la función puede ser hooked/instrumented, pero de nuevo no es muy útil, ya que la función está destinada a ser burlada de todos modos se ejecutará.
¿Hay algún otro enfoque que pueda usar?
#include <stdio.h>
#include <stdlib.h>
void mocked_dummy(void)
{
printf("__%s__()\n",__func__);
}
/*---- do not modify ----*/
void dummy(void)
{
printf("__%s__()\n",__func__);
}
int factorial(int num)
{
int fact = 1;
printf("__%s__()\n",__func__);
while (num > 1)
{
fact *= num;
num--;
}
dummy();
return fact;
}
/*---- do not modify ----*/
int main(int argc, char * argv[])
{
int (*fp)(int) = atoi(argv[1]);
printf("fp = %x\n",fp);
printf("factorial of 5 is = %d\n",fp(5));
printf("factorial of 5 is = %d\n",factorial(5));
return 1;
}
¿Compilará el código anterior tal como está? –
Código actualizado para que se construya. –
Mi duda era más hacia esta afirmación '#define dummy (m.dummy)' ¿Cómo evitaría que el preprocesador NO reemplazara la función ficticia? –