c++ - 检查跳转缓冲区是否有效(非本地跳转)

标签 c++ c

我们已经在我们的代码库中实现了“longjmp – 恢复堆栈环境”。 longjmp 例程由特定的 error_exit 函数调用,该函数可以从任何地方调用。

因此,当 longjmp 被调用时,setjmp 例程可能尚未被调用,缓冲区可能具有导致崩溃的无效值。

我能否将缓冲区初始化为 NULL 或是否有任何检查可用于检查未设置或无效的值。一种方法是,每当 setjmp 被调用时,我都可以设置一个标志变量,并且我可以检查它。但这只是一个技巧。

void error_exit()
{
    extern jmp_buf buf;
    longjmp(buf, 1);
    return 1;
}

我可以做这样的事情吗?

void error_exit()
{
    extern jmp_buf buf;

    if(buf)
       longjmp(buf, 1);

    return 1;
}

代码是混合的 C/C++,我知道我可以用 C++ 异常处理替换 setjmplongjmp,但现在不可能,我可以代替 catch longjmp 具有导致崩溃的无效缓冲区?

最佳答案

jmp_buf 没有特别详细的记录。在 linux header 中,您可以找到类似以下内容的内容:

typedef int __jmp_buf[6];

struct __jmp_buf_tag {
  __jmp_buf __jmpbuf;       /* Calling environment.  */
  int __mask_was_saved;     /* Saved the signal mask?  */
  __sigset_t __saved_mask;  /* Saved signal mask.  */
};

typedef struct __jmp_buf_tag jmp_buf[1];

将其设置为零然后测试整个尺寸可能会浪费时间。

就个人而言,我会保留一个指向此缓冲区的指针,将其初始化为 NULL 并在 setjmp 之前将其设置。

  jmp_buf physical_buf;
  jmp_buf *buf = NULL;
  ...
  buf = &physical_buf;
  if (setjmp(*buf)) {
    ...
  }

这与拥有一个单独的标志是相同的想法。此外,您可以根据需要动态分配 jmp 缓冲区。

关于c++ - 检查跳转缓冲区是否有效(非本地跳转),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21426199/

相关文章:

c++ - Ncurses后台等待退出

c - C 中的 LZW 解压

c - malloc 段错误

c++ - 用另一个替换一个字符数组

c++ - 如何在C++中声明抽象类

c++ - 适用于容器每个成员的 STL 函数是否可以接受外部参数?

c++ - 我对转换运算符的继承感到困惑

c - 在字符串中搜索和替换

c - 将原始套接字绑定(bind)到特定地址

c - 使用递归求数组元素之和