Мы пытаемся протестировать код студента, и, чтобы автоматизировать процесс, мы хотели бы определить, не переполняет ли код студента стек.
Я добился некоторого успеха, используя библиотеку 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);
}
Однако вывод остается прежним.