我们正在尝试测试学生代码,并且为了自动化该过程,我们想要检测学生的代码是否溢出堆栈。
我使用libsigsegv库及其相应的stackoverflow_install_handler获得了一些成功。 它的工作非常出色,直到学生的代码两次打击堆栈。
例如,这里是一些示例输出:
[# ~]$ ledit ./interpreter -> (use solution) -> (fun 1 2) *** Stack overflow detected *** -> (fun 1 2) Signal -10 [# ~]
初始“ *检测到堆栈溢出* ”是理想的输出。 在第二次吹掉堆栈之后,我得到的只是一个无用的“Signal -10”,程序停止执行。 我想再次看到堆栈溢出检测到的消息,让代码继续执行。
在我的堆栈溢出处理程序中,我只是将溢出检测消息打印到stderr并且长时间跳回到解释器中的“等待输入状态”。
谢谢你的帮助!
编辑
根据下面的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); }
但是,输出仍然相同。
只需远离堆栈溢出就不够了。 我没有看到你正在嵌入这个解释器的源代码,但我的预感是堆栈溢出使得一些内部解释器状态被破坏,可能导致另一次崩溃。 特别要注意的是,你得到的信号是SIGBUS(10),而不是SIGSEGV(11)。
想象一下以下场景:当解释器调用malloc
时,你只是缺少堆栈溢出。 Malloc改变一些内部数据,然后调用辅助函数。 发生堆栈溢出,并且longjmp返回解释器主循环。 您的malloc池现已损坏,您无能为力。
我建议在检测到堆栈溢出时终止并重新启动解释器。 或者,弄清楚解释器状态是如何被破坏的,并安排它不是一个问题(这可能很难!)。 您也可以在解释器中使用显式堆栈深度检查,而不是捕获SIGSEGV; 这将允许您在SIGSEGV强制解决问题之前在安全点处理错误。
您是否在libsigsegv文档中遵循此警告?
…处理程序必须确保恢复正常的信号掩码(因为在执行处理程序时许多信号被阻塞),并且还必须调用
sigsegv_leave_handler()
来传输控制; 然后只有它可以长途跋涉。
尝试更密切地关注libsigsegv包中的示例代码tests / stackoverflow1.c 。 此示例代码确实支持连续捕获两个连续堆栈溢出。 特别是:
以上就是c/c++开发分享libsigsegv并响应堆栈溢出相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562253.html