क्या हार्डवेयर या सॉफ्टवेयर द्वारा स्टैक ओवरफ्लो का पता लगाया जाता है?


26

क्या स्टैक ओवरफ्लो का पता लगाना सॉफ्टवेयर का काम है (ऑपरेटिंग सिस्टम) या हार्डवेयर में स्टैक ओवरफ्लो का पता लगाया जाता है, जिससे सीपीयू में अपवाद होता है?


मैं सबसे CPU पर MMU दोष के माध्यम से हार्डवेयर कहूँगा। 32 बिट्स मोड में x86 में पेजिंग के अलावा सेगमेंटेशन था, और "स्टैक सेगमेंट" कोड, डेटा, एक्सट ... जैसे आधार पते और आकार दोनों के साथ जुड़ा हुआ है। उस सीमा के बाहर कोई भी एक्सेस एक गलती को ट्रिगर करेगा।
TEMLIB

जवाबों:


25

यह सॉफ्टवेयर, या हार्डवेयर, या दोनों, या कोई भी हो सकता है।

ओवरफ्लो दो प्रकार के होते हैं: स्टैक बढ़ने पर ओवरफ्लो (जब किसी फंक्शन में प्रवेश करते हैं), और स्टैक पर एरे को एक्सेस करने पर ओवरफ्लो होता है। जब ढेर बढ़ता है तो फंक्शन एंट्री पर बाउंड चेक बनाकर पता लगाया जा सकता है कि यह सत्यापित करने के लिए कि पर्याप्त जगह है (या तो त्रुटि का संकेत है या स्टैक बढ़ने पर अगर वहाँ नहीं है)। ढेर पर एक सरणी तक पहुँचने पर ओवरफ्लो केवल निम्न-स्तरीय भाषाओं में एक मुद्दा है जो सरणी सीमा को सत्यापित नहीं करता है; सरणी सीमा को सत्यापित करने के लिए समाधान है।

इन सॉफ़्टवेयर दृष्टिकोणों का लाभ है कि वे पूरी तरह से मज़बूती से काम करते हैं: आप सुनिश्चित कर सकते हैं कि किसी भी स्टैक ओवरफ़्लो का पता लगाया जाएगा। उनका नकारात्मक पक्ष यह है कि वे कोड आकार और निष्पादन समय बढ़ाते हैं। हार्डवेयर जब तक कोई अतिप्रवाह नहीं होता है तब तक किसी भी कीमत पर अधिकांश ओवरफ्लो का पता लगाने के लिए एक विधि प्रदान करके मदद कर सकता है। MMU time के साथ एक आर्किटेक्चर पर , रनटाइम वातावरण एक पेज की सीमा पर स्टैक को मैप करने की व्यवस्था कर सकता है, जिसके साथ अगला पेज अनमैप्ड रहेगा।

+---------------+---------------+---------------+---------------+
| stack                         | unmapped      | other stuff   |
|    ----> direction of growth  |               |               |
+---------------+---------------+---------------+---------------+
^               ^               ^               ^               ^  page boundaries

इस तरह, यदि सॉफ़्टवेयर पृष्ठ सीमा से परे डेटा तक पहुंचने का प्रयास करता है (चाहे स्टैक पॉइंटर सीमा से परे चला गया हो या क्योंकि सरणी पहुंच सीमा से बाहर है और सीमा से परे है), यह एक अनमोल क्षेत्र तक पहुँचने के कारण एक दोष पैदा करेगा । यह केवल तब होता है जब अतिप्रवाह काफी छोटा होता है: यदि अतिप्रवाह की मात्रा बहुत बड़ी है, तो प्रोग्राम पता स्थान में अंतराल के दूसरी तरफ अन्य सामान तक पहुंच सकता है।

हार्डवेयर दृष्टिकोण के डाउनसाइड्स यह है कि यह पूरी तरह से विश्वसनीय नहीं है क्योंकि एक बड़ी राशि द्वारा अतिप्रवाह का पता नहीं लगाया जा सकता है, और यह पता जगह पर रहने वाले सरणी ओवरफ्लो का पता नहीं लगाता है।

सरणी ओवरफ्लो का पता लगाने के लिए, एक अन्य सॉफ़्टवेयर तकनीक एक कैनरी है : स्टैक के शीर्ष पर या फ़्रेम के बीच एक विशेष मूल्य डालें, और जांचें कि कैनरी मान फ़ंक्शन रिटर्न पर नहीं बदला है। यह भी एक अपूर्ण तकनीक है क्योंकि अतिप्रवाह कैनरी से पूरी तरह से बच सकता है या पता नहीं लगाया जा सकता है क्योंकि कैनरी का मूल्य उस समय तक बहाल हो जाता है जब यह जाँच की जाती है। बहरहाल, कुछ सुरक्षा कमजोरियों का फायदा उठाने के लिए इसे कठिन बनाना उपयोगी है।

स्टैक ओवरफ्लो से बचने का सबसे सुरक्षित और सस्ता तरीका स्टैक की मात्रा की गणना करना है जिसे स्थिर विश्लेषण द्वारा शुरू करने से पहले प्रोग्राम को इसकी आवश्यकता होगी। हालांकि यह हमेशा व्यावहारिक नहीं होता है: एक प्रोग्राम द्वारा आवश्यक स्टैक की मात्रा सामान्य रूप से अनिर्दिष्ट है और प्रोग्राम द्वारा हेरफेर किए गए डेटा पर निर्भर करता है।

U एक ही सिद्धांत को केवल एक एमपीयू के साथ भी लागू किया जा सकता है, या कोई मेमोरी सुरक्षा के साथ नहीं किया जा सकता है यदि एक भी धागा है जिसका स्टैक मौजूदा भौतिक मैपिंग के किनारे पर है।


4
मैं आउट-ऑफ-बाउंड्स एरे को एक स्टैक ओवरफ्लो का उपयोग नहीं कहूंगा, भले ही ऐरे स्टैक पर हो। यह एक बफर अतिप्रवाह का सिर्फ एक विशेष मामला है।
कोडइन्चोज

एक गैर-स्टैक / फ्रेम पॉइंटर या गैर-स्थिर ऑफसेट के सापेक्ष संदर्भित होने वाले प्राथमिक स्टैक आइटम को आवंटित नहीं करना पारंपरिक स्टैक ओवरफ्लो से बचना होगा। एक अलग रिटर्न एड्रेस स्टैक (या इटेनियम की तरह RA / रजिस्टर स्पिल स्टैक) का उपयोग करके कम से कम रिटर्न-उन्मुख प्रोग्रामिंग अवसरों को कम किया जाएगा।
पॉल ए। क्लेटन

आउट-ऑफ-बाउंड्स एक्सेस को ओवररन कहा जाता है , ओवरफ्लो नहीं।
बेन वोइगट

3
@ भयानक हर मंच ढेर overflows का पता नहीं लगाता है। आप स्टैक के बाद जो कुछ भी हो, उसे ओवरराइट कर सकते हैं (किसी भी अन्य बफर अतिप्रवाह के समान)।
user253751

1
@CodesInChaos, कभी-कभी स्टैक-आवंटित बफ़र्स में बफर ओवरफ़्लो को "स्टैक ओवरफ़्लो" (संक्षेप में) कहा जाता है। दी गई, कि शब्दावली बिना संदर्भ के थोड़ी भ्रमित करने वाली हो सकती है।
डीडब्ल्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.