una possibile soluzione in C
codice:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <setjmp.h>
static jmp_buf env;
void bad()
{
char* a = (char*)0xa0000;
printf("inside bad()\n");
*(a) = 100;
}
/* funzione che gestisce i segnali da catturare */
void sighand(int signo)
{
if (signo == SIGSEGV)
printf("SIGSEGV captured & handled\n");
/* salta nella riga in blu e fa in modo che setjmp() restituisca 1 */
longjmp(env, 1);
}
int main(void)
{
signal(SIGSEGV, sighand); /* abilita la cattura del segnale SEGMENTATION FAULT */
/* la prma volta setjmp() restituisce 0 */
if (setjmp(env) == 0)
{
bad();
printf("bad() test passed!\n");
}
else
printf("very bad() function!\n");
return 0;
}
in C++ la stessa cosa si può fare con la gestione mediante blocchi try catch.