...
This non-compliant code example malloc()}}
's space for a string, copies over a string, and then cleans up the memory. The error lies with the call to the {{free()
function inside the signal handler. If an interrupt signal is received during or after the free()
call in main()
, the heap will be corrupted.
...
Note: The _Exit()
function causes immediate program termination, and is async-safe, whereas exit()
calls may call cleanup routines first, and is therefore not async-safe.
Compliant Solution
Signal handlers should be as minimal as possible, only unconditionally setting a flag where appropriate, and returning. They may also call the _Exit()
function..
Code Block | ||
---|---|---|
| ||
#include <signal.h> char *foo; void int_handler() { _Exit(0); } int main(void) { foo = malloc(15); if(foo == NULL) { /* handle error condition */ return 0; } signal(SIGINT, int_handler); strcpy(foo, "Hello World."); puts(foo); free(foo); return 0; } |
...