【发布时间】:2011-06-28 04:20:18
【问题描述】:
我们正在尝试测试学生代码,并且为了自动化该过程,我们想检测学生的代码是否溢出堆栈。
我使用 libsigsegv 库及其相应的 stackoverflow_install_handler 取得了一些成功。它运行得非常好,直到学生的代码两次爆栈。
例如,下面是一些示例输出:
[# ~]$ ledit ./interpreter
-> (use solution)
-> (fun 1 2)
*** Stack overflow detected ***
-> (fun 1 2)
Signal -10
[# ~]
最初的“* Stack overflow detected *”是理想的输出。在第二次炸毁堆栈后,我得到的只是一个无用的“信号 -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);
}
但是,输出还是一样的。
【问题讨论】:
-
+1 只是为了使用流行语
-
+1 用于尝试使用 stackoverflow 检测堆栈溢出
标签: c stack-overflow signals segmentation-fault