क्या स्टैक ओवरफ्लो का पता लगाना सॉफ्टवेयर का काम है (ऑपरेटिंग सिस्टम) या हार्डवेयर में स्टैक ओवरफ्लो का पता लगाया जाता है, जिससे सीपीयू में अपवाद होता है?
क्या स्टैक ओवरफ्लो का पता लगाना सॉफ्टवेयर का काम है (ऑपरेटिंग सिस्टम) या हार्डवेयर में स्टैक ओवरफ्लो का पता लगाया जाता है, जिससे सीपीयू में अपवाद होता है?
जवाबों:
यह सॉफ्टवेयर, या हार्डवेयर, या दोनों, या कोई भी हो सकता है।
ओवरफ्लो दो प्रकार के होते हैं: स्टैक बढ़ने पर ओवरफ्लो (जब किसी फंक्शन में प्रवेश करते हैं), और स्टैक पर एरे को एक्सेस करने पर ओवरफ्लो होता है। जब ढेर बढ़ता है तो फंक्शन एंट्री पर बाउंड चेक बनाकर पता लगाया जा सकता है कि यह सत्यापित करने के लिए कि पर्याप्त जगह है (या तो त्रुटि का संकेत है या स्टैक बढ़ने पर अगर वहाँ नहीं है)। ढेर पर एक सरणी तक पहुँचने पर ओवरफ्लो केवल निम्न-स्तरीय भाषाओं में एक मुद्दा है जो सरणी सीमा को सत्यापित नहीं करता है; सरणी सीमा को सत्यापित करने के लिए समाधान है।
इन सॉफ़्टवेयर दृष्टिकोणों का लाभ है कि वे पूरी तरह से मज़बूती से काम करते हैं: आप सुनिश्चित कर सकते हैं कि किसी भी स्टैक ओवरफ़्लो का पता लगाया जाएगा। उनका नकारात्मक पक्ष यह है कि वे कोड आकार और निष्पादन समय बढ़ाते हैं। हार्डवेयर जब तक कोई अतिप्रवाह नहीं होता है तब तक किसी भी कीमत पर अधिकांश ओवरफ्लो का पता लगाने के लिए एक विधि प्रदान करके मदद कर सकता है। MMU time के साथ एक आर्किटेक्चर पर , रनटाइम वातावरण एक पेज की सीमा पर स्टैक को मैप करने की व्यवस्था कर सकता है, जिसके साथ अगला पेज अनमैप्ड रहेगा।
+---------------+---------------+---------------+---------------+
| stack | unmapped | other stuff |
| ----> direction of growth | | |
+---------------+---------------+---------------+---------------+
^ ^ ^ ^ ^ page boundaries
इस तरह, यदि सॉफ़्टवेयर पृष्ठ सीमा से परे डेटा तक पहुंचने का प्रयास करता है (चाहे स्टैक पॉइंटर सीमा से परे चला गया हो या क्योंकि सरणी पहुंच सीमा से बाहर है और सीमा से परे है), यह एक अनमोल क्षेत्र तक पहुँचने के कारण एक दोष पैदा करेगा । यह केवल तब होता है जब अतिप्रवाह काफी छोटा होता है: यदि अतिप्रवाह की मात्रा बहुत बड़ी है, तो प्रोग्राम पता स्थान में अंतराल के दूसरी तरफ अन्य सामान तक पहुंच सकता है।
हार्डवेयर दृष्टिकोण के डाउनसाइड्स यह है कि यह पूरी तरह से विश्वसनीय नहीं है क्योंकि एक बड़ी राशि द्वारा अतिप्रवाह का पता नहीं लगाया जा सकता है, और यह पता जगह पर रहने वाले सरणी ओवरफ्लो का पता नहीं लगाता है।
सरणी ओवरफ्लो का पता लगाने के लिए, एक अन्य सॉफ़्टवेयर तकनीक एक कैनरी है : स्टैक के शीर्ष पर या फ़्रेम के बीच एक विशेष मूल्य डालें, और जांचें कि कैनरी मान फ़ंक्शन रिटर्न पर नहीं बदला है। यह भी एक अपूर्ण तकनीक है क्योंकि अतिप्रवाह कैनरी से पूरी तरह से बच सकता है या पता नहीं लगाया जा सकता है क्योंकि कैनरी का मूल्य उस समय तक बहाल हो जाता है जब यह जाँच की जाती है। बहरहाल, कुछ सुरक्षा कमजोरियों का फायदा उठाने के लिए इसे कठिन बनाना उपयोगी है।
स्टैक ओवरफ्लो से बचने का सबसे सुरक्षित और सस्ता तरीका स्टैक की मात्रा की गणना करना है जिसे स्थिर विश्लेषण द्वारा शुरू करने से पहले प्रोग्राम को इसकी आवश्यकता होगी। हालांकि यह हमेशा व्यावहारिक नहीं होता है: एक प्रोग्राम द्वारा आवश्यक स्टैक की मात्रा सामान्य रूप से अनिर्दिष्ट है और प्रोग्राम द्वारा हेरफेर किए गए डेटा पर निर्भर करता है।
U एक ही सिद्धांत को केवल एक एमपीयू के साथ भी लागू किया जा सकता है, या कोई मेमोरी सुरक्षा के साथ नहीं किया जा सकता है यदि एक भी धागा है जिसका स्टैक मौजूदा भौतिक मैपिंग के किनारे पर है।