libsigsegv 和响应堆栈溢出

2024-02-18

我们正在尝试测试学生代码,为了使该过程自动化,我们希望检测学生的代码是否溢出堆栈。

我使用 libsigsegv 库及其相应的 stackoverflow_install_handler 取得了一些成功。它运行得非常出色,直到学生的代码两次破坏堆栈。

例如,以下是一些示例输出:

[# ~]$ ledit ./interpreter
-> (use solution)
-> (fun 1 2)

*** Stack overflow detected ***
-> (fun 1 2)
Signal -10
[# ~]

最初的 ”* 检测到堆栈溢出 *”是理想的输出。第二次清除堆栈后,我得到的只是一个无用的“信号-10”,程序停止执行。我想再次看到堆栈溢出检测到的消息,并让代码继续执行。

在我的堆栈溢出处理程序中,我只是将溢出检测消息打印到 stderr 并长跳回到解释器中的“等待输入状态”。

谢谢你的帮助!

EDIT

根据下面 caf 的建议,我们添加了对 sigsegv_leave_handler() 的调用,如下所示:

static void continuation(void *arg1, void *arg2, void *arg3) {                  
  (void)(arg1);                                                                 
  (void)(arg2);                                                                 
  (void)(arg3);                                                                 
  siglongjmp(errorjmp, 1);                                                      
}                                                                               

static void handler(int emergency, stackoverflow_context_t context) {           
 (void)emergency;                                                               
 (void)context;                                                                 
 fprintf(stderr, "\n*** Stack overflow detected ***\n");                        
 fflush(stderr);                                                                
 sigsegv_leave_handler(continuation, NULL, NULL, NULL);                         
}  

但是,输出仍然相同。


仅仅通过 longjmping 避免堆栈溢出不一定是足够的。我还没有看到您将其嵌入其中的解释器的源代码,但我的预感是堆栈溢出导致一些内部解释器状态损坏,可能导致另一次崩溃。特别要注意的是,您收到的信号是 SIGBUS (10),而不是 SIGSEGV (11)。

想象一下以下场景:当解释器调用时,您只是缺少堆栈溢出malloc。 Malloc 更改一些内部数据,然后调用辅助函数。发生堆栈溢出,并且您 longjmp 返回解释器主循环。您的 malloc 池现在已损坏,您对此无能为力。

我建议在检测到堆栈溢出时终止并重新启动解释器。或者,准确地弄清楚解释器状态是如何被损坏的,并安排它不再是一个问题(这可能非常困难!)。您还可以在解释器中使用显式堆栈深度检查,而不是捕获 SIGSEGV;这将允许您在 SIGSEGV 强制问题之前在安全点处理错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libsigsegv 和响应堆栈溢出 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 无法继承形状

    为什么我不能使用继承 a 的类Shapes class http msdn microsoft com en us library ms604615 28v vs 90 29 我需要延长Rectangle具有一些方法的类 但我想以与使用相同
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • Python - csr_matrix 的数据结构

    我正在研究TFIDF 我用过tfidf vectorizer fit transform 它返回一个 csr matrix 但我无法理解结果的结构 数据输入 文件 天空是蓝色的 太阳是明亮的 太阳在 天空很亮 我们可以看到灿烂的太阳 明亮的
  • 无法读取快速路由器中未定义的“get”属性

    我的代码如下所示 app js const app express const itemsRouter require routes items js app use bodyParser urlencoded extended true
  • JPA 1.0 错误:名称不是可识别的实体或标识符。已知实体名称:[]

    当我尝试执行简单的 JPA 1 0 代码时 出现以下异常 可能是什么原因 5453 DevPQRWDPBSSPersist WARN P 351601 O 0 CT openjpa Enhance This configuration di
  • 在 JavaScript 中将 Unix 时间戳转换为时间

    我将时间作为 Unix 时间戳存储在 MySQL 数据库中 并将其发送到一些 JavaScript 代码 我怎样才能从中抽出时间呢 例如 在HH MM SS format let unix timestamp 1549312452 Crea
  • 如何使用快捷方式在Android Studio中自动导入必要的类?

    我刚刚切换到 Android Studio 0 5 1 这里的事情进展得很慢 因为没有任何东西可以正常工作 如何使用快捷方式导入必要的类 我的意思是像这样的 import android os Bundle import android s
  • 有没有办法从 EF 中的字符串值数组动态生成多个点赞?

    我设置了一个搜索文本框 其中搜索将单独抓取每个单词并使用 包含 搜索字段 有没有办法通过 Contains 搜索字符串数组 Keep in mind that the array would be generated dynamically
  • 是否可以在 Travis 中启动 Selenium 服务器?

    我想在 Travis 中运行完整的 Selenium 测试 但我似乎无法启动服务器 我的 Travis YAML 文件 language node js node js 6 2 before script npm install selen
  • 改进 Scala 的 JVM [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何阻止netty在服务器套接字上监听和接受

    有没有办法告诉 netty 停止侦听和接受套接字上的新连接 但完成当前连接上任何正在进行的工作 你可以直接关闭ServerSocketChannel由创建的ChannelFactory 通常 ServerSocketChannel由返回Se
  • 自动填充到最后一个相邻单元格的宏

    我正在尝试使用 Excel 中的宏记录器来记录宏来填充一列单元格 但是因为每次填充的单元格数量不同 所以它要么填充得太短 要么填充得太长 这似乎是因为宏标识单元格范围及其固定 无论如何 我可以让它填充到最后一个填充的相邻单元格吗 例如 自动
  • 如何将安装(框架+应用程序)打包到一个可执行文件中?

    我想创建一个文件 setup exe 其中包含我用 C 开发的一个应用程序以及 Net Framework 4 0 的安装程序 这个想法是 当我执行 setup exe 时 它会检查计算机上是否安装了 net Framework 4 0 如
  • pd.merge() 和 dataframe.merge() 之间的区别

    我想知道当你合并时有什么区别pd merge versus dataframe merge 示例如下 pd merge dataframe1 dataframe2 and dataframe1 merge dataframe2 我们有两个函
  • 将纬度和经度值(度)转换为 Double 。爪哇

    我正在尝试将以度为单位的纬度和经度值转换为双倍 价值观是这样的 latitude 25 21 N longitude 55 23 E When i try to log this in android it is coming like t
  • 在log4net的appender中设置日志名称

    我有 MyLogger 类 我在其中使用 log4net 如何修改我的附加程序以将日志保存在特定的日志名中 我想通过参数 logName 设置它 public void AddEntry string source string logNa
  • Python。龙卷风。非阻塞 xmlrpc 客户端

    基本上我们可以通过以下方式调用 xmlrpc 处理程序 import xmlrpclib s xmlrpclib ServerProxy http remote host rpc print s system listmethods 在to
  • 从 XIB 文件过渡到 Storyboard

    我目前有一个使用 XIB 的 XCode 项目 并且想开始使用 Storyboard 有没有好方法将我的 XIB 文件移动到 Storyboard 中 您可以一次对一个视图控制器手动执行此操作 从 xib 复制视图 c 转到故事板并在其中创
  • 在 js.erb 文件中渲染部分内容

    我正在尝试创建一个基于 ajax 的评论表单 它将在提交时更新我的 评论列表 非常基本的东西 我有部分comments single html haml其中有一个 li 带有基本评论信息的标签 这是我的comments create js
  • 如何使用 Sequel PRO 将“设置默认值”设置为“NOW()”?

    我有一个包含一些日期的 MySQL 表 我需要其中一个的默认值等于当前时间 我正在使用 Sequel Pro 来构建数据库 然后我在默认值中写入了 now 和 GETDATE 但不起作用 有人可以帮我吗 如何使用 Sequel PRO 将
  • 有没有推荐的易于使用的 Javascript XML 库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • libsigsegv 和响应堆栈溢出

    我们正在尝试测试学生代码 为了使该过程自动化 我们希望检测学生的代码是否溢出堆栈 我使用 libsigsegv 库及其相应的 stackoverflow install handler 取得了一些成功 它运行得非常出色 直到学生的代码两次破