PDA

View Full Version : [c/c++]Catturare l'errore di segmentation fault


anx721
17-04-2004, 15:56
Salve, sapete se c'è un modo per catturare l'errore di segmentation fault da programma e riuscire ad esempio a trasformarlo in un'eccezione?

Mi spiego meglio. Supponiamo che io voglia usare nel mio programma una funzione funz() scritta da qualcuno. Ad ogni modo non posso avere la certezza che questa funzione funz() sia stata scritta bene e che non causera il suddetto errore provocando l'uscita dal mio programma. Allora vorrei ad esempio invocare la funzione funz() all'interno di un costrutto come try/catch (uso la terminologia java) che catturi l'errore, nel senso che l'errore provoca l'uscita dalla funzione che l'ha causato, ma non dal programma, permettendomi di gestire la cosa. In genere le eccezioni funzionano cosi, nel senso che se nessuno si preoccupa di "acchiapparle" possono farti uscire dal programma, ma se le catturri il programma non termina.

/\/\@®¢Ø
17-04-2004, 18:56
Originariamente inviato da anx721
Salve, sapete se c'è un modo per catturare l'errore di segmentation fault da programma e riuscire ad esempio a trasformarlo in un'eccezione?

Mi spiego meglio. Supponiamo che io voglia usare nel mio programma una funzione funz() scritta da qualcuno. Ad ogni modo non posso avere la certezza che questa funzione funz() sia stata scritta bene e che non causera il suddetto errore provocando l'uscita dal mio programma. Allora vorrei ad esempio invocare la funzione funz() all'interno di un costrutto come try/catch (uso la terminologia java) che catturi l'errore, nel senso che l'errore provoca l'uscita dalla funzione che l'ha causato, ma non dal programma, permettendomi di gestire la cosa. In genere le eccezioni funzionano cosi, nel senso che se nessuno si preoccupa di "acchiapparle" possono farti uscire dal programma, ma se le catturri il programma non termina.

Non so se sia possibile, ma ne dubito, visto che quando accade un segmentation fault c'e' ben poco da fare , visto che l'errore si ripercuote in generale anche sul resto dell'applicazione.
Per fare un esempio:


int x = 10;

void foo()
{
int* p = &x;
while( --p )
*p = 0;
}

int main()
{
foo();
}


con un codice del genere non c'e' la speranza di limitare i danni alla funzione chiamata. Quel che e' peggio, con una funzione di poco differente sarebbe possibile fare in modo che la chiamata ritorni senza problemi, ma che salti fuori un segmentation fault in un momento successivo.