[vox-tech] For "C" gurus

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Thu Dec 7 08:35:09 PST 2006


Richard Harke wrote:
> I have seen something like the following to describe
> how setjmp/longjmp is used, though asub is likely
> to represent a complicated tree of calls with
> a variety of potential failure points, with longjmp
> being the quick and easy way out.
> 
> int
> asub(jmp_buf env)
> {
> .....do something
> 	longjmp(env, 1);
> }
> 
> int
> main()
> {
> 	jmp_buf env;
> /*init*/
> some code
>      if (setjmp(env);) {
> /* returned from longjmp */
>         clean up
>         exit(0);
> 	} else {
> /*just returned from setjmp */
> 	asub(env);
>         may not return
> 	}
> }
> 
> But suppose this is changed to the following:
> 
> int
> asub(jmp_buf env)
> {
> .....do something
> 	longjmp(env, 1);
> }
> 
> int
> my_wrapper(jmp_buf env)
> {
> 	int x;
> 
> 	if (x = setjmp(env)) {
> 	     return x;
> 	 } else {
>             return 0;
> 	 }
> int
> main()
> {
> 	jmp_buf env;
> /*init*/
> some code
>      if (my_wrapper(env);) {
> /* returned from longjmp */
>         clean up
>         exit(0);
> 	} else {
> /*just returned from setjmp */
> 	asub(env);
>         may not return
> 	}
> }
> 
> Notice that because we returned from my_wrapper before
> calling asub, the local variables for asub have been
> removed from the stack. Thus they cannot be restored
> by the longjmp. It seems to me this usage should
> be explicitly rejected. Can any one point me to an
> authoratative reference that says this?

I don't have the latest standard, but this is covered in ANSI X3.159-1989
Section 4.6.2.1 lines 7-10:

   The longjmp function restores the environment saved by the most recent
   invocation of the setjmp macro in the same invocation of the program, with
   the corresponding jmp_buf argument.  If there has been no such invocation,
   or if the function containing the invocation of the setjmp macro has
   terminated execution in the interim, the behavior is undefined.

-- 
---------------------------------------------------------------------------
Jeff Newmiller                        The     .....       .....  Go Live...
DCN:<jdnewmil at dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
                                       Live:   OO#.. Dead: OO#..  Playing
Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
/Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
---------------------------------------------------------------------------


More information about the vox-tech mailing list