Chciałbym napisać testy dla biblioteki C, w C. Chciałbym wyśmiewać niektóre funkcje do testu.Funkcja szyderstwa (do testowania) w C?
że moja biblioteka jest skompilowany z następującego źródła:
/* 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);
}
Chcę napisać test takiego:
/* foo_test.c */
#include "foo.h"
static int square(int x) { return x + 1; }
int main(void) {
assert(myfunction(0, 0) == 2);
return 0;
}
Czy jest jakiś sposób mogę skompilować tak że myfunction
użyje definicja square
w foo_test.c
, zamiast jednej w foo.c
, tylko podczas łączenia pliku wykonywalnego foo_test
? To znaczy, chcę skompilować foo.c
do biblioteki (nazwijmy to libfoo.so
), a następnie skompilować foo_test.c
z libfoo.so
i trochę magii, aby uzyskać plik wykonywalny foo_test
, który wykorzystuje inną implementację square
.
Byłoby pomocne usłyszeć rozwiązania, gdy square
nie jest zadeklarowany static
, ale rozwiązanie powyższego przypadku byłoby jeszcze lepsze.
EDYCJA: Wydaje się beznadziejne, ale oto pomysł: Załóżmy, że kompiluję się z -O0 -g
, więc jest mało prawdopodobne, że square
zostanie wstawiony i powinienem mieć symbole pokazujące, gdzie połączenie zostało rozwiązane. Czy istnieje sposób, aby wkraść się do pliku obiektu i zamienić rozstrzygnięte odniesienie?
'LD_PRELOAD' może ci to dać, ale mam nadzieję, że ktoś inny ma lepszą odpowiedź. – sarnold
Nie dla funkcji statycznych – bdonlan
Nie sądzę, że 'LD_PRELOAD' zamierza to zrobić. Chcę móc zmienić funkcję (która może być statyczna) wewnątrz biblioteki, która jest już skompilowana. Jak rozumiem (a może to nieprawda), symbol 'square' wewnątrz' myfunction' zostanie rozwiązany, zanim spróbuję połączyć 'foo_test'. – leif