【发布时间】:2021-01-18 08:20:35
【问题描述】:
在我的理解中,setjmp() 和longjmp() 的典型用法是异常处理(libpng 中的用法应该是一个著名的例子),最多只能调用一次longjmp() 一次@ 987654328@电话。
这样的setjmp() 调用多次longjmp() 是否安全?
#include <stdio.h>
#include <setjmp.h>
jmp_buf jb;
int i;
int main(void) {
i = 0;
setjmp(jb);
printf("%d\n", i);
i++;
if (i < 10) longjmp(jb, 1);
return 0;
}
0
1
2
3
4
5
6
7
8
9
我成功地从这次执行中得到了预期的输出,但这能保证吗?
或者当longjmp() 用于此目的时,jmp_buf 是否会失效?
setcontext - Wikipedia 说“它们可能被视为 setjmp/longjmp 的高级版本;而后者只允许单个非本地跳转堆栈”,但我没有找到禁止多次使用 @ 的描述987654335@ like this from N1570 7.13 Nonlocal jumps
我知道不鼓励使用setjmp() 和longjmp(),但我想知道在使用循环语句(for、while、do-while)和goto 时是否可以将它们用作解决方法语句被禁止,但在某些编程测验中不禁止使用setjmp() 和longjmp()。
(使用递归可能是此类测验的答案,但在尝试处理需要多次迭代的大数据时存在堆栈溢出的风险)
【问题讨论】:
-
只要设置跳转缓冲区的上下文(称为
setjmp())还没有退出,所以存储的值仍然有效。 -
第 7.13.2.1 节第 2 节列出了未定义
longjmp(env)的情况。没有提到重复使用相同的环境。 -
@Barmar - 不确定这是否意味着太多。该标准允许通过遗漏来定义事物。
-
@StoryTeller-UnslanderMonica 没错,但这种哲学可能会让几乎所有事情都变得不确定。它是否明确表示您可以多次读取一个变量?
-
@NateEldredge:大概可以安排重新调用
setjmp();如果跳转上下文只能使用一次,您的使用似乎不会变得不可能,尽管重用它似乎确实更容易。
标签: c language-lawyer setjmp