如何解决是否可以一次调用一次setjmp多次执行longjmp?
据我了解,setjmp()
和longjmp()
的典型用法是异常处理(libpng
中的用法应该是一个著名的例子),并且最多会有一个调用longjmp()
进行一次setjmp()
通话。
是否可以安全地这样多次longjmp()
进行一次setjmp()
通话?
#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
我从这次执行中成功获得了预期的输出,但是可以保证吗?
还是将jmp_buf
用作longjmp()
无效?
setcontext - Wikipedia说:“它们可能被视为setjmp / longjmp的高级版本;而后者仅允许单个非本地跳转到堆栈上”,但我没有找到禁止多次使用的描述来自N1570的longjmp()
的7.13非本地跳转
我知道不鼓励使用setjmp()
和longjmp()
,但是我想知道在使用循环语句(for
,while
,在某些编程测验中,禁止使用do-while
和goto
语句,但不禁止使用setjmp()
和longjmp()
。
(使用递归可能是此类测验的答案,但是在尝试处理需要多次迭代的大数据时,它具有堆栈溢出的风险)
解决方法
这样安全地允许一次调用一次setjmp()多次执行longjmp()吗?
可以构造一个严格符合标准的程序,该程序多次调用longjmp()
以返回到同一setjmp()
调用的点。它归结为抽象机的状态,包括内存内容,尤其是jmp_buf
的状态,其中setjmp()
调用记录了返回该调用点所需的状态。该标准规定
所有可访问对象都具有值,并且所有其他组成部分 截至
longjmp
函数开始时,抽象机具有状态 被称为,除了[...可以避免或制造的细节 不重要...]。
(C2018 7.13.2.1/3)
特别是,这意味着longjmp()
调用不得更改从其获取其信息的jmp_buf
的值,并且其他地方不能存在longjmp()
可能存在的任何隐藏状态更新以将相应的setjmp()
标记为已用完。如果机器状态允许符合要求的longjmp()
调用,那么等效的longjmp()
调用必须在从相应的{{返回的第二(或第三,等))返回之后仍然符合要求。 1}}通话。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。