Pregunta

Me pregunto qué Hippomocks hace interceptar la función de llamada exit, por ejemplo, como se muestra en el siguiente código:

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

¿Fue útil?

Solución

El código que realiza la intercepción en hippomocks.h.Modifica los indicadores de protección de la memoria para permitir que escriba la dirección del puntero de función provisto, luego escribe una instrucción de salto en lugar de los bytes iniciales de la función.Cuando el gancho ya no es necesario, se restauran los bytes originales.Este es el mismo enfoque utilizado, por ejemplo, por el desvíos de Microsoft biblioteca.

Otros consejos

Lanza la función pasada (en este caso, un puntero de función simple) a un char *, pide que el sistema operativo se le permita escribir en él (usando MProtect en las UNICES y VirtualProtect en Windows) y luego modifica los primeros 5 a 14 bytes para ser una instrucción incondicional de salto. Pone la dirección de una función generada (plantillas) con firma idéntica en el lugar, anulando efectivamente la función.

Si lo desea, puede reutilizar el código de Hippomocks directamente, al construir un objeto de clase Reemplazar en la pila con los argumentos correctos. También puede copiar el código (en el nuevo hippomocks.H en GitHub tanto 32/64 bit x86, se admite el brazo y el pulgar. Está alrededor de la línea 200, tan relativamente alto. Tendrá que copiar también la clase Horrible_Cast y la clase sin protección; El primero le permite colocar un puntero de función de miembro a cualquier otro tipo (que no sea posible con reinterpret_cast) y la segunda envuelve las llamadas no protegidas (y reprotectadas) específicas del sistema operativo.

En la limpieza del código para C ++ 11, también he extraído exactamente este subconjunto, por lo que ahora puede usar el archivo de detalle / reemplazo.h para obtener el código que hace esto. Para un enlace directo, mire a https://github.com /dasandy/hippomocks/blob/cpp11/hippomocks/detail/replace.h .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top