Funktionsaufrufe wrappen

19/06/2012 - 15:08 von ole-usenet-spam | Report spam
Hallo Gruppe,

ich möchte gerne bei einer umfangreicheren C-Bibliothek (für Testzwecke)
die Funktionsaufrufe mit etwas Code wrappen: vor und nach jedem Aufruf
soll ein selbstdefinierter code aufgerufen werden, sodass ich einen
Status vor und nach dem Funktionsaufruf vergleichen kann. Beispielsweise
sollte anstelle von

foo(bar);

folgendes ausgeführt werden:

{
int prestate = mystate();
foo(bar);
assert(mystate() == prestate);
}

Das ganze sollte unabhàngig von den Parametern und eventuellen
Rückgabewerten der Funktion sein. Kennt jemand da ein Makro, welches die
entsprechenden Aufrufe erzeugt oder gibt es andere Möglichkeiten, so
etwas zu erledigen?

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Stefan Reuther
20/06/2012 - 19:16 | Warnen spam
Olе Streicher wrote:
ich möchte gerne bei einer umfangreicheren C-Bibliothek (für Testzwecke)
die Funktionsaufrufe mit etwas Code wrappen: vor und nach jedem Aufruf
soll ein selbstdefinierter code aufgerufen werden, sodass ich einen
Status vor und nach dem Funktionsaufruf vergleichen kann. [...]
Kennt jemand da ein Makro, welches die
entsprechenden Aufrufe erzeugt oder gibt es andere Möglichkeiten, so
etwas zu erledigen?



Ein paar Möglichkeiten, keine davon hundertprozentig:

"gcc -finstrument-functions" beim Compilieren der Bibliothek.

Beim GNU-Linker "ld --wrap FUNKTIONSNAME" zum Umbenennen der Funktionen
beim Linken, Wrapper musst du selber bauen.

Makro zum Umbenennen der Funktionen beim Aufrufen, Wrapper musst du
selber bauen.

Mit gcc's Statement-Expressions kann man ansonsten den Wrapper wohl auch
direkt in ein Makro packen, also in etwa
#define foo(a,b,c) ({ \
int prestate = mystate(); \
int result = foo(a,b,c); /* Aufruf */ \
assert(mystate() == prestate); \
result; \
})

Ein Makro "definiere mir ein Wrappermakro" geht natürlich nicht, weil
C-Makros keine neuen C-Makros generieren können.


Stefan

Ähnliche fragen