一次 setjmp() 调用是否允许多次执行 longjmp() ?
Is it allowed to do longjmp() multiple times for one setjmp() call?
据我了解,setjmp()
和longjmp()
的典型用法是异常处理(libpng
中的用法应该是一个著名的例子)并且最多有一个longjmp()
呼叫 setjmp()
个呼叫。
像这样对一个 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 says "They may be viewed as an advanced version of setjmp/longjmp; whereas the latter allows only a single non-local jump up the stack", but I didn't find descriptions that disallow multiple usage of longjmp()
like this from N1570 7.13 非本地跳转 .
我知道不鼓励使用 setjmp()
和 longjmp()
,但我想知道在使用循环语句(for
、while
, do-while
) 和 goto
语句被禁止,但在某些编程测验中不禁止使用 setjmp()
和 longjmp()
。
(使用递归可能是此类测验的答案,但在尝试处理需要多次迭代的大数据时存在堆栈溢出的风险)
Is it safely allowed to do longjmp() multiple times for one setjmp() call like this?
可以构建一个严格符合要求的程序,多次调用 longjmp()
到 return 到相同的 setjmp()
调用点。它归结为抽象机的状态,包括内存内容,尤其是 jmp_buf
的状态,其中 setjmp()
调用记录了 return 所需的状态到该点称呼。标准规定
All accessible objects have values, and all other components of the
abstract machine have state, as of the time the longjmp
function was
called, except that [... details that can be avoided or made
immaterial ...].
(C2018 7.13.2.1/3)
特别是,这意味着 longjmp()
调用不能更改它从中获取信息的 jmp_buf
的值,并且其他地方不能有任何隐藏状态 longjmp()
可以更新以将相应的 setjmp()
标记为已用完。如果机器状态允许符合要求的 longjmp()
调用,则等效的 longjmp()
调用必须在产生的第二个(或第三个,etc.)return 来自相应的 setjmp()
调用。
据我了解,setjmp()
和longjmp()
的典型用法是异常处理(libpng
中的用法应该是一个著名的例子)并且最多有一个longjmp()
呼叫 setjmp()
个呼叫。
像这样对一个 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 says "They may be viewed as an advanced version of setjmp/longjmp; whereas the latter allows only a single non-local jump up the stack", but I didn't find descriptions that disallow multiple usage of longjmp()
like this from N1570 7.13 非本地跳转
我知道不鼓励使用 setjmp()
和 longjmp()
,但我想知道在使用循环语句(for
、while
, do-while
) 和 goto
语句被禁止,但在某些编程测验中不禁止使用 setjmp()
和 longjmp()
。
(使用递归可能是此类测验的答案,但在尝试处理需要多次迭代的大数据时存在堆栈溢出的风险)
Is it safely allowed to do longjmp() multiple times for one setjmp() call like this?
可以构建一个严格符合要求的程序,多次调用 longjmp()
到 return 到相同的 setjmp()
调用点。它归结为抽象机的状态,包括内存内容,尤其是 jmp_buf
的状态,其中 setjmp()
调用记录了 return 所需的状态到该点称呼。标准规定
All accessible objects have values, and all other components of the abstract machine have state, as of the time the
longjmp
function was called, except that [... details that can be avoided or made immaterial ...].
(C2018 7.13.2.1/3)
特别是,这意味着 longjmp()
调用不能更改它从中获取信息的 jmp_buf
的值,并且其他地方不能有任何隐藏状态 longjmp()
可以更新以将相应的 setjmp()
标记为已用完。如果机器状态允许符合要求的 longjmp()
调用,则等效的 longjmp()
调用必须在产生的第二个(或第三个,etc.)return 来自相应的 setjmp()
调用。