问题标签 [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 投票
1 回答
1544 浏览

c - 利用 jmp_buf 结构中的缓冲区溢出

我需要帮助来利用 jmp_buf 结构上的缓冲区溢出。

我在堆栈上有以下值(由 gdb 看到):

第二个是下一个 IP(在 setjmp 之后),但如果我修改它,我不会改变我的程序的行为。

我注意到只有修改最后一个的值才能更改流程(并获得分段)。

但是,我无法理解最后一个词的含义以及如何更改它以获得所需的行为。

0 投票
1 回答
6832 浏览

linux - setjmp 和 longjmp - 用例子理解

我知道setjmp和longjmp的定义。setjmp 将环境存储在堆栈上下文中,另一个进行恢复。

但我认为我在某些地方缺乏理解。有人可以在很好的例子的帮助下向我解释我如何保证,它将如何保存以及如何恢复?

我看到 jmp_buf 中有很多 CPU 寄存器。但我如何保证它已恢复?

请用简洁的例子帮助我解释。我用谷歌搜索并提到了堆栈溢出的其他问题,但没有一个给出明确的例子。

非常感谢提前。

PS:它应该只来自 Linux/Unix 上下文。

0 投票
1 回答
1614 浏览

c - 我们可以重置 sigsetjmp 以再次返回“0”(重置 sigsetjmp)吗?

我使用 sigsetjmp 和 siglongjmp 编写了一个分段错误处理程序。一旦它进入信号处理程序,我调用 siglongjmp 以便跳过错误指令。

问题是,我再次想引起 SIGSEGV 并转到同一个处理程序,但现在 sigsetjmp 将返回 1。

如何重置 sigsetjmp?

这是我的代码:

0 投票
1 回答
431 浏览

c++ - 为什么 setjmp 不保存堆栈?

为什么 setjmp 不保存堆栈?
考虑以下代码:

我除了代码会从 main 来回跳转到函数并每次返回打印增加的数字。
实际发生的是它打印0然后1无限次。就好像当它跳回函数时,堆栈被重置为默认值。为什么这样做?有什么办法可以让它保存堆栈吗?
我知道setjmp并且在编码风格和可读代码longjmp方面甚至比goto它更糟糕,但我现在正在试验,这段代码可能永远不会看到可用应用程序的光芒。

0 投票
3 回答
861 浏览

c++ - 链接到 C++ 库时在 C 中使用 setjmp 和 longjmp

我想在一个 C 程序中使用 setjmp 和 longjmp,该程序链接到一个用 C++ 实现的库(但有一个 C API)。

C++ 代码确实进行动态内存分配,并且指针通过 API 传递,但只要代码的 C 端正确管理这些(不透明)对象,使用 longjmp 时不应该有任何混乱,对吧?

我知道在 C++ 代码中使用这些函数是不安全的,但是在链接到 C++ 代码的 C 代码中应该是安全的吗?

0 投票
2 回答
709 浏览

c++ - 如果我用“goto”跳出一个捕获块,我是否保证异常对象将被释放?

我有如下代码

我的问题是,当我goto离开 catch 块时,C++ 运行时存储的异常对象是否被释放?或者运行时是否允许缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上述代码,每次使用倒带代码时,我都不会泄漏内存(因为longjmp不会执行编译器在函数序言中或之前发出的清理代码)。

0 投票
6 回答
8275 浏览

c - Longjmp 超出信号处理程序?

从问题:

在 C 中使用 setjmp 和 longjmp 是一种好的编程习惯吗?

留下的两条评论说:

“你不能在信号处理程序中抛出异常,但你可以安全地执行 longjmp——只要你知道自己在做什么。——Dietrich Epp 8 月 31 日 19:57 @Dietrich:+1 对你的评论。这是一个鲜为人知且完全被低估的事实。如果不使用信号处理程序中的 longjmp,则无法解决许多问题(讨厌的竞争条件)。阻塞系统调用的异步中断就是典型的例子。

我的印象是内核在遇到异常情况(例如除以 0)时会调用信号处理程序。此外,只有在您专门注册它们时才会调用它们。

这似乎暗示(对我而言)它们不是通过您的正常代码调用的。

继续这个想法......我理解的 setjmp 和 longjmp 用于将堆栈折叠到先前的点和状态。我不明白如何在调用信号处理程序时折叠堆栈,因为它是从内核作为一次性情况而不是从您自己的代码调用的。信号处理程序堆栈中的下一件事是什么!?

0 投票
7 回答
3163 浏览

c++ - 如何在 C++ 中(计算)goto 和 longjmp?

我通常不编写 C++ 代码,但我的一个奇怪的 comp sci 朋友厌倦了看我精彩的 FORTRAN 程序并挑战我用 C++ 重写其中一个,因为他更喜欢我的 C++ 代码。(我们在这里赌钱。)确切的说法是它需要在现代 C++ 编译器中可编译。也许他讨厌一个好的conio.h - 我不知道。

现在我意识到用 C++ 编写有很多非常好的方法,但是我要在这里通过尝试使我的 C++ 版本尽可能像 FORTRAN 式来获得个人胜利。对于奖励积分,这可能会在我转换代码时为我节省一些时间和精力。

所以!这使我想到以下相关查询:

在 goto 上:

  1. 你是如何工作的?
  2. C++ 中 goto 的限制是什么?
  3. 对范围有任何担忧吗?(我将尽可能地尝试全局范围,但你永远不知道。)
  4. 如果我使用 GCC 扩展转到 void 指针数组,是否有关于未定义行为等的新问题?


在 longjmp 上:

  1. 您将如何安全地使用 longjmp?
  2. C++ 中 longjmps 的限制是什么?
  3. 它对范围有什么作用?
  4. 是否有任何特定时刻看起来 longjmp 应该是安全的,但实际上我不应该提防?
  5. 如何使用 longjmp 模拟计算的 goto?
  6. 如果我的程序中只有一个函数,那么使用 longjmp 而不是 goto 有什么切实的好处吗?

现在我主要关心的是为此计算 goto 工作。看起来我可能会使用 longjmp 来完成这项工作,因为 void 指针数组不是 C++ 标准的一部分,而是 GCC 特定的扩展。

0 投票
2 回答
7183 浏览

c - 这些被破坏的变量警告有什么意义?

我有这样的功能:

GCC (gcc (Debian 4.4.5-8) 4.4.5) 给出警告:

为什么????我的意思是,显然我不在乎是否x被破坏,因为它不可能在setjmp返回后使用。考虑setjmp到它对.

我的主要兴趣是在我继承的代码库中查找错误,因此,“改用这种编码风格”不是我要寻找的建议。然而,这里有许多奇怪的曲折。例如,如果x是局部变量而不是参数,则 GCC 不会抱怨。此外,GCC 不会在没有if (some_global)线路的情况下抱怨。好的。有些东西搞砸了 GCC 的流量分析,或者 GCC 可能知道我不知道的事情。

所以,

  • 有没有一种简单的方法来抑制这个函数的这个警告,就像你可以将未使用的参数转换为一样(void)

  • 还是我只是在整个项目范围内抑制警告?

  • 还是我错过了什么?

更新:让我与您分享一个稍微不同但不会产生警告的版本:

0 投票
1 回答
260 浏览

c++ - 为什么在包含时 std 命名空间中没有 setjmp?

标题说明了一切。在包含<csetjmp>,longjmp和之后,jmp_buf它们在std命名空间中,但setjmp不是。我在 MinGW4.5 和 MSVC10 上验证了这一点。在查看<csetjmp>标题后,我无法弄清楚这个选择的原因。我一直假设每个<cheader>文件都将 a 包装<header.h>std命名空间中。

我错了吗 ?setjmp特殊情况背后的理由是什么?请赐教!

注意:我知道在 C++ 中滥用 setjmp/longjmp 的问题。