I have a program that segfaults from pointer arithmetic sometimes. I know this happens, but I can’t easily check ahead of time to see whether it segfaults or not – either I can ‘pre-scan’ input data to see if it will cause a segfault (which can be impossible to determine), or I can refit it to not use pointer arithmetic, which would require a significantly larger amount of work, or I can try to catch a segfault. So my question:
1) How, in C, can I catch a segfault? I know something in the OS causes a segfault, but what can a C program do in the event that it segfaults to die a bit more gracefully than just Segmentation fault?
2) How portable is this?
I imagine this is a highly unportable behavior, so if you post any code to catch a segfault, please tell me what it works on. I’m on Mac OS X but I’d like my program to work on as many platforms as it can and I want to see what my options are.
And don’t worry – basically all I want to do is print a more user-friendly error message and free some malloc()ed memory, and then die. I’m not planning on just ignoring all segfaults I get and plowing ahead.
You have to define a signal handler. This is done on Unix systems using the function
sigaction. I’ve done this with the same code on Fedora 64- and 32-bit, and on Sun Solaris.