2017-12-23 2 views
7

Im manpage auf longjmp und setjmp, gibt es diese Zeile:Muss ich ‚longjmp‘ rufen nach einer ‚setjmp‘

Wenn die Funktion, die setjmp() kehrt vor longjmp() genannt genannt wird, ist das Verhalten nicht definiert.

Heißt das, dass ich muss in der Funktion longjmp irgendwo tatsächlich aufrufen, die setjmp oder in einer verschachtelten Funktion aufgerufen? Oder ist es in Ordnung, es überhaupt nicht zu nennen?

Antwort

11

Sie lesen falsch.

Wenn die Funktion, die aufgerufene setjmp() zurückgibt, bevor longjmp() aufgerufen wird, ist das Verhalten nicht definiert.

Das Verhalten von longjmp ist nicht definiert, wenn man es so nennen nach Sie von der Funktion zurückgegeben, die die setjmp gesetzt. Aber es ist vollkommen in Ordnung nichtlongjmp überhaupt anrufen.

Wikipedia ist klarer:

Wenn die Funktion, in der setjmp kehrt genannt wurde, ist es nicht mehr möglich ist, mit dem entsprechenden jmp_buf Objekt sicher zu verwenden longjmp.

Dies liegt daran, dass der Stapelrahmen ungültig wird, wenn die Funktion zurückkehrt. Der Aufruf von longjmp stellt den Stapelzeiger wieder her, der - da die Funktion zurückgegeben wird - auf einen nicht vorhandenen und möglicherweise überschriebenen oder beschädigten Stapelrahmen zeigen würde.

Diese Funktionen werden oft verwendet, um Ausnahmemechanismen zu behandeln. Wenn die Ausnahme nicht auftritt, möchten Sie nicht longjmp aufrufen, da es keinen Grund gibt, Ihr Programm zurückzuspulen.

Verwandte Themen