2017-12-23 125 views
7

Trong manpage trên longjmpsetjmp, có dòng này:Tôi có phải gọi là 'longjmp' sau một 'setjmp'

Nếu chức năng đó gọi là setjmp() lợi nhuận trước longjmp() là gọi, hành vi này là chưa xác định.

Điều đó có nghĩa là tôi thực sự phải gọi longjmp ở đâu đó trong chức năng gọi là setjmp hoặc trong chức năng lồng nhau? Hoặc là OK để không gọi nó ở tất cả?

Trả lời

11

Bạn đang đọc sai.

Nếu hàm được gọi là setjmp() trả về trước longjmp() được gọi, hành vi không xác định.

Hành vi của longjmp là undefined nếu bạn gọi nó sau bạn trở về từ các chức năng mà thiết lập các setjmp. Nhưng hoàn toàn đúng, không phải không phải để gọi số longjmp.

Wikipedia là rõ ràng hơn:

Nếu chức năng trong đó setjmp được gọi trở lại, nó không còn có thể sử dụng một cách an toàn longjmp với đối tượng jmp_buf tương ứng.

Điều này là do khung ngăn xếp không hợp lệ khi hàm trả về. Gọi longjmp khôi phục con trỏ ngăn xếp, bởi vì hàm trả về — sẽ trỏ đến khung ngăn xếp không tồn tại và có khả năng bị ghi đè hoặc bị hỏng.

Các chức năng đó thường được sử dụng để xử lý các cơ chế ngoại lệ. Nếu ngoại lệ không xảy ra, bạn không muốn gọi số longjmp vì không có lý do gì để "tua lại" chương trình của bạn.

Các vấn đề liên quan