longjmp
be used to return from a signal handler invoked other than through abort
or raise
?This issue has been automatically converted from the original issue lists and some formatting may not have been preserved.
Authors: Jutta Degener, DIN
Date: 1995-06-11
Submitted against: C90
Status: Closed
Converted from: dr.htm, dr_152.html
This Defect Report was prepared with considerable help from Mark Brader, Clive Feather, Ronald Guilmette, and a person whose employment conditions require anonymity.
DIN-003:
Can longjmp
be used to return from a signal handler invoked other than through
abort
or raise
? The descriptions of signal
and longjmp
contradict each
other.
According to subclause 7.7.1.1 The signal
function:
If the signal occurs other than as the result of calling the abort
or raise
function, the behavior is undefined if the signal handler calls any function in
the standard library other than the signal
function itself (with a first
argument of the signal number corresponding to the signal that caused the
invocation of the handler) or refers to any object with static storage duration
other than by assigning a value to a static storage duration variable of type
volatile sig_atomic_t
.
Since longjmp
is a function, it cannot be called.
But subclause 7.6.2.1 The longjmp
function, broadly guarantees the
opposite:
As it bypasses the usual function call and return mechanisms, the longjmp
function shall execute correctly in contexts of interrupts, signals and any of
their associated functions.
If the intent is to allow calls to exit
and longjmp
from signal handlers not
invoked through calls to raise
or abort
, replace in subclause 7.6.2.1:
... other than the signal
function itself ...
by:
... other than longjmp
, exit
, or the signal
function itself ...
Alternatively, if the intent is to disallow calls to longjmp
from signal
handlers not invoked through calls to raise
or abort
, replace in subclause
7.7.1.1:
As it bypasses the usual function call and return mechanisms, the longjmp
function shall execute correctly in contexts of interrupts, signals and any of
their associated functions. However, if the longjmp
function is invoked from a
nested signal handler (that is, from a function invoked as a result of a signal
raised during the handling of another signal), the behavior is undefined.
by:
If the longjmp
function is invoked from a nested signal handler (that is, from
a function invoked as a result of a signal raised during the handling of another
signal), the behavior is undefined.
Comment from WG14 on 1997-09-23:
The C Standard is clear enough as is. The longjmp
function shall execute
correctly when called from a non-nested signal handler invoked through calls to
the raise
or abort
functions; if longjmp
is called from a signal handler
invoked by other means, or from a nested signal handler, the behavior is
undefined.