Domanda

Mi chiedo cosa fa i hippomocks per intercettare la funzione di chiamata exit ad esempio come mostrato nel codice qui sotto:

   MockRepository mocks;
   mocks.ExpectCallFunc(exit).With(2).Throw(std::exception());
.

È stato utile?

Soluzione

Il codice che fa l'intercettazione è in hippomocks.h.Modifica i flag di protezione della memoria per consentire la scrittura all'indirizzo del puntatore funzione fornito, quindi scrive un'istruzione di salto al posto dei byte iniziali della funzione.Quando il gancio non è più necessario, i byte originali vengono ripristinati.Questo è lo stesso approccio utilizzato, ad esempio, da deviazioni Microsoft libreria.

Altri suggerimenti

getta la funzione passata in (in questo caso un semplice puntatore funzione) a un char *, chiede il sistema operativo di essere autorizzato a scrivere ad esso (usando MProtect su comandi e virtualprotect su Windows) e quindi modifica i primi 5 a 14 byte per essere un'istruzione di salto incondizionata. Mette l'indirizzo di una funzione generata (usando modelli) con una firma identica nel luogo, sovrascrivere efficacemente la funzione.

Se si desidera che tu possa riutilizzare direttamente il codice dei hippomocchini, costruendo un oggetto di classe sostituzione sullo stack con gli argomenti giusti. Puoi anche copiare il codice (nei nuovi hippomocks.H su GitHub sia 32/64 bit x86, braccio e pollice sono supportati). È attorno alla linea 200, così relativamente in alto. Avrai bisogno di copiare anche la classe orribile e la classe non protettiva; Il primo consente di lanciare un indicatore di funzionamento del membro a qualsiasi altro tipo (che non è possibile con reinterpret_cast) e il secondo avvolge le chiamate a Protetto (e Riprotto) specifiche del sistema operativo.

In pulire il codice per C ++ 11 Ho anche estratto esattamente questo sottoinsieme, quindi è ora possibile utilizzare il file Dettagli / Sostituisci.h per ottenere solo il codice che fa questo. Per un collegamento diretto, guarda https://github.com /Dascandy/hippomocks/blob/cpp11/hippomocks/detail/replace.h .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top