Me gustaría escribir pruebas para una biblioteca C, en C. Me gustaría burlar algunas funciones para la prueba.Función burlarse (para probar) en C?
Supongamos que mi biblioteca se compila a partir de la siguiente fuente:
/* foo.h */
int myfunction(int x, int y);
/* foo.c */
#include "foo.h"
static int square(int x) { return x * x; }
int myfunction(int x, int y) {
return square(x) + square(y);
}
Quiero escribir una prueba como esta:
/* foo_test.c */
#include "foo.h"
static int square(int x) { return x + 1; }
int main(void) {
assert(myfunction(0, 0) == 2);
return 0;
}
¿Hay alguna manera de que pueda compilar de manera que myfunction
utilizará la definición de square
en foo_test.c
, en lugar del uno en foo.c
, solo cuando se vincula el ejecutable foo_test
? Es decir, quiero compilar foo.c
en una biblioteca (llamémoslo libfoo.so
), y luego compilar foo_test.c
con libfoo.so
y algo de magia para que obtenga un ejecutable foo_test
que usa la implementación diferente de square
.
Sería útil escuchar soluciones para cuando square
no se declare static
, pero resolver el caso anterior sería aún mejor.
EDITAR: Parece imposible, pero aquí hay una idea: Supongamos que compilo con -O0 -g
, por lo que es poco probable que square
se inserte y debería tener símbolos que muestren dónde se resolvió la llamada. ¿Hay alguna manera de colarse en el archivo objeto y cambiar la referencia resuelta?
'LD_PRELOAD' puede darte esto, pero espero que alguien más tenga una mejor respuesta. – sarnold
No para funciones estáticas – bdonlan
No creo que 'LD_PRELOAD' vaya a hacerlo. Quiero poder cambiar una función (que puede ser estática) dentro de una biblioteca que ya está compilada. Según tengo entendido (y quizás esto sea falso), el símbolo 'square' dentro de' myfunction' ya se habrá resuelto antes de intentar vincular 'foo_test'. – leif