Упорядочить Linq по, группировать и упорядочить по каждой группе?

Мы пытаемся протестировать код ученика, и, пытаясь автоматизировать этот процесс, мы хотели бы определить, не выходит ли код ученика за пределы стека.

Я добился определенного успеха, используя библиотеку 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);                         
}  

Однако результат остается прежним.

5
задан BurntSushi5 17 February 2011 в 02:25
поделиться