Vorrei scrivere test per una libreria C, in C. Mi piacerebbe prendere in giro alcune funzioni per il test.Funzione di simulazione (per test) in C?
Suppongo che la mia libreria viene compilata della fonte seguente:
/* 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);
}
voglio scrivere un test come questo:
/* foo_test.c */
#include "foo.h"
static int square(int x) { return x + 1; }
int main(void) {
assert(myfunction(0, 0) == 2);
return 0;
}
C'è un modo posso compilare in modo che myfunction
utilizzerà il definizione di square
in foo_test.c
, anziché quella in foo.c
, solo quando si collega l'eseguibile foo_test
? Cioè, voglio compilare foo.c
in una libreria (chiamiamolo libfoo.so
), quindi compila foo_test.c
con libfoo.so
e un po 'di magia in modo da ottenere un eseguibile foo_test
che utilizza la diversa implementazione di square
.
Sarebbe utile sentire le soluzioni per quando square
non è dichiarato static
, ma risolvere il caso di cui sopra sarebbe ancora meglio. EDIT: Sembra senza speranza, ma ecco un'idea: Supponiamo che io compili con -O0 -g
quindi è improbabile che square
si inline e dovrei avere simboli che mostrano dove è stata risolta la chiamata. C'è un modo per intrufolarsi nel file oggetto e scambiare il riferimento risolto?
'LD_PRELOAD' può darti questo, ma spero che qualcun altro abbia una risposta migliore. – sarnold
Non per funzioni statiche – bdonlan
Non penso che 'LD_PRELOAD' lo farà. Voglio essere in grado di cambiare una funzione (che potrebbe essere statica) all'interno di una libreria che è già stata compilata. Come ho capito (e forse questo è falso), il simbolo 'square' dentro' myfunction' sarà già risolto prima di provare a collegare 'foo_test'. – leif