gpt4 book ai didi

c++ - longjmp 应该恢复堆栈吗?

转载 作者:搜寻专家 更新时间:2023-10-30 23:51:03 25 4
gpt4 key购买 nike

根据我的理解,setjmp 保存当前上下文,它应该在调用 longjmp 时恢复它。然而,下一段代码打印出 15(我使用 -g 编译并且没有进行任何优化)。我是不是误解了这个结构,还是遗漏了其他任何东西?

#include <iostream>
#include <csetjmp>


std::jmp_buf jump_buffer;

int main()
{
int a = 0;
if (setjmp(jump_buffer) == 0) {
a = 15;
std::longjmp(jump_buffer, 42);
}
std::cerr << a << std::endl;
}

免责声明:仅出于好奇而尝试使用它。我从来没有听说过这个结构,直到我最近读到一些关于 NASA 编码指南的论文,其中提到禁止使用这种控制流结构

同时使用 c 和 c++ 标签,因为代码是混合的,我认为实际的相关功能更适合 c 重度用户而不是 c++...:/

最佳答案

那是 expected behavior :

Upon return to the scope of setjmp, all accessible objects, floating-point status flags, and other components of the abstract machine have the same values as they had when std::longjmp was executed, except for the non-volatile local variables in setjmp's scope, whose values are indeterminate if they have been changed since the setjmp invocation.

执行 longjmpa 的值为 15,因此这是一个可以预期看到的值(通常是不确定的)。 jmp_buf 仅存储执行点。不是程序中每个变量的状态。

关于c++ - longjmp 应该恢复堆栈吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58498259/

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