问题标签 [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.

0 投票
5 回答
3177 浏览

c++ - C++ try/catch 与 C setjmp/longjmp 有何不同?

C++我知道使用tryandcatch块时的异常处理。我想知道这个功能是否存在于C. 所以,现在我知道基本的错误处理C是由setjmp/longjmp.

既然setjmp/longjmp不存在于 中C++,可以假设它try/catch更好吗?以什么方式???

我可以在using中实现一个try/catch功能。那有什么不同??Csetjmp/longjmp

0 投票
1 回答
601 浏览

c - 为什么将 ucontext 添加到 POSIX,然后从 POSIX 中删除?

据我所知,ucontext提供更好的东西setjmp。但它已被弃用,现在已从 POSIX 规范中删除。那么它为什么会出现,又为什么会被移除呢?

0 投票
3 回答
560 浏览

c - 宏地狱:指向 setjmp/sigsetjmp 的与平台无关的指针

我正在编写需要使用指向 setjmp/sigsetjmp 的指针的多平台代码。通常这就像做一样简单

但是,ISO 和 POSIX 声明 setjmp/sigsetjmp 可以定义为宏,在我的 linux 机器中确实是这种情况。以下是摘录/usr/include/setjmp.h

问题是,由于我没有将参数传递给sigsetjmp,因此宏不会扩展,并且sigsetjmplibc 中没有定义普通符号。我希望能够使用一些宏“黑魔法”来提取“__sigsetjmp”名称,但到目前为止我失败了。

另一种选择是 __sigsetjmp直接使用,但这意味着检查每个受支持平台的扩展,我不想这样做(因此这个问题的原因)。

PS:我讨厌宏。

笔记:

我需要这个的原因有点模糊,但为了简化它,假设我想用它执行指针比较。

编辑:

是的是的。我知道我不应该指望得到一个指针,sigsetjmp因为它在某些平台上甚至可能不是一个函数,但这并不能解决我的问题

在实践中,我所知道的所有平台都将它作为一个函数来实现。

我可以应付这样一个事实,即在几年内,我遇到了一个sigsetjump不适用于某些平台的功能的案例。但是我不想处理的是遍历每个受支持的平台并检查setjmp.h宏定义,这是我现在唯一的选择。

我很欣赏对标准的引用,但我想得到一个实用的答案,而不是纯粹的答案。

0 投票
1 回答
330 浏览

windows - 向量异常处理程序中的 longjmp

64 位 Windows 程序中的某些类型的事件,例如被零除、空指针引用、堆栈溢出(如果您使用保护页检测到),通常会使用结构化或向量异常来处理(在发现有必要处理它们的程序中) .

在 JIT 编译器的上下文中,结构化异常有点尴尬,因为需要提供展开信息并符合所有函数的展开协议,这可能无法与移动代码块的复制垃圾收集器很好地交互,这表明使用向量异常。

虽然通常期望向量化异常处理程序返回,但将它们用于此目的将涉及使用 longjmp 或一些等效的代码退出处理程序,这些代码会重置堆栈指针而不进行任何展开。

这是合法的,还是我忽略了一些绊脚石?

Unix 中的等价物似乎是合法的,因为它的价值:Longjmp out of signal handler?

0 投票
1 回答
528 浏览

c++ - 在 longjmp/croak 之前显式调用析构函数

我正在为 C++ 库编写一个 PERL XS 接口。croak当库抛出异常时我需要调用。

直接在异常处理程序中执行它会错过对捕获异常的析构函数的调用,正如longjmp调用所期望的那样。这很重要,因为异常包含不会被释放的字符串成员。

显而易见的解决方案是croak在 catch 块之后执行,如果捕获到异常,如下所示:

但我想知道:在 ? 之前显式调用捕获的异常的析构函数是否足够longjmp?像这样:

0 投票
1 回答
344 浏览

c++ - 在 setjmp 被破坏之前创建的对象是否被破坏?

jpeglib中,必须使用 setjmp/longjmp 来实现自定义错误处理。

有很多资源说 setjmp/longjmp 不能很好地与 c++ 配合使用(例如,这个问题中的答案告诉他们确实与 RAII 一起使用),但是这个问题的答案说调用了析构函数。

我有这个例子(取自这里并稍作修改):

在这个例子中,析构函数被调用(如我所料),但它是标准行为吗?还是编译器的扩展,还是简单的 UB?


输出:

0 投票
1 回答
110 浏览

visual-c++ - 对 longjmp 的调用导致程序在 msvc 2010 上以代码 0 退出

我正在尝试使用setjmp/longjmp错误处理,但是,对 longjmp 的调用导致程序在使用 MSVC 2010 编译时以代码 0 退出,这是完整的消息:

这是代码:

我使用基于 gnu 的编译器(cygwin 下的 bfin-elf-gcc)编译了相同的代码,效果很好。IE,

知道为什么它不能在 msvc 上运行吗?

非常感谢,哈桑。

0 投票
1 回答
1018 浏览

c - 在 setjmp.h 中定义的 C 中的非本地跳转如何工作?

C 参考手册的附录 B 描述了两个函数setjmplongjmp一个称为非本地跳转的东西。除了setjmp保存状态信息和 longjmp 恢复的基本了解之外state,我一直无法理解此功能的确切流程和用例。

那么,这个功能究竟完成了什么,它在哪里有用?

0 投票
2 回答
148 浏览

c - 即使在存在非局部跳跃的情况下也能稳健地检测递归

我有一个特定的函数(信号处理程序),我想检测它的递归,即确定该函数是否直接或间接调用了它自己。棘手的一点是,该函数在某一时刻调用了一些不受其控制的代码,而该代码可以做任何事情。

通常,我会写一些类似的东西

但在这种情况下,我担心othercode可能会使用 alongjmp或类似来突破,导致recursed保持为 1。如果我的函数以这种方式跳出,我想确保它不会将自己视为递归 if 稍后被调用(longjmp否则它不是问题的事实)。

:我认为longjmp有可能。这othercode是来自其他一些野外代码的链接信号处理程序,并且确实存在用于恢复上下文的处理程序SIGSEGVlongjmp例如,作为“故障保护”异常处理程序)。请注意,longjmp在同步信号处理程序中使用通常是安全的。无论如何,我并不特别关心其他代码是否安全,因为它不在我的控制之下。

0 投票
2 回答
768 浏览

c++ - 为什么我看到这个 libzdb 配置错误?

我正在尝试在我的 macbook 上安装 libzdb,但是在运行配置时看到以下错误消息: configure:13334: error: setjmp is required

setjmp.h 文件位于/usr/include中,并在我的“$PATH”中指定为

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/include

有人可以建议我如何纠正这个问题吗?

提前致谢