Câu hỏi của tôi nhằm vào hành vi của setjmp/longjmp liên quan đến biến cục bộ.setjmp/longjmp và biến cục bộ
đangVí dụ:
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();
}
Các tài liệu của setjmp/longjmp nói:
"Tất cả các đối tượng truy cập có giá trị tính đến thời điểm longjmp() được gọi, ngoại trừ việc các giá trị của đối tượng thời gian lưu trữ tự động mà là cục bộ cho hàm chứa lời gọi tương ứng setjmp() không có loại đủ điều kiện dễ bay hơi và được thay đổi giữa lời gọi setjmp() và longjmp() không xác định. "
tôi thấy sau hai cách giải thích:
intepretation1:
biến địa phương được phục hồi, ngoại trừ những đều
- non-volatile và
- thay đổi
intepretation2:
biến địa phương được phục hồi, ngoại trừ
- những người mà là non-volatile và
- những người được thay đổi
Theo interpretation1 sau longjmp chỉ v1 là undefined. v2, v3, v4 được xác định. Theo giải thích2 sau khi longjmp chỉ v4 được xác định. v1, v2, v3 không xác định.
Điều nào là đúng?
BTW: Tôi cần câu trả lời chung ("di động") hợp lệ cho tất cả các trình biên dịch, tức là thử với một trình biên dịch cụ thể không hữu ích.
Lưu ý thực hiện: Các biến được thay đổi và không bay hơi có thể giống như thời gian của longjmp, hoặc có thể được khôi phục về những gì chúng đang ở thời điểm setjmp, tùy thuộc vào việc tạo mã. Do đó 'không xác định'. Vì vậy, nếu chúng được * không * thay đổi, hai giá trị này giống nhau và đó là lý do tại sao các vars không thay đổi là an toàn. – greggo