我的项目是用C++编写的,它利用动态生成的代码将一些东西粘合在一起(使用Fabrice Bellard的TCC和一些手动生成的汇编thunk )。动态生成的代码有时会跳转到用C++实现的“运行时帮助程序”中。C++和跳出动态生成代码的安全方式
有一个功能,允许完全中止动态生成的代码,无论它在哪里,都跳回到C++(调用者)。为了达到这个目的,我简单地使用C++异常:一个运行时帮助器(作为C函数)简单地抛出一个C++异常,并且它通过生成的函数传播回C++。我正在使用SJLJ,目前为止一切正常,但我不想依赖于某个特定实现(我读到只有SJLJ才安全)。
除了上面的中止方案,我的C++代码主要在关键情况下使用异常,它不用于通用控制流。但是,我依靠RAII自动破坏堆栈中的对象。
我的问题是:它是理论和实践上安全使用的longjmp/setjmp的替代,提供了setjmp设置正确调用动态生成的函数之前,并规定longjmp的从未到C传播++函数依赖RAII(我必须确保没有在C++中实现的运行时帮助程序使用它),并始终登陆setjmp(在函数之前设置)?
或者C++太脆弱了,即使这样也不能保证能正常工作并会损坏某些东西?或者,也许C++只有在抛出实际异常时才会中断?如果异常在本地抛出并立即被捕获(在生成的程序集调用的运行时助手中),它会安全吗?或者,也许只是因为有一些外来的框架,它会拒绝工作?
EG:
jmp_buf buf; // thread-local
char* msg; // thread-local
// ... some C++ code here, potentially some RAII thingy
GeneratedFunc func = (GeneratedFunc)compile_stuff();
if (!setjmp(buf)) {
// somewhere deep inside, it calls longjmp to jump back to the top function in case a problem happens
func();
} else {
printf("error: %s\n", msg);
// do something about the error here
}
// some other C++ code
是否可以勾画出一些源代码/伪代码来说明如何使用'longjmp/setjmp'? – 2015-02-12 03:20:24
这里伪代码http://pastebin.com/fTE3brK4 – carsten 2015-02-12 03:33:28