gpt4 book ai didi

c - 是否允许为一次 setjmp() 调用多次执行 longjmp()?

转载 作者:行者123 更新时间:2023-12-04 12:57:43 25 4
gpt4 key购买 nike

据我了解,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 的高级版本;而后者只允许一次非本地跳转堆栈”,但我没有找到禁止多次使用 longjmp() 的描述。像这样来自 N1570 7.13 非局部跳转
我知道使用 setjmp()longjmp()不鼓励,但我想知道在使用循环语句( forwhiledo-while )和 goto 时是否可以将它们用作解决方法声明被禁止但使用 setjmp()longjmp()在某些编程测验中没有被禁止。
(使用递归可能是此类测验的答案,但在尝试处理需要多次迭代的大数据时存在堆栈溢出的风险)

最佳答案

Is it safely allowed to do longjmp() multiple times for one setjmp() call like this?


可以构造一个严格遵守的程序,调用 longjmp()多次返回同一点 setjmp()称呼。它归结为抽象机器的状态,包括内存内容,尤其是 jmp_buf 的状态。其中一个 setjmp() call 记录返回到该调用点所需的状态。该标准规定

All accessible objects have values, and all other components of theabstract machine have state, as of the time the longjmp function wascalled, except that [... details that can be avoided or madeimmaterial ...].


(C2018 7.13.2.1/3)
特别是,这意味着 longjmp()调用不得更改 jmp_buf 的值它从中获取信息,并且在其他地方不可能有任何隐藏状态 longjmp()可以更新以标记相应的 setjmp()因为被用完了。如果机器状态允许符合 longjmp()调用,然后等效 longjmp()从相应的 setjmp() 返回的第二个(或第三个等)返回后,调用必须仍然符合要求称呼。

关于c - 是否允许为一次 setjmp() 调用多次执行 longjmp()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64175221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com