setjmp / longjmp und lokale Variablen

Meine Fragen zielen auf das Verhalten von setjmp / longjmp bezüglich lokaler Variablen.

Beispielcode:

jmp_buf env;


void abc()
{
  int error;

  ... 
  if(error)
    longjmp(env);
}


void xyz() {
  int v1;           // non-volatile; changed between setjmp and longjmp
  int v2;           // non-volatile; not changed between setjmp and longjmp
  volatile int v3;  // volatile;     changed between setjmp and longjmp
  volatile int v4;  // volatile;     not changed between setjmp and longjmp 

  ...

  if(setjmp(env)) {
    // error handling
    ...
    return;
  }

  v1++; // change v1
  v3++; // change v3

  abc();
}


int main(...) {
  xyz();
}

In der Dokumentation von setjmp / longjmp heißt es:

Msgstr "Alle zugänglichen Objekte haben Werte ab dem Zeitpunkt, zu dem longjmp () aufgerufen wurde, mit der Ausnahme, dass die Werte von Objekten mit automatischer Speicherdauer, die lokal für die Funktion sind, den Aufruf des entsprechenden setjmp () enthalten und nicht vom Typ flüchtig qualifiziert sind die zwischen dem Aufruf von setjmp () und dem Aufruf von longjmp () geändert werden, sind unbestimmt. "

Ich sehe folgende zwei mögliche Interpretationen:

Interpretation1:

Lokale Variablen werden wiederhergestellt, mit Ausnahme der beiden

nichtflüchtig undgeändert

Interpretation2:

Lokale Variablen werden mit Ausnahme von wiederhergestellt

diejenigen, die nichtflüchtig sind unddiejenigen, die geändert werden

Nach Interpretation1 nach LongJMP ist nur v1 undefiniert. v2, v3, v4 sind definiert. Nach Interpretation2 ist nach longjmp nur v4 definiert. v1, v2, v3 sind undefiniert.

Welcher ist richtig?

Übrigens: Ich benötige eine allgemeine ("portable") Antwort, die für alle Compiler gültig ist, d. H. Das Ausprobieren mit einem bestimmten Compiler hilft nicht.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage