是否可以一次调用一次setjmp多次执行longjmp?

如何解决是否可以一次调用一次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;
}

Output

0
1
2
3
4
5
6
7
8
9

我从这次执行中成功获得了预期的输出,但是可以保证吗? 还是将jmp_buf用作longjmp()无效?

setcontext - Wikipedia说:“它们可能被视为setjmp / longjmp的高级版本;而后者仅允许单个非本地跳转到堆栈上”,但我没有找到禁止多次使用的描述来自N1570longjmp()的7.13非本地跳转

我知道不鼓励使用setjmp()longjmp(),但是我想知道在使用循环语句(forwhile,在某些编程测验中,禁止使用do-whilegoto语句,但不禁止使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?