Tengo un extraño código de auto modificación, pero en la raíz es un problema bastante simple: quiero poder ejecutar un jmp
(o un call
) y luego desde ese punto arbitrario arrojó una excepción y lo atrapó el bloque try/catch que contenía jmp
/call
.Lanzar una excepción de C++ después de un salto de asso en línea
Pero cuando hago esto (en gcc 4.4.1 x86_64) la excepción da como resultado un terminate()
como lo haría si la excepción fuera lanzada desde fuera de un try/catch. Realmente no veo cómo esto es diferente a lanzar una excepción desde el interior de una biblioteca remota, pero obviamente es porque simplemente no funciona.
¿Cómo puedo ejecutar un jmp
o call
pero todavía arrojar una excepción al original try/catch? ¿Por qué este try/catch no sigue manejando estas excepciones como lo haría si la función se llamara normalmente?
El código:
#include <iostream>
#include <stdexcept>
using namespace std;
void thrower()
{
cout << "Inside thrower" << endl;
throw runtime_error("some exception");
}
int main()
{
cout << "Top of main" << endl;
try {
asm volatile (
"jmp *%0" // same thing happens with a call instead of a jmp
:
: "r"((long)thrower)
:
);
} catch (exception &e) {
cout << "Caught : " << e.what() << endl;
}
cout << "Bottom of main" << endl << endl;
}
La salida esperada:
Top of main
Inside thrower
Caught : some exception
Bottom of main
La salida real:
Top of main
Inside thrower
terminate called after throwing an instance of 'std::runtime_error'
what(): some exception
Aborted
Originalmente, hice una pregunta similar en el contexto de los manejadores de señal en Linux. Eso simplemente nubló el problema, así que lo eliminé y le pedí esta versión mucho más simplificada. Todo el manejo de la señal estaba enmascarando mi verdadero problema. – SoapBox
Existen dos maneras diferentes de implementar el manejo de excepciones. Uno es decorar el código y llamar a los sitios para impulsar el contexto en todas partes, y el otro es indexar la llamada y los puntos de retorno para que un manejador de excepciones pueda buscar dónde ir. De cualquier manera, al asm en línea le falta algo. – spraff