问题标签 [setjmp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - longjmp(buffer, 0) 不返回 0
我正在尝试使用 setjmp/longjmp 做一些简单的事情:要求用户多次按 Enter 键,如果用户插入其他内容,它将使用 longjmp 重新启动进程。
我正在使用一个计数器来检查它是否有效,这个计数器在开始时为 0,但是当使用 longjmp 时,计数器从 1 重新开始。
输出:
我知道这段代码很傻,我只是想在一个简单的例子中使用 setjmp/longjmp。
linux - 为什么getcontext和setjmp在glibc-x86-64中保存不同的寄存器
以下是他们的源代码: https ://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/unix/sysv/linux/x86_64/getcontext.S;hb= HEAD https:// sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/x86_64/setjmp.S;hb=HEAD
如您所见,getcontext 还保存了浮点上下文和寄存器 r8 和 r9,而 setjmp 没有。这是什么原因?
c - 如何返回 main 而不是调用它的函数?
我有一个function()
which 调用anotherFunction()
。里面anotherFunction()
有一个if
语句,当满足时返回main()
而不是返回function()
。你怎么做到这一点?
c - 深栈展开
首先,这绝对是关于 C 的,不需要 C++ 解决方案。
目标:返回调用函数(A
)超出多个堆栈帧。
我有一些解决方案,但没有一个是最好的选择。
实现意义上最简单的一个是 longjmp/setjmp,但我不确定它是否会破坏自动变量,因为正如 wiki 所指,如果执行 longjmp,则不会参与正常的堆栈展开。
以下是程序流程的简短描述:A
函数调用file processing
函数,这会导致许多内部和递归调用。在某些时候,文件阅读器遇到了 EOF,所以工作
file processing
已经完成并且应该控制A
功能。
将每个读取的字符与 EOF 或 '\0' 进行比较?不,谢谢。UPD:我可以避免 setjmp 和 longjmp 之间的调用链中的动态分配。
不确定自动变量,我不知道顺序调用会发生什么file processing
(有多个文件)。
所以:
1) longjmp 的“无堆栈展开”怎么样?如果我得到所有可用的数据持有者(指针),那有多危险。
2) 其他简洁有效的返回A
框架的方法?
c++ - 不一致的警告:变量可能被“longjmp”或“vfork”破坏
我基本上确信我遇到了一些 g++ 4.8.3 的错误,但我想我会先问这个列表,因为我对 setjmp/longjmp 的经验很少。我已将有问题的代码简化为以下 foo.cxx:
我使用 g++ 4.8.3 来编译这段代码。令我感兴趣的是,当我定义 USE_STRUCT 时,编译失败但使用 USE_INT 成功。代码中有注释进一步说明了如何使用 USE_STRUCT 使编译成功。g++ 的 -fPIC 选项也只会导致编译失败,但这是我的环境中的必需参数。
查看编译错误:
但是使用简单的 int 就可以了:
有人可以向我解释为什么 val 如果它是一个结构而可能会被破坏,但如果它是一个 int 则不会?如代码中的注释所示,有关使结构成功编译的其他方法的任何见解?或者这是否指向编译器错误?
非常感谢任何见解和评论。
c - 使用 setjmp 和 longjmp 时 jmp_buf 中的实际内容是什么?
setjmp() 应该将包括“返回地址”和“堆栈指针”在内的寄存器保存到“jmp_buf”中。当我使用 glibc 编译(gcc 和 clang)并在 x86_64 下调试以下程序时,我无法理解“jmp_buf”中的内容以及“返回地址”和“堆栈指针”在“jmp_buf”中的位置。
当程序在 "printf("i = %d\n", i);" 之前的断点处停止时,我尝试了 gdb 功能:"p/x env"; 但是我在包含 __jmpbuf 和 __saved_mask 的结构 (env) 中找不到“返回 RIP”和“以前的 RSP”。任何人都知道这两个函数究竟是如何工作的,以及它们在 x86_64 下使用 glibc(我使用 ubuntu 14.04)究竟保存了什么?
c++ - C++ 和跳出动态生成代码的安全方法
我的项目是用 C++ 编写的,它利用动态生成的代码将一些东西粘合在一起(使用 Fabrice Bellard 的TCC和一些手动生成的程序集 thunk)。动态生成的代码有时会跳转到用 C++ 实现的“运行时助手”并返回。
有一个功能允许完全中止动态生成的代码,无论它在哪里,跳回 C++(调用者)。为了实现这一点,我只是使用 C++ 异常:运行时帮助程序(伪装成 C 函数)简单地引发 C++ 异常,并通过生成的函数传播回 C++。我正在使用SJLJ,到目前为止一切正常,但我不想依赖特定的实现(我读到只有 SJLJ 才安全)。
除了上面的中止方案,我的 C++ 代码主要在危急情况下使用异常,它不用于通用控制流。但是,我依靠 RAII 自动销毁堆栈上的对象。
我的问题是:如果 setjmp 在调用动态生成的函数之前正确设置,并且 longjmp 永远不会通过依赖 RAII 的 C++ 函数传播(我必须确保没有用 C++ 实现的运行时助手使用它)并且总是落在 setjmp (在函数之前设置)?
或者 C++ 是如此脆弱以至于不能保证它能够正常工作并且会破坏某些东西?或者也许只有在抛出实际异常时 C++ 才会中断?如果异常在本地抛出并立即捕获(在生成的程序集调用的运行时助手中)怎么办,它安全吗?或者可能只是因为堆栈中有一些外来帧,它会拒绝工作?
例如:
c - 是否应该在 longjmp() 之后调用 free()?
在这个简单的代码中,我应该注意在默认情况下释放内存以逃避内存泄漏还是可以使用分配的内存?longjmp 是否也恢复内存分配?
c - 什么是堆栈重新分配,什么时候发生?
据说您可能会发生堆栈重新分配。我不明白这一点。我认为 setjmp/longjmp 的全部目的是保存堆栈,并且当 longjmp 回来时它会有效。该评论似乎表明可以移动整个堆栈。这将抵消所有指针,所以我明白为什么应该避免它。但是堆栈重新分配何时发生?我以前从未听说过这个词。
c - Ruby 的延续中的 setjmp/longjmp
在挖掘cont.c
Ruby 当前版本的代码时,我想知道这一点。的文档setjmp
说,在返回的调用者之后longjmp
调用jmp_buf 结构是一个错误。但是,Ruby 似乎很高兴地做到了这一点并且没有崩溃:setjmp
https://github.com/ruby/ruby/blob/05f087c844f0e1e7cfe323edcf591de64069a289/cont.c#L522 https://github.com/ruby/ruby/blob/05f087c844f0e1e7cfe323edcf591de64069a289/cont.c#L775(+ 更多纤维的使用) )
我问:这怎么可能?
我确实注意到相同的源代码也使用了set/getcontext
,但似乎只使用了 fiber 。在我看来,使用这些函数而不是set/longjmp
.