通过try块进行longjmp安全吗?

时间:2014-09-08 11:57:54

标签: c++ lua try-catch longjmp

我有以下lua_CFunction,用C ++编写:

int my_function(lua_State* L) {
    int x = 0;
    try {
        x = do_cpp_stuff_that_invokes_lua_API_as_well();
    } catch(const std::exception& ex) {
        lua_pushstring(ex.what().c_str());
        lua_error(L);
    }
    return x;
}

我的问题如下:是否可以执行lua_error(L)或调用任何可能是longjmp的lua函数:

    尝试块中的
  • 在catch区块?

我只是通过不分配任何依赖于析构函数的东西(字符串等等)来处理堆栈上分配的变量。如果我需要这样做,那么该范围内的所有lua函数都包含在pcall中,如果该pcall失败,则会向我发布的此函数抛出异常。 我只关心try-catch块。

非常感谢

2 个答案:

答案 0 :(得分:3)

相关规则是(§18.10[support.runtime] / p4):

  

函数签名longjmp(jmp_buf jbuf, int val)有更多   本国际标准中的限制行为。一个setjmp/longjmp   如果替换setjmp和,则调用对具有未定义的行为   longjmpcatch throw会调用任何非平凡的内容   任何自动对象的析构函数。

C ++标准不会限制使用setjmplongjmp

答案 1 :(得分:1)

如果从catch块进行长跳转,则至少会泄漏用于存储异常对象的内存。编译器生成代码,从而在catch块范围之外的控制流路径上释放此内存。如果你进行长跳,则不会采用这些路径。

Sun Studio's documentation禁止明确地混合异常和longjmp:

  

特别是,你不能长时间进入或退出try-block或catch-block(直接或间接),或者longjmp超过自动变量或临时变量的初始化或非平凡的破坏。