问题标签 [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 - 在 C 中:发送 func 指针,用它调用 func,玩 EIP、jmp_buf 和 longjmp
我需要确保我首先了解一些基本的东西:
- 如何将函数 A 作为参数传递给函数 B?
- 我如何从 B 内部调用函数 A ?
现在来看看重头戏:
我正在尝试按照以下方式做一些事情:
这意味着我想使用longjmp
它来执行某个功能。我该怎么做?
c++ - longjmp 的问题
我想使用 longjmp 来模拟 goto 指令。我有一个包含结构类型元素(int、float、bool、char)的数组 DS。我想跳转到标有“lablex”的地方,其中 x 是 DS[TOP].int_val。我该如何处理?
示例代码:
但是当我认为它有问题时,我该怎么办?
错误:
output.cpp:在函数'int main()'中:
output.cpp:101:错误:从类型 'std::basic_string, std::allocator >' 到类型 '__jmp_buf_tag (*)[1]' 的无效转换</p>
c++ - 将 jmp_buf 声明为指针
我正在尝试将 jmp_buf 定义为指针并在嵌套的 longjmp(s) 中使用它。如下所示:
然后写 if else:
在其他地方使用存储的 bfj 到 longjmp
DS[TOP].int_val 是我存储它的位置。看起来很清楚,我想使用存储的 bfj 进行嵌套 goto 和返回。但是当我尝试调试时,我得到“未处理的异常”。我从一开始就明白了:
如果有人能告诉我解决方案,我会很高兴。
c++ - 如何使作业/线程与崩溃隔离
我正在一个图书馆工作,我将各种任务交给一些第三方图书馆,这些图书馆做一些相对粗略或危险的特定于平台的工作。(具体来说,我正在编写一个数学函数解析器,它调用 JIT 编译器,如 LLVM 或 libjit,以构建机器代码。)在实践中,这些第三方库有崩溃的趋势(部分原因是我的错,当然,但我仍然想要一些保险)。
那么,我希望能够非常优雅地处理一项可怕的工作——SIGSEGV、SIGILL 等——而不会降低我的其余代码(或调用我的库函数的用户的代码)。需要明确的是,我不关心该特定工作是否可以继续(我不会尝试修复崩溃条件),我也不真正关心此类崩溃后对象的状态(我会丢弃如果发生崩溃,请立即使用它们)。我只想能够检测到发生了崩溃,阻止崩溃退出整个进程,停止调用任何崩溃的内容,并恢复执行。
(对于更多的上下文,目前的代码是一个 for 循环,测试每个可用的 JIT 编译器。其中一些编译器可能会崩溃。如果他们这样做,我只想执行continue;
并继续测试另一个编译器。 )
目前,我有一个signal()
基于 - 的实现非常可怕地失败了;当然,longjmp()
超出信号处理程序是未定义的行为,并且信号处理程序几乎预计会以exit()
or结尾terminate()
。只是将代码扔到另一个线程中本身并没有帮助,至少到目前为止我已经测试过它的方式。我也无法破解使用 C++ 异常来完成这项工作的方法。
那么,将一组特定指令/线程/作业与崩溃隔离的最佳方法是什么?
c - setjmp 和 GCC 的合法用途
使用 GCC(对我来说是 4.0)是否合法:
我发现一个讨论说它在 2003 年给 GCC 带来了问题,但我想他们现在应该已经解决了。C标准说,setjmp
除非它是四个条件之一,否则使用是非法的,相关的一个是:
- 关系或相等运算符的一个操作数与另一个操作数是整数常量表达式,结果表达式是选择或迭代语句的整个控制表达式;
但如果这是一个 GCC 扩展,我能否保证它适用于 GCC,因为它已经是非标准功能?我对它进行了测试,它似乎可以工作,但我不知道我需要做多少测试才能真正打破它。(我将调用隐藏__builtin_expect
在宏后面,该宏被定义为非 GCC 的无操作,因此对于其他编译器来说是完全合法的。)
c++ - longjmp 和 RAII
所以我有一个库(不是我写的),不幸的是它abort()
用来处理某些错误。在应用程序级别,这些错误是可以恢复的,所以我想处理它们而不是让用户看到崩溃。所以我最终写了这样的代码:
不是很优雅的代码。由于这种模式最终不得不在代码的几个地方重复,我想稍微简化一下,并可能将它包装在一个可重用的对象中。我的第一次尝试涉及使用 RAII 来处理信号处理程序的设置/拆卸(需要完成,因为每个函数需要不同的错误处理)。所以我想出了这个:
当然,这种function
方式更简单,更清晰,但今天早上我想到了一个想法。这能保证工作吗?这是我的想法:
setjmp
在对/的调用之间没有变量是易失的或变化的longjmp
。- 我通常在与 and
longjmp
相同的堆栈帧中找到一个位置,因此我允许代码执行编译器在函数退出点发出的清理代码。setjmp
return
- 它似乎按预期工作。
但我仍然觉得这可能是未定义的行为。你们有什么感想?
c++ - 使用 setjmp longjmp 时出现段错误
我有这个学校项目,它是关于使用 setjmp 和 longjmp 进行不精确的计算。该程序启动一个计时器,该计时器将向信号处理程序发出信号。
在计时器到期之前,有一些迭代计算(出于演示目的,只是一个没有用处的循环)。在这个循环的开始有一个 setjmp 调用,在信号处理程序中有一个 longjmp 调用。这基本上迫使循环停止中间计算并运行它调用longjmp的信号处理程序。
我遇到的问题是,每当计算部分很短时,我似乎相当一致地段错误,但是当计算部分很长(内部循环有很多迭代)时,它运行得很好(还没有遇到段错误) . 显然,段错误必须发生在该计算部分周围的区域,但我无法弄清楚它来自哪里,因为调试会像使用 print 语句一样改变事情。
这是我的代码:
我知道你们中的一些人可能不同意 longjmp 应该在信号处理程序中使用,但这是我的教授所说的这样做的方式。另外,应该注意的是,在调用 longjmp 之后我会解除阻塞 SIGALRM(参见 main 的 else 语句)。
看着 dmesg 我得到:
]
c - C setjmp.h和ucontext.h,哪个更好?
嗨,我需要从一个地方跳到另一个地方...
但我想知道哪个更好用,setjmp 或 ucontext,比如:
- setjmp 和 ucontext 是否可移植?
- 我的代码使用这些库是线程安全的吗?
- 为什么用一个代替另一个?
- 哪个又快又安全?
- ...(有人请,可以回答我忘记放在这里的未来问题吗?)
请提供我要求的更多信息,例如示例或一些文档...
我在网上搜索过,但我只得到了 C 中的异常处理,比如 setjmp 的例子,我对 ucontex.h 一无所知,我知道它是用于多任务的,它和 pthread 有什么区别?
非常感谢。
c - setjmp 和省略帧指针
我一直在尝试在我的代码(它使用 setjmp)中追踪一个间歇性崩溃错误,并将其缩小为:使用 /O2 编译时出现,使用 /O2 /Oy- 消失,即只显示 omit帧指针。
http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx建议 setjmp 需要一个帧指针。因此:
似乎当使用 /O2 编译使用 setjmp 的程序时,Visual C++ 会默默地生成导致间歇性堆栈损坏的代码。这是真的,还是我错过了什么?
在我看来,只有调用 setjmp 的函数才需要用帧指针编译,程序的其余部分——甚至是调用 longjmp 的函数——应该可以省略帧指针。这是真的?
编辑:我进一步缩小了范围。
在调用 setjmp 的函数上启用帧指针没有任何区别,但那是因为编译器已经在这样做了,正如它应该做的那样,显然注意到它需要完成,并自动执行。
真正有所作为的是在 main.js 上启用了帧指针。这并不像听起来那么奇怪,因为崩溃是从 main 的回报中体现出来的。现在我想到了,我可以在谷歌快速搜索 setjmp 用法中找到的所有示例,在 main.js 中执行。也许碰巧微软编译器团队只是这样测试它。
这是使用它的惯用方式,也许最好的解决方法是我将 setjmp-using 函数内联到 main.js 中。
c - How does longjmp work?
I need to understand HOW longjmp function works; I know what it does, but I need to know how it does it.
I tried to disas the code in gdb but I can't understand some steps. The code is:
#xA;Can someone briefly explain me the code, or indicate where I can find the source code in the system?