Mis preguntas apuntan al comportamiento de setjmp/longjmp con respecto a las variables locales.setjmp/longjmp y variables locales
códigoEjemplo:
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();
}
La documentación de setjmp/longjmp dice:
"Todos los objetos accesibles tienen valores a partir de la longjmp tiempo() fue llamado, excepto que los valores de los objetos de duración de almacenamiento automático que son locales para la función que contiene la invocación del setjmp() correspondiente que no tienen un tipo calificado volátil y que se cambian entre la invocación setjmp() y la llamada longjmp() son indeterminadas. "
veo después de dos posibles interpretaciones:
intepretation1:
Las variables locales son restauradas, excepto los que son a la vez
- no volátil y
- cambió
intepretation2:
Las variables locales son restauradas, excepto
- los que son no volátil y
- los que se cambió
Según interpretation1 después longjmp única v1 no está definido. v2, v3, v4 están definidos. Según la interpretación2 después de longjmp solo se define v4. v1, v2, v3 no están definidos.
¿Cuál es la correcta?
BTW: Necesito una respuesta general ("portátil") que sea válida para todos los compiladores, es decir, probar con un compilador en particular no ayuda.
Nota de implementación: Las variables que son cambiadas y no volátiles pueden ser como eran en el momento de longjmp, o pueden restaurarse a lo que eran en el momento de setjmp, dependiendo de la generación del código. Por lo tanto, "indeterminado". Entonces, si fueron * no * cambiados, estos dos valores son los mismos y es por eso que los vars sin cambios son seguros. – greggo