问题标签 [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 回答
199 浏览

c - Gcc 纯/常量函数和 longjmp

假设我有一个 C 函数,它满足使用 GCC__attribute__((pure))或注释的标准__attribute__((const))除了对于某些输入参数,该函数可能会执行 alongjmp或 anabort或类似的事情,而不是返回。所以它不是你通常所说的“纯”函数。尽管如此,如果 GCC 仅使用这些注释来决定何时可以缓存和重用函数的返回结果,那么似乎仍然可以将这些注释应用于这样的函数。如果它确实返回,则可以假定该函数是其参数的无副作用的纯结果(可能加上全局状态,取决于我们是否使用pure或注释const)。

是否有人对这些注释是否可以在这种情况下应用有经验或知识?(我对可以依赖的工作感兴趣,而不仅仅是在某些设置或某些编译标志中发生的工作。)

0 投票
2 回答
738 浏览

c - 如何安全获取setjmp的返回值

我想使用 longjmp 返回一个错误代码,并从调用 setjmp 的函数传递它。简化代码:

但我读过:“setjmp 宏的调用应仅出现在以下上下文之一中:”

或者

或者

或者

有没有很好的方法来获取返回值?(不使用,并为所有可能的值switch写一个)case

编辑

感谢 Matt 在 c99 基本原理中找到它。我现在想出的是:

多了一个变数,好像不太好看……

0 投票
1 回答
122 浏览

c - Netbeans cygwin Windows XP下setjmp longjmp崩溃

以下是普渡大学 CS 课上给出的示例代码。出于调试目的,我对原来的改动很少。您可以在https://www.cs.purdue.edu/homes/cs240/lectures/Lecture-19.pdf查看原始代码。我面临的问题在代码段下方进行了描述。

该平台是 Windows XP 中的 Netbeans IDE 7.3 和 cygwin 1.7(最新)。当我运行这个程序时,输出是

当我单步调试调试器时,我在调用 longjmp() 时看到崩溃。程序运行,但在调试器中出现意外行为,如果我删除函数 a() 中的 printf。如果我删除 printf 并运行程序,则没有崩溃并且输出为

我已经阅读了网上关于 setjmp/longjmp 的几篇文档,我是一名专业人士。我的期望是调用 longjmp() 会将程序状态和执行带到另一个函数中的 setjmp。此函数 a() 应将 3 返回给 main。因此,main() 中的 if 条件为 TRUE,我应该看到打印输出“在 main:a() 返回非零”。根据我对 setjmp/longjmp 的理解,我没想到会打印出“In main: end”,因为控制永远不会到达那里。

我怀疑这可能是调试器问题,因为当我单步执行程序时(函数 a() 中没有 printf),调试器以预期的方式达到 longjmp。执行 longjmp 时,调试器不会在任何地方停止 - 它只是打印“In main: end”然后程序终止。我在 main() 中引入了 i++,以查看调试器是否会在打印之前停止。但是 Netbeans 并没有止步于此,整个程序在进入 longjmp() 时快速完成。

这种行为的原因是什么?在第一种情况下(当 printf 出现在函数 a() 中时)段错误的原因是什么?堆栈是否以指针“str”混乱的方式展开?为什么 ?如果有人可以访问 UNIX 机器,我想查看该系统和程序行为的输出。感谢您的意见。

0 投票
3 回答
946 浏览

c++ - 在 C++ 中使用 set_jmp/longjmp 不起作用

我正在尝试在 c 中实现简单的用户级线程库。当一个线程启动并且该线程调用第二个线程时。这第二个线程运行正确,但是当它退出程序崩溃时。这是我的编码。

我的threads.h实现

我的测试用例是

0 投票
2 回答
2947 浏览

r - 如何在 Rcpp 中安全地生成 R 警告

我们知道Rf_error()在 Rcpp 中应该避免调用,因为它涉及堆栈上 C++ 析构函数的 longjmp。这就是为什么我们宁愿在 Rcpp 代码中抛出 C++ 异常(如throw Rcpp::exception("...")或通过stop("...")函数)。

但是,R 警告也可能导致调用Rf_error()(此行为取决于warn选项)。因此,调用 toRf_warning()也是有风险的。

我们看到没有调用析构函数(没有“结束”消息)。

如何以 C++ 析构函数友好的方式生成 R 警告?

0 投票
2 回答
677 浏览

c - 如何在程序中保存多个函数的状态(上下文)

在保存状态后,我们试图在 C 程序中的多个函数之间切换setjmplongjmp但是对于一个函数,我们能够保存上下文而不是其他两个函数。可能的解决方案是什么。如果需要在代码中进行必要的更改,请提出建议。在o/p的状态下fun1()成功保存env1,我们可以恢复它,但如果fun2()fun3()状态没有保存在env2, 中env3

样品 o/p:

代码如下:

0 投票
4 回答
2239 浏览

c - setjmp 保存的究竟是什么“程序状态”?

我已经读过 setjmp 在传入的 jmp_buf 变量中“保存程序状态”,但我还没有找到任何关于它的确切含义的描述。它是否会复制所有应用程序的内存?只是寄存器?堆栈?

0 投票
0 回答
64 浏览

c - setjmp 如何保存环境并由 longjmp 恢复?

这是我的实验代码:

我对代码的理解setjmp并将longjmp其呈现为:

所以,在我的计数中,输出值为 3。但它实际上是 5。这是为什么呢?

我也尝试volatileb's 声明中删除;这没什么区别。

0 投票
2 回答
2959 浏览

c++ - longjmp 展开的 C/C++ 实现?

是否存在longjmp函数“展开”的主要 C/C++ 实现,即它与自动存储对象__attribute__((__cleanup__(...)))、POSIX 线程取消处理程序等的析构函数交互,而不仅仅是恢复由 保存的寄存器上下文setjmp?我对具有此属性的 POSIX 实现的存在(或不存在)特别感兴趣,但 C/C++ 通常也很有趣。

对于赏金,我正在寻找符合 POSIX 或至少类似 POSIX 的系统,而不是已经提到的 Windows。

0 投票
2 回答
384 浏览

c++ - 通过 try 块进行 longjmp 是否安全?

我有以下用 C++ 编写的 lua_CFunction:

我的问题如下:是否可以执行 lua_error(L) 或调用任何可能 longjmp 的 lua 函数:

  • 在尝试块中?
  • 在 catch 块中?

我只通过不分配任何依赖于析构函数(字符串等)的东西来处理分配在堆栈上的变量。如果我需要这样做,那么该范围内的所有 lua 函数都包含在一个 pcall 中,如果该 pcall 失败,则会向我发布的这个函数抛出一个异常。只是我关心的是 try-catch 块。

非常感谢