Existe-t-il une fonctionnalité de compilateur permettant d’injecter une entrée de fonction personnalisée et un code de sortie?

Je code actuellement sur Windows avec VS2005 (mais je n’aimerais pas savoir s’il existe des options pour d’autres compilateurs et plates-formes. La plate-forme OSX m’intéresse surtout.) J’ai un programme C (pas de C ++) et j’aimerais faire ce qui suit …

Étant donné une fonction, disons …

int MyFunction(int myparam) { // Entry point. ... // Exit point. return 1; } 

Je voudrais mettre un extrait de code au point d’entrée et au sharepoint sortie. MAIS, je préférerais ne pas avoir à modifier les 100 fonctions déjà existantes. Existe-t-il un moyen de définir l’entrée de fonction et le code de sortie que le compilateur injectera pour toutes mes fonctions sans avoir à les modifier toutes?

La plupart des solutions que j’ai trouvées ou essayées vont nécessiter que je modifie chaque fonction, ce qui représente beaucoup de travail. Je pense que quelqu’un d’autre doit déjà avoir frappé quelque chose comme ça et l’a résolu. Je soupçonne que je ne peux pas être unique dans cette demande.

C’est spécifique à Microsoft, mais vous pouvez vous connecter aux fonctions _penter et _pexit pour faire quelque chose lorsque vous entrez et que vous quittez une fonction – vous devrez comstackr votre projet avec des indicateurs spéciaux.

Il y a un peu de tutoriel ici , et vous pouvez trouver quelques résultats supplémentaires sur la façon de les utiliser sur Google. En outre, cet article de blog décrit en détail l’assemblage que vous devez faire pour éviter de gâcher la stack lors de l’entrée et de la sortie.

GCC a le drapeau -finstrument-functions qui vous permet de définir deux fonctions qui seront appelées au début et à la fin de chaque appel de fonction:

 void __cyg_profile_func_enter(void *this_fn, void *call_site); void __cyg_profile_func_exit(void *this_fn, void *call_site); 

Vous recherchez quelque chose appelé programmation orientée aspect ou AOP.

Ce n’est pas quelque chose qui est supporté nativement en C (ou C ++). Certaines implémentations basées sur des bibliothèques sont répertoriées sur la page liée pour C (bien que je ne sache pas à quel point elles sont utiles / matures)

Les compilateurs OpenWatcom C et C ++ ont des parameters -ee et -ep pour cela:

 -ee call epilogue hook routine -ep[=] call prolog hook routine with  stack bytes available 

Cela entraînera le compilateur à émettre des appels aux routines de raccordement définies par l’utilisateur __EPI et __PRO.

Il y a aussi

 -en emit routine names in the code segment 

cela émettra le nom de la fonction dans le code de l’object sous la forme d’une chaîne de caractères juste avant la génération de la séquence prolog de la fonction. Peut être utile pour la routine __PRO.

Pour plus d’informations sur ces options et d’autres options du compilateur, reportez-vous au manuel de l’utilisateur C / C ++ disponible entre autres manuels à l’ adresse http://openwatcom.org/index.php/Manuals