mirror of
https://github.com/janishutz/eth-summaries.git
synced 2026-03-14 17:00:05 +01:00
20 lines
950 B
TeX
20 lines
950 B
TeX
\newpage
|
|
\subsection{Unorthodox Control Flow}
|
|
In \lC, the \texttt{setjmp.h} header file can be included, which gives us access to \texttt{setjmp} and \texttt{longjmp}.
|
|
|
|
To use them, we first need to declare a \texttt{jmp\_buf} somewhere, usually as a static variable.
|
|
|
|
The \texttt{setjmp( jmp\_buf env } function stores the current stack / environment in the \texttt{jmp\_buf} and returns 0.
|
|
|
|
The \texttt{longjmp( jmp\_buf env, int val )} function causes a second return, which returns \texttt{val},
|
|
to the \texttt{setjmp} invocation and jumps back to that place.
|
|
|
|
\inputcodewithfilename{c}{code-examples/01_asm/}{08_unorthodox-controlflow.c}
|
|
|
|
What the above code outputs is: \texttt{second} followed by \texttt{main}.
|
|
|
|
\newpage
|
|
They are implemented in Assembly as follows. Nothing really surprising for the implementation there.
|
|
The assembly code is from the Musl \lC\ library
|
|
\inputcodewithfilename{gas}{code-examples/01_asm/}{09_setjmp-longjmp.s}
|