According to the C Standard, 7.14.1.1 paragraph 3 [ISO/IEC 9899:2024], if a signal handler returns when it has been entered as a result of a computational exception (that is, with the value of its argument of SIGFPE, SIGILL, , or any other implementation-defined value corresponding to such an exception) returns, then the behavior is undefined. (See undefined behavior 130.)SIGSEGV
When a signal occurs and func points to a function, it is implementation-defined whether the equivalent of signal (sig, SIG_DFL); is executed or the implementation prevents some implementation- defined set of signals (at least including sig) from occurring until the current signal handling has completed; in the case of SIGILL, the implementation may alternatively define that no action is taken. Then the equivalent of (*func)(sig); is executed. If and when the function returns, if the value of sig is SIGFPE, 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.
The Portable Operating System Interface (POSIX®), Base Specifications, Issue 7 [IEEE Std 1003.1:2013], adds SIGBUS to the list of computational exception signal handlers:
...
Returning from a computational exception signal handler is undefined behavior.
Rule | Severity | Likelihood | Detectable | RepairableRemediation Cost | Priority | Level |
|---|---|---|---|---|---|---|
SIG35-C | Low | Unlikely | No | NoHigh | P1 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Axivion Bauhaus Suite |
| CertC-SIG35 | |||||||
| CodeSonar |
| LANG.STRUCT.RFCESH | Return from Computational Exception Signal Handler | ||||||
| Cppcheck Premium |
| premium-cert-sig35-c | |||||||
| Helix QAC |
| DF4846, DF4847, DF4848 | |||||||
| Klocwork |
| CERT.STDLIB.SIGNAL | |||||||
| LDRA tool suite |
| 44 S | Enhanced enforcement | ||||||
| Parasoft C/C++test |
| CERT_C-SIG35-a | Do not return from a computational exception signal handler | ||||||
| PC-lint Plus |
| 2671, 2764 | Fully supported | ||||||
| CERT C: Rule SIG35-C | Checks for return from computational exception signal handler (rule fully covered) |
...