Question

Je me demandais ce que hippomocks ne intercepter le exit la fonction d'appel par exemple, comme indiqué dans le code ci-dessous:

   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
Était-ce utile?

La solution

Le code qui ne l'interception est en hippomocks.h.Il modifie la protection de la mémoire des drapeaux pour permettre écrivant à l'adresse du pointeur de fonction, puis écrit une instruction de saut en place de la première octets de la fonction.Lorsque le crochet n'est plus nécessaire, l'original octets sont restaurés.C'est la même approche utilisée, par exemple, par le Microsoft Détours de la bibliothèque.

Autres conseils

Il jette de la fonction transmise (dans ce cas, un simple pointeur de fonction) d'un char *, demande à l'OS bien pour être autorisé à écrire (en utilisant mprotect sur les systèmes Unix et VirtualProtect sur Windows), puis modifie le premier 5 à 14 octets à une instruction de saut inconditionnel.Il met l'adresse d'un générés (à l'aide de modèles de fonction avec la même signature dans le lieu, de manière efficace de substitution de la fonction.

Si vous le souhaitez, vous pouvez réutiliser HippoMocks code directement, par la construction d'un objet de la classe Remplacer sur la pile avec les bons arguments.Vous pouvez également copier le code (dans le nouveau hippomocks.h sur GitHub à la fois 32 et 64 bits x86, ARM et le pouce sont pris en charge).C'est autour de la ligne 200, donc relativement élevé.Vous devez également copier le horrible_cast de la classe et de l'ôter la protection de la classe;la première permet de jeter un membre de pointeur de fonction à un autre type (qui n'est pas possible avec reinterpret_cast) et la deuxième enveloppe l'OS spécifique de déblocage (et réappliquez) appels.

Dans le nettoyage du code pour le C++11, j'ai aussi extrait exactement ce sous-ensemble, de sorte que vous pouvez maintenant utiliser le detail/remplacer.h fichier afin d'obtenir juste le code qui fait cela.Pour un lien direct, regarder https://github.com/dascandy/hippomocks/blob/cpp11/HippoMocks/detail/replace.h .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top