2009-09-03 38 views
32

Có an toàn khi sử dụng longjmp và setjmp trong C++ trên linux/gcc liên quan đến những điều sau không?C++: An toàn để sử dụng longjmp và setjmp?

  1. xử lý ngoại lệ (tôi không thực hiện xử lý ngoại lệ sử dụng longjmp/setjmp. Tôi muốn biết những gì tác dụng phụ longjmp/setjmp sẽ phải về xử lý ngoại lệ tiêu chuẩn)
  2. *this con trỏ
  3. Tín hiệu
  4. Con trỏ thông minh (con trỏ được chia sẻ và xâm nhập của Boost)
  5. Bất kỳ điều gì khác bạn có thể nghĩ đến.

Trả lời

54

setjmp()/longjmp() hoàn toàn lật đổ thư giãn và do đó xử lý ngoại lệ cũng như RAII (destructors nói chung).

Từ 18,7/4 "hỗ trợ khác runtime" trong tiêu chuẩn:

Nếu bất kỳ đối tượng tự động sẽ bị phá hủy bởi một ngoại lệ ném chuyển kiểm soát khác (đích) điểm trong chương trình, sau đó là một cuộc gọi đến longjmp(jbuf, val) tại điểm ném chuyển điều khiển đến cùng một điểm (đích) có hành vi không xác định.

Vì vậy, dòng dưới cùng là setjmp()/longjmp() không phát tốt trong C++.

+0

Bạn có thể giải thích cách longjmp messes với xóa bộ nhớ rõ ràng và destructors? – jameszhao00

+12

Nói chung, bất cứ khi nào có một cách để thoát khỏi phạm vi trong C++ (trả về, ném hoặc bất kỳ thứ gì), trình biên dịch sẽ đặt hướng dẫn để gọi các dtors cho bất kỳ biến tự động nào cần phải bị hủy. 'longjmp()' chỉ nhảy đến vị trí mới trong mã, vì vậy nó sẽ không cung cấp bất kỳ cơ hội nào cho các dtors được gọi. Tiêu chuẩn này thực sự ít cụ thể hơn - tiêu chuẩn không nói rằng các dtors sẽ không được gọi - nó nói rằng tất cả các phiên cược đều bị tắt. Bạn không thể phụ thuộc vào bất kỳ hành vi cụ thể trong trường hợp này. –

+0

Tôi không quá quen thuộc với các con trỏ thông minh. Nếu tôi có một con trỏ thông minh trên stack, khi tôi làm một longjmp không có nghĩa là con trỏ thông minh sẽ không loại bỏ một refcount? Ngoài ra, tôi có an toàn nếu tôi vô hiệu hóa ngoại lệ và viết mã không phát điên với longjmp? – jameszhao00

-8

Tôi đã chỉ học được về những lệnh, và không bao giờ nhìn thấy chúng trong hành động trong các ứng dụng thực sự.

IMHO, thật an toàn khi nói rằng việc sử dụng chúng không an toàn: nhà phát triển sẽ không hiểu những API "không phổ biến" này làm gì.

+3

Điều này là để thực hiện một coroutines (yêu cầu nhảy ngẫu nhiên xung quanh) – jameszhao00

+11

Nhà phát triển có kinh nghiệm hoàn toàn sẽ biết những API "không phổ biến" này làm gì. Họ đã là một phần của thư viện C chuẩn trong nhiều thập kỷ. – Novelocrat

+23

Nhà phát triển có kinh nghiệm sẽ hoàn toàn biết những chức năng này làm gì. Họ cũng sẽ biết rằng họ là những điều khó khăn để sử dụng ngay trong C (mặc dù đôi khi cần thiết), và cực kỳ nguy hiểm trong C + +. –

5

Nó không cụ thể cho Linux hoặc gcc; setjmp/longjmp và C++ không hoạt động tốt với nhau nếu bạn đang sử dụng longjmp để lại một ngữ cảnh có các biến tự động với destructors.

Các trình phá hủy sẽ không chạy có thể dẫn đến rò rỉ bộ nhớ hoặc hành vi xấu khác.

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