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ändertInterpretation2:
Lokale Variablen werden mit Ausnahme von wiederhergestellt
diejenigen, die nichtflüchtig sind unddiejenigen, die geändert werdenNach 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.