According to section 7.14.1.1 (signals) of the C standard; returning from a SIGSEGV
, SIGILL
, or SIGFPE
signal handler is undefined behavior:
If and when the function returns, if the value of
sig
isSIGFPE
,SIGILL
,SIGSEGV
, or any other implementation-defined value corresponding to a computational exception, the behavior is undefined; otherwise the program will resume execution at the point it was interrupted.
Noncompliant Code Example
In this noncompliant code example, if the given user input is '0', the division operation results in a SIGFPE
signal being sent to the program.
#include<signal.h> #include<stddef.h> #include<stdlib.h> volatile sig_atomic_t denom; void sighandle(int s){ Â Â Â /* Fix the offending volatile */ Â Â Â if (denom == 0) { Â Â Â Â Â Â Â denom = 1; Â Â Â } Â Â Â /* Everything is ok */ Â return; } int main(int argc, char *argv[]){ Â Â Â int result = 0; Â Â Â Â Â Â if (argc < 2) { Â Â Â Â Â Â Â return 0; Â Â Â } Â Â Â denom = (int)strtol(argv[1], (char **)NULL, 10); Â Â Â Â Â Â signal(SIGFPE,(*sighandle)); Â Â Â result = 100/denom; Â Â Â return 0; }
The noncompliant code example will loop infinitely on most systems when supplied with 0 as an argument.
This illustrates that even when a SIGFPE
handler attempts to fix the error condition while obeying all other rules of signal handling, the behavior may not be as expected.
Compliant Solution
#include<signal.h> #include<stddef.h> #include<stdlib.h> volatile sig_atomic_t denom; void sighandle(int s){ Â Â Â /* No recovery */ Â Â Â abort(); } int main(int argc, char *argv[]){ Â Â Â int result = 0; Â Â Â Â Â Â if (argc < 2) { Â Â Â Â Â Â Â return 0; Â Â Â } Â Â Â denom = (int)strtol(argv[1], (char **)NULL, 10); Â Â Â Â Â Â signal(SIGFPE,(*sighandle)); Â Â Â result = 100/denom; Â Â Â return 0; }
The only portably safe way to leave a SIGFPE
, SIGILL
, or SIGSEGV
handler is through abort()
or /_Exit()
.
Risk Assessment
Attempting to handle SIGSEGV/SIGILL/or SIGFPE signals is rare. However, code that does rely on handling these signals will usually require a redesign to fix.
Recommendation |
Severity |
Likelihood |
Remediation Cost |
Priority |
Level |
---|---|---|---|---|---|
SIG35-C |
low |
unlikely |
high |
P3 |
L3 |