2009-09-03 7 views
32

क्या यह निम्नलिखित के संबंध में linux/gcc पर C++ में longjmp और setjmp का उपयोग सुरक्षित है?सी ++: longjmp और setjmp का उपयोग करने के लिए सुरक्षित?

  1. अपवाद हैंडलिंग
  2. *this सूचक
  3. सिग्नल (आई/setjmp longjmp का उपयोग कर अपवाद संचालन को लागू नहीं कर रहा हूँ। मुझे पता है कि क्या दुष्प्रभाव longjmp/setjmp मानक अपवाद संचालन पर होगा चाहते हैं)
  4. स्मार्ट पॉइंटर्स (बूस्ट के साझा और घुसपैठ पॉइंटर्स)
  5. और कुछ भी जो आप सोच सकते हैं।

उत्तर

54

setjmp()/longjmp() पूरी तरह से ढेर नष्ट तनाव मुक्त और इसलिए अपवाद हैंडलिंग के साथ-साथ (सामान्य रूप में विनाशकर्ता) आरए II।

किसी भी स्वत: वस्तुओं एक फेंक दिया अपवाद एक और (गंतव्य) के नियंत्रण के हस्तांतरण से नष्ट हो चाहते हैं बिंदु कार्यक्रम में, तो एक फोन:

18,7/4 "अन्य रनटाइम समर्थन" मानक में से फेंकने पर longjmp(jbuf, val) पर एक ही (गंतव्य) बिंदु पर नियंत्रण स्थानांतरित करने के लिए अपरिभाषित व्यवहार है।

तो लब्बोलुआब यह है कि setjmp()/longjmp() सी में अच्छी तरह से नहीं खेलते हैं ++ है।

+0

क्या आप स्पष्ट स्मृति विलोपन और विनाशकों के साथ कितनी देर तक गड़बड़ कर सकते हैं? – jameszhao00

+12

आम तौर पर, जब भी सी ++ (वापसी, फेंक, या जो कुछ भी) में किसी दायरे से बाहर निकलने का कोई तरीका होता है, तो संकलक उस ब्लॉक को छोड़ने के परिणामस्वरूप किसी भी स्वचालित चर के लिए dtors को कॉल करने के लिए निर्देश रखेगा। 'longjmp()' कोड में एक नए स्थान पर कूदता है, इसलिए यह डॉटर्स को कॉल करने का कोई मौका नहीं देगा। मानक वास्तव में उससे कम विशिष्ट है - मानक यह नहीं कहता कि dtors को नहीं कहा जाएगा - यह कहता है कि सभी दांव बंद हैं। आप इस मामले में किसी विशेष व्यवहार पर निर्भर नहीं हो सकते हैं। –

+0

मैं स्मार्ट पॉइंटर्स से बहुत परिचित नहीं हूं। अगर मेरे पास स्टैक पर एक स्मार्ट पॉइंटर है, तो जब मैं एक लांगजंप करता हूं तो इसका मतलब यह है कि स्मार्ट पॉइंटर एक रिफॉउंट नहीं हटाएगा? साथ ही, क्या मैं सुरक्षित हूं यदि मैं अपवाद अक्षम करता हूं और कोड लिखता हूं जो longjmp के साथ पागल नहीं होता है? – jameszhao00

-8

मैंने केवल उन आदेशों के बारे में सीखा है, और उन्हें वास्तविक अनुप्रयोगों में कभी भी कार्रवाई में नहीं देखा है।

आईएमएचओ, यह कहना सुरक्षित है कि उनका उपयोग सुरक्षित नहीं है: डेवलपर समझ नहीं पाएंगे कि उन "अलोकप्रिय" एपीआई क्या करते हैं।

+3

यह एक कोरआउट संक्रमण के लिए है (जिसके लिए यादृच्छिक रूप से कूदना आवश्यक है) – jameszhao00

+11

अनुभवी डेवलपर्स पूरी तरह से यह जान लेंगे कि ये "अलोकप्रिय" एपीआई क्या करते हैं। वे दशकों से मानक सी पुस्तकालय का हिस्सा रहे हैं। – Novelocrat

+23

अनुभवी डेवलपर्स पूरी तरह से जान लेंगे कि ये कार्य क्या करते हैं। वे यह भी जानेंगे कि सी में सही उपयोग करने के लिए वे मुश्किल चीजें हैं (हालांकि कभी-कभी आवश्यक), और सी ++ में बेहद खतरनाक हैं। –

5

यह लिनक्स या जीसीसी के लिए विशिष्ट नहीं है; setjmp/longjmp और C++ एक साथ बहुत अच्छी तरह से काम नहीं करते हैं यदि आप एक संदर्भ छोड़ने के लिए longjmp का उपयोग कर रहे हैं जहां विनाशकों के साथ स्वचालित चर हैं।

विनाशक नहीं चलेंगे जो परिणामस्वरूप स्मृति रिसाव या अन्य बुरे व्यवहार में हो सकते हैं।