Мы пытаемся протестировать код ученика, и, пытаясь автоматизировать этот процесс, мы хотели бы определить, не выходит ли код ученика за пределы стека.
Я добился определенного успеха, используя библиотеку libsigsegv и соответствующий ей stackoverflow_install_handler. Он работает блестяще, пока код студента дважды не взорвет стек.
Например, вот пример вывода:
[# ~]$ ledit ./interpreter
-> (use solution)
-> (fun 1 2)
*** Stack overflow detected ***
-> (fun 1 2)
Signal -10
[# ~]
Первоначальный результат « * Обнаружено переполнение стека * » является желательным результатом. После второго взрыва стека все, что я получаю, - это бесполезный «Сигнал -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);
}
Однако результат остается прежним.