问题标签 [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 - 利用 jmp_buf 结构中的缓冲区溢出
我需要帮助来利用 jmp_buf 结构上的缓冲区溢出。
我在堆栈上有以下值(由 gdb 看到):
第二个是下一个 IP(在 setjmp 之后),但如果我修改它,我不会改变我的程序的行为。
我注意到只有修改最后一个的值才能更改流程(并获得分段)。
但是,我无法理解最后一个词的含义以及如何更改它以获得所需的行为。
linux - setjmp 和 longjmp - 用例子理解
我知道setjmp和longjmp的定义。setjmp 将环境存储在堆栈上下文中,另一个进行恢复。
但我认为我在某些地方缺乏理解。有人可以在很好的例子的帮助下向我解释我如何保证,它将如何保存以及如何恢复?
我看到 jmp_buf 中有很多 CPU 寄存器。但我如何保证它已恢复?
请用简洁的例子帮助我解释。我用谷歌搜索并提到了堆栈溢出的其他问题,但没有一个给出明确的例子。
非常感谢提前。
PS:它应该只来自 Linux/Unix 上下文。
c - 我们可以重置 sigsetjmp 以再次返回“0”(重置 sigsetjmp)吗?
我使用 sigsetjmp 和 siglongjmp 编写了一个分段错误处理程序。一旦它进入信号处理程序,我调用 siglongjmp 以便跳过错误指令。
问题是,我再次想引起 SIGSEGV 并转到同一个处理程序,但现在 sigsetjmp 将返回 1。
如何重置 sigsetjmp?
这是我的代码:
c++ - 为什么 setjmp 不保存堆栈?
为什么 setjmp 不保存堆栈?
考虑以下代码:
我除了代码会从 main 来回跳转到函数并每次返回打印增加的数字。
实际发生的是它打印0
然后1
无限次。就好像当它跳回函数时,堆栈被重置为默认值。为什么这样做?有什么办法可以让它保存堆栈吗?
我知道setjmp
并且在编码风格和可读代码longjmp
方面甚至比goto
它更糟糕,但我现在正在试验,这段代码可能永远不会看到可用应用程序的光芒。
c++ - 链接到 C++ 库时在 C 中使用 setjmp 和 longjmp
我想在一个 C 程序中使用 setjmp 和 longjmp,该程序链接到一个用 C++ 实现的库(但有一个 C API)。
C++ 代码确实进行动态内存分配,并且指针通过 API 传递,但只要代码的 C 端正确管理这些(不透明)对象,使用 longjmp 时不应该有任何混乱,对吧?
我知道在 C++ 代码中使用这些函数是不安全的,但是在链接到 C++ 代码的 C 代码中应该是安全的吗?
c++ - 如果我用“goto”跳出一个捕获块,我是否保证异常对象将被释放?
我有如下代码
我的问题是,当我goto
离开 catch 块时,C++ 运行时存储的异常对象是否被释放?或者运行时是否允许缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上述代码,每次使用倒带代码时,我都不会泄漏内存(因为longjmp
不会执行编译器在函数序言中或之前发出的清理代码)。
c - Longjmp 超出信号处理程序?
从问题:
在 C 中使用 setjmp 和 longjmp 是一种好的编程习惯吗?
留下的两条评论说:
“你不能在信号处理程序中抛出异常,但你可以安全地执行 longjmp——只要你知道自己在做什么。——Dietrich Epp 8 月 31 日 19:57 @Dietrich:+1 对你的评论。这是一个鲜为人知且完全被低估的事实。如果不使用信号处理程序中的 longjmp,则无法解决许多问题(讨厌的竞争条件)。阻塞系统调用的异步中断就是典型的例子。
我的印象是内核在遇到异常情况(例如除以 0)时会调用信号处理程序。此外,只有在您专门注册它们时才会调用它们。
这似乎暗示(对我而言)它们不是通过您的正常代码调用的。
继续这个想法......我理解的 setjmp 和 longjmp 用于将堆栈折叠到先前的点和状态。我不明白如何在调用信号处理程序时折叠堆栈,因为它是从内核作为一次性情况而不是从您自己的代码调用的。信号处理程序堆栈中的下一件事是什么!?
c++ - 如何在 C++ 中(计算)goto 和 longjmp?
我通常不编写 C++ 代码,但我的一个奇怪的 comp sci 朋友厌倦了看我精彩的 FORTRAN 程序并挑战我用 C++ 重写其中一个,因为他更喜欢我的 C++ 代码。(我们在这里赌钱。)确切的说法是它需要在现代 C++ 编译器中可编译。也许他讨厌一个好的conio.h - 我不知道。
现在我意识到用 C++ 编写有很多非常好的方法,但是我要在这里通过尝试使我的 C++ 版本尽可能像 FORTRAN 式来获得个人胜利。对于奖励积分,这可能会在我转换代码时为我节省一些时间和精力。
所以!这使我想到以下相关查询:
在 goto 上:
- 你是如何工作的?
- C++ 中 goto 的限制是什么?
- 对范围有任何担忧吗?(我将尽可能地尝试全局范围,但你永远不知道。)
- 如果我使用 GCC 扩展转到 void 指针数组,是否有关于未定义行为等的新问题?
在 longjmp 上:
- 您将如何安全地使用 longjmp?
- C++ 中 longjmps 的限制是什么?
- 它对范围有什么作用?
- 是否有任何特定时刻看起来 longjmp 应该是安全的,但实际上我不应该提防?
- 如何使用 longjmp 模拟计算的 goto?
- 如果我的程序中只有一个函数,那么使用 longjmp 而不是 goto 有什么切实的好处吗?
现在我主要关心的是为此计算 goto 工作。看起来我可能会使用 longjmp 来完成这项工作,因为 void 指针数组不是 C++ 标准的一部分,而是 GCC 特定的扩展。
c - 这些被破坏的变量警告有什么意义?
我有这样的功能:
GCC (gcc (Debian 4.4.5-8) 4.4.5) 给出警告:
为什么????我的意思是,显然我不在乎是否x
被破坏,因为它不可能在setjmp
返回后使用。考虑setjmp
到它对.
我的主要兴趣是在我继承的代码库中查找错误,因此,“改用这种编码风格”不是我要寻找的建议。然而,这里有许多奇怪的曲折。例如,如果x
是局部变量而不是参数,则 GCC 不会抱怨。此外,GCC 不会在没有if (some_global)
线路的情况下抱怨。好的。有些东西搞砸了 GCC 的流量分析,或者 GCC 可能知道我不知道的事情。
所以,
有没有一种简单的方法来抑制这个函数的这个警告,就像你可以将未使用的参数转换为一样
(void)
?还是我只是在整个项目范围内抑制警告?
还是我错过了什么?
更新:让我与您分享一个稍微不同但不会产生警告的版本:
c++ - 为什么在包含时 std 命名空间中没有 setjmp?
标题说明了一切。在包含<csetjmp>
,longjmp
和之后,jmp_buf
它们在std
命名空间中,但setjmp
不是。我在 MinGW4.5 和 MSVC10 上验证了这一点。在查看<csetjmp>
标题后,我无法弄清楚这个选择的原因。我一直假设每个<cheader>
文件都将 a 包装<header.h>
在std
命名空间中。
我错了吗 ?setjmp
特殊情况背后的理由是什么?请赐教!
注意:我知道在 C++ 中滥用 setjmp/longjmp 的问题。