我们已经在我们的代码库中实现了“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++ 异常处理替换 setjmp
和 longjmp
,但现在不可能,我可以代替 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/