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

c - 在 C 中:发送 func 指针,用它调用 func,玩 EIP、jmp_buf 和 longjmp

我需要确保我首先了解一些基本的东西:

  1. 如何将函数 A 作为参数传递给函数 B?
  2. 我如何从 B 内部调用函数 A ?

现在来看看重头戏:

我正在尝试按照以下方式做一些事情:

这意味着我想使用longjmp它来执行某个功能。我该怎么做?

0 投票
5 回答
2244 浏览

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>

0 投票
1 回答
1165 浏览

c++ - 将 jmp_buf 声明为指针

我正在尝试将 jmp_buf 定义为指针并在嵌套的 longjmp(s) 中使用它。如下所示:

然后写 if else:

在其他地方使用存储的 bfj 到 longjmp

DS[TOP].int_val 是我存储它的位置。看起来很清楚,我想使用存储的 bfj 进行嵌套 goto 和返回。但是当我尝试调试时,我得到“未处理的异常”。我从一开始就明白了:

如果有人能告诉我解决方案,我会很高兴。

0 投票
4 回答
2331 浏览

c++ - 如何使作业/线程与崩溃隔离

我正在一个图书馆工作,我将各种任务交给一些第三方图书馆,这些图书馆做一些相对粗略或危险的特定于平台的工作。(具体来说,我正在编写一个数学函数解析器,它调用 JIT 编译器,如 LLVM 或 libjit,以构建机器代码。)在实践中,这些第三方库有崩溃的趋势(部分原因是我的错,当然,但我仍然想要一些保险)。

那么,我希望能够非常优雅地处理一项可怕的工作——SIGSEGV、SIGILL 等——而不会降低我的其余代码(或调用我的库函数的用户的代码)。需要明确的是,我不关心该特定工作是否可以继续(我不会尝试修复崩溃条件),我也不真正关心此类崩溃后对象的状态(我会丢弃如果发生崩溃,请立即使用它们)。我只想能够检测到发生了崩溃,阻止崩溃退出整个进程,停止调用任何崩溃的内容,并恢复执行。

(对于更多的上下文,目前的代码是一个 for 循环,测试每个可用的 JIT 编译器。其中一些编译器可能会崩溃。如果他们这样做,我只想执行continue;并继续测试另一个编译器。 )

目前,我有一个signal()基于 - 的实现非常可怕地失败了;当然,longjmp()超出信号处理程序是未定义的行为,并且信号处理程序几乎预计会以exit()or结尾terminate()。只是将代码扔到另一个线程中本身并没有帮助,至少到目前为止我已经测试过它的方式。我也无法破解使用 C++ 异常来完成这项工作的方法。

那么,将一组特定指令/线程/作业与崩溃隔离的最佳方法是什么?

0 投票
2 回答
1375 浏览

c - setjmp 和 GCC 的合法用途

使用 GCC(对我来说是 4.0)是否合法:

我发现一个讨论说它在 2003 年给 GCC 带来了问题,但我想他们现在应该已经解决了。C标准说,setjmp除非它是四个条件之一,否则使用是非法的,相关的一个是:

  • 关系或相等运算符的一个操作数与另一个操作数是整数常量表达式,结果表达式是选择或迭代语句的整个控制表达式;

但如果这是一个 GCC 扩展,我能否保证它适用于 GCC,因为它已经是非标准功能?我对它进行了测试,它似乎可以工作,但我不知道我需要做多少测试才能真正打破它。(我将调用隐藏__builtin_expect在宏后面,该宏被定义为非 GCC 的无操作,因此对于其他编译器来说是完全合法的。)

0 投票
2 回答
995 浏览

c++ - longjmp 和 RAII

所以我有一个库(不是我写的),不幸的是它abort()用来处理某些错误。在应用程序级别,这些错误是可以恢复的,所以我想处理它们而不是让用户看到崩溃。所以我最终写了这样的代码:

不是很优雅的代码。由于这种模式最终不得不在代码的几个地方重复,我想稍微简化一下,并可能将它包装在一个可重用的对象中。我的第一次尝试涉及使用 RAII 来处理信号处理程序的设置/拆卸(需要完成,因为每个函数需要不同的错误处理)。所以我想出了这个:

当然,这种function方式简单,更清晰,但今天早上我想到了一个想法。这能保证工作吗?这是我的想法:

  1. setjmp在对/的调用之间没有变量是易失的或变化的longjmp
  2. 我通常在与 andlongjmp相同的堆栈帧中找到一个位置,因此我允许代码执行编译器在函数退出点发出的清理代码。setjmpreturn
  3. 它似乎按预期工作。

但我仍然觉得这可能是未定义的行为。你们有什么感想?

0 投票
2 回答
1342 浏览

c++ - 使用 setjmp longjmp 时出现段错误

我有这个学校项目,它是关于使用 setjmp 和 longjmp 进行不精确的计算。该程序启动一个计时器,该计时器将向信号处理程序发出信号。

在计时器到期之前,有一些迭代计算(出于演示目的,只是一个没有用处的循环)。在这个循环的开始有一个 setjmp 调用,在信号处理程序中有一个 longjmp 调用。这基本上迫使循环停止中间计算并运行它调用longjmp的信号处理程序。

我遇到的问题是,每当计算部分很短时,我似乎相当一致地段错误,但是当计算部分很长(内部循环有很多迭代)时,它运行得很好(还没有遇到段错误) . 显然,段错误必须发生在该计算部分周围的区域,但我无法弄清楚它来自哪里,因为调试会像使用 print 语句一样改变事情。

这是我的代码:

我知道你们中的一些人可能不同意 longjmp 应该在信号处理程序中使用,但这是我的教授所说的这样做的方式。另外,应该注意的是,在调用 longjmp 之后我会解除阻塞 SIGALRM(参见 main 的 else 语句)。

看着 dmesg 我得到:

]

0 投票
3 回答
2014 浏览

c - C setjmp.h和ucontext.h,哪个更好?

嗨,我需要从一个地方跳到另一个地方...

但我想知道哪个更好用,setjmp 或 ucontext,比如:

  • setjmp 和 ucontext 是否可移植?
  • 我的代码使用这些库是线程安全的吗?
  • 为什么用一个代替另一个?
  • 哪个又快又安全?
  • ...(有人请,可以回答我忘记放在这里的未来问题吗?)

请提供我要求的更多信息,例如示例或一些文档...

我在网上搜索过,但我只得到了 C 中的异常处理,比如 setjmp 的例子,我对 ucontex.h 一无所知,我知道它是用于多任务的,它和 pthread 有什么区别?

非常感谢。

0 投票
3 回答
958 浏览

c - setjmp 和省略帧指针

我一直在尝试在我的代码(它使用 setjmp)中追踪一个间歇性崩溃错误,并将其缩小为:使用 /O2 编译时出现,使用 /O2 /Oy- 消失,即只显示 omit帧指针。

http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx建议 setjmp 需要一个帧指针。因此:

  1. 似乎当使用 /O2 编译使用 setjmp 的程序时,Visual C++ 会默默地生成导致间歇性堆栈损坏的代码。这是真的,还是我错过了什么?

  2. 在我看来,只有调用 setjmp 的函数才需要用帧指针编译,程序的其余部分——甚至是调用 longjmp 的函数——应该可以省略帧指针。这是真的?

编辑:我进一步缩小了范围。

在调用 setjmp 的函数上启用帧指针没有任何区别,但那是因为编译器已经在这样做了,正如它应该做的那样,显然注意到它需要完成,并自动执行。

真正有所作为的是在 main.js 上启用了帧指针。这并不像听起来那么奇怪,因为崩溃是从 main 的回报中体现出来的。现在我想到了,我可以在谷歌快速搜索 setjmp 用法中找到的所有示例,在 main.js 中执行。也许碰巧微软编译器团队只是这样测试它。

这是使用它的惯用方式,也许最好的解决方法是我将 setjmp-using 函数内联到 main.js 中。

0 投票
6 回答
3363 浏览

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?