Ambiguity in definition of setjmp/longjmp makes them much less useful
Larry Campbell
campbell at redsox.bsw.com
Mon Oct 8 03:47:34 AEST 1990
We have implemented a portable (or so we thought) exception handling
facility for C. In order to allow exception handlers to have the same scope
as the code being guarded, we used setjmp/longjmp instead of ssignal.
However, the ambiguous definition of setjmp/longjmp is giving us heartburn.
Consider the following code:
----------------------------------------
1 {
2 int x;
3 x = 0;
4 if (! setjmp(foo))
5 {
6 x = 1;
7 foo();
8 }
9 else
10 {
11 printf(x = %d\n", x);
12 }
13 }
----------------------------------------
If foo() calls longjmp, the value of x when line 11 gets executed appears to
be undefined (I don't have a copy of the ANSI standard, but I've checked
about eight compiler manuals; most say it's undefined, or undefined if x
isn't declared volatile).
In the three compilers I've tested that claim ANSI compliance, declaring x to
be volatile yields the desired result (x = 1). In the non-ANSI compilers,
disabling optimization yields the desired result, but enabling optimization
usually yields x = 0.
I've never seen any value for x other than 0 or 1.
My real question is this: Why not define the behavior of setjmp/longjmp so
that the values of ALL local variables are defined, whether or not they've
been allocated to registers? Otherwise, setjmp/longjmp are significantly
less useful.
For what it's worth, it seems to me that the description of setjmp/longjmp in
K&R 2 does imply that x should have the value 1; is this an area of
disagreement between K&R and ANSI?
--
Larry Campbell The Boston Software Works, Inc.
campbell at redsox.bsw.com 120 Fulton Street
wjh12!redsox!campbell Boston, MA 02109
More information about the Comp.lang.c
mailing list