C++和跳出动态生成代码的安全方法
C++ and a safe way to jump out of dynamically generated code
我的项目是用C++编写的,它使用动态生成的代码将一些东西粘合在一起(使用Fabrice Bellard的TCC和一些手动生成的程序集链接)。动态生成的代码有时会跳转到用C++实现的"运行时助手"中,然后返回。
有一个功能可以完全中止动态生成的代码,无论它在哪里,都可以跳回C++(调用方)。为了实现这一点,我只使用C++异常:运行时助手(冒充C函数)只抛出一个C++异常,它通过生成的函数传播回C++。我使用SJLJ,到目前为止一切正常,但我不想依赖于特定的实现(我读到只有SJLJ才安全)。
除了上面的中止方案之外,我的C++代码主要在关键情况下使用异常,它不用于通用控制流。然而,我依赖RAII来自动销毁堆栈上的对象。
我的问题是:如果在调用动态生成的函数之前设置了setjmp,那么使用longjmp/setjmp在理论上和实践上都安全吗,并且假设longjmp从不通过依赖RAII的C++函数传播(我必须确保在C++中实现的运行时助手都没有使用它),并且始终位于setjmp(在函数之前设置)?
或者C++太脆弱了,甚至不能保证它能很好地工作,并且会破坏一些东西?或者,C++只有在抛出实际异常时才会中断?如果异常在本地抛出并立即捕获(在生成的程序集调用的运行时帮助程序中),那么它安全吗?或者仅仅因为堆栈中有几个外国帧,它就会拒绝工作?
例如:
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: %sn", msg);
// do something about the error here
}
// some other C++ code
如果setjmp是在调用动态生成的函数之前设置的,并且longjmp从不通过依赖RAII的C++函数传播(我必须确保C++中实现的运行时助手都没有使用它),并且总是位于setjmp(在函数之前设置),那么使用longjmp/setjmp在理论上和实践上都安全吗?
标准的18.10/4说:
CCD_ 1在本国际标准中具有更多的限制行为。如果用
catch
和throw
替换setjmp
和longjmp
将调用任何自动对象的任何非平凡析构函数,则setjmp
/longjmp
调用对具有未定义的行为。
因此,不仅仅是RAII,任何托管的堆栈都会受到非平凡析构函数的反对(即"资源"可能在构建后被获取,但在销毁过程中仍然需要释放,或者除了资源释放之外,销毁可能会有副作用,如日志记录)。
或者C++太脆弱了,甚至不能保证它能很好地工作,并且会破坏一些东西?
它的工作应该遵循上面关于琐碎析构函数的警告(这是一个相当大的限制)。
或者,C++只有在抛出实际异常时才会中断?如果异常在本地抛出并立即捕获(在生成的程序集调用的运行时帮助程序中),那么它安全吗?
这与setjmp
/longjmp
的行为无关。如果在普通C++编译器生成的代码中抛出并捕获,那么在执行(重新)输入动态生成的代码时不应该有任何残留/后续问题。同样的方法也用于被调用到C或从C调用的封装C++库;异常可能在C++库的边界上被捕获,并被转换为C可以处理的错误代码。
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 实现在多线程代码中安全恢复的断点
- C++代码中的异常安全
- 编写"anti-lack of memory"异常安全代码
- 在代码的其他部分中对lock_gard和不使用相同的互斥锁是否安全?
- 我怎么知道C++编译器是否制作线程安全的静态对象代码
- 此代码安全吗?(链表,C++)
- 从 C# 到C++和返回的数组,没有不安全的代码
- 此代码是否容易受到 SQL 注入的攻击?我该如何使其安全
- 如何改进代码以生成安全的随机数
- 苹果安全传输代码错误
- 这段代码安全吗(为什么它没有崩溃)?
- 什么是 C# 安全代码在C++中的等效项
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具
- 此代码是否对C++线程安全
- 如何使用 openMP 使此代码线程安全
- C 代码 - 覆盖率(或其他静态代码分析仪) 线程安全
- 以下移动构造函数代码安全吗?
- 当我从C#代码调用C++代码时,它是线程安全的吗
- 这段代码安全吗,是否可以从构造函数C++生成线程