关于setJMP/longjmp[英] About setjmp/longjmp

本文是小编为大家收集整理的关于关于setJMP/longjmp的处理方法,想解了关于setJMP/longjmp的问题怎么解决?关于setJMP/longjmp问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在研究 setJMP/longjmp ,发现 setJmp 保存寄存器,例如指令指针,堆栈指针等...

但是,我在这里没有得到的是,线程本身堆栈中的数据不能在调用 setJMP 和 longjmp 之间进行修改.在这种情况下, longjmp 无法正常工作.

以清楚地表明,例如,当 longjmp 还原堆栈指针时,说内存中的数据堆栈指针现在指向的数据与 setJmp 被称为.这会发生吗?如果发生这种情况,我们不是遇到麻烦吗?

另外,语句的含义:" longjmp()例程在例程后不得调用setJmp()例程返回的例程." " "

推荐答案

堆栈指针标记了堆栈的"使用"和"未使用"部分之间的划分.当您呼叫setjmp时,所有当前的呼叫帧都在"二手"侧,以及在setjmp之后发生的任何呼叫,但是在称为setjmp返回的函数之前,请在"未使用"上将其呼叫帧放在保存的堆栈指针的侧面.请注意,在称为setjmp返回的函数后调用longjmp返回调用行为,因此不需要考虑案例.

现在,某些现有调用框架中的局部变量可能是在setjmp之后通过呼叫函数或通过指针进行修改的,这就是为什么在许多情况下必须使用volatile的原因之一. ..

其他推荐答案

setjmp()/longjmp()并不是要保存堆栈,这就是setcontext()/getcontext()的目的.

标准指定在setjmp()之间更改setjmp()和longjmp()调用在longjmp()之后未指定的函数中定义的非挥发性自动变量的值.出于同样的原因,您的调用方式也有一些限制.

其他推荐答案

C中的SETJMP/LONGJMP(以下简称SLJ)很丑陋,其行为可能在实现之间有所不同.但是,考虑到没有例外的情况,有时在C中需要SLJ(请注意,C ++提供的异常几乎在各个方面都优于SLJ,并且SLJ与许多C ++功能的相互作用很差).

.

在使用slj时,应牢记以下内容,假设常规parent()调用例程setter(),call setJmp()然后调用jumper,然后又调用longjmp().

.

  1. 代码可以合法地退出范围,在该范围内执行了setJMP,而没有执行长的longJMP;但是,一旦示波器退出,就必须将先前创建的JMP_BUF视为无效.编译器可能不会采取任何行动来标记它,但是任何尝试使用它的尝试都可能导致不可预测的行为,可能包括跳到任意地址.
  2. jumper()中的任何局部变量都会随着对longjmp()的调用而蒸发,从而使其值无关.
  3. 每当控制权通过任何方式返回父级时,父母的本地变量将像称为setter时一样,除非此类变量已采用其地址并使用此类指针进行更改;无论如何,setJMP/longJMP不会以任何方式影响其价值.如果此类变量没有采取其地址,则SETJMP()可能会缓存此类变量的值,而LongJMP()可能会恢复它们.但是,在这种情况下,变量无法在缓存和恢复何时进行更改,因此缓存/还原不会具有可见的效果.
  4. setter中的变量可能会通过setJmp()调用来缓存也可能不会缓存.在longjmp()调用后,此类变量可能具有在执行setJmp()时具有的值,或者在称为"最终称为longjmp()的例程或其任何组合的例程时"时具有的值.在至少某些C方言中,可能会声明"挥发性"此类变量,以防止它们被缓存.

尽管setJMP/longjmp()有时可能很有用,但它们也可能非常危险.在大多数情况下,没有任何保护错误的代码导致不确定的行为,并且在许多现实情况下,不当使用可能会导致坏事发生(与某些不确定的行为不同,实际结果通常可能与什么相符程序员打算).

本文地址:https://www.itbaoku.cn/post/359185.html