क्या एक पूर्णांक अतिप्रवाह है?
यह अकसर किये गए सवाल का जवाब k4thryn ने लिखा था:
एक पूर्णांक अतिप्रवाह, या पूर्णांक लपेटकर, एक कार्यक्रम के तथ्य यह है कि कि एक संख्यात्मक डेटाप्रकार में आयोजित किया जा सकता है कि मूल्य bytes में डेटा प्रकार के आकार के द्वारा सीमित है पर आधारित में एक संभावित समस्या है. एएनएसआई सी निम्नलिखित न्यूनतम आकार का उपयोग करता है:
| डेटा प्रकार | आकार (बाइट्स) |
|---|---|
| चार | 1 |
| छोटा | 2 |
| int | 2 |
| लंबा | 4 |
अभ्यास में, कई compilers एक 4-बाइट int का उपयोग करें. यह भी कहा कि इस प्रकार के डेटा के लिए वास्तविक सीमा या नहीं वे पर हस्ताक्षर किए हैं पर निर्भर करते हैं ध्यान दिया जाना चाहिए. जबकि एक छोटी अहस्ताक्षरित 0 और 65535 के बीच हो सकती है उदाहरण के लिए, एक हस्ताक्षर 2-कम बाइट -32767 और 32767 के बीच में, हो सकता है. देखो तुम्हारी [अपनी संकलक के लिए विशिष्ट संख्या के लिए] / limits.h फाइल शामिल है.
तुम क्यों परवाह करूँ? यदि आपको लगता है कि इसे भी पकड़ करने के लिए छोटा है एक डेटा प्रकार में एक कीमत डाल करने की कोशिश है, उच्च आदेश बिट, और गिरा दिया है सिर्फ कम आदेश बिट जमा हो जाती है. कि कि modulo-अंकगणितीय मूल्य पर यह यकीन है कि यह डेटाप्रकार के भीतर हो गया बनाने के लिए भंडारण से पहले प्रदर्शन किया है कहने का एक और तरीका है. हमारे अहस्ताक्षरित लघु उदाहरण ले रहा है:
| सीमा: | 65535 या 1111 1111 1111 1111 |
| बहुत बड़ा: | 65536 या 1 0000 0000 0000 0000 |
| क्या संग्रह किया गया है: | 0 या 0000 0000 0000 0000 |
क्योंकि उच्च (या बाएं वह भी बड़ा है कि मूल्य के सबसे) बिट गिरा दिया है आदेश के रूप में उपरोक्त स्पष्ट करता है, यह परिणाम है. या आपको लगता है कि क्या संग्रह किया गया है कह सकता का परिणाम है
= मूल्य% संग्रहीत (सीमा + 1) या 65536% (65,535 + 1) = 0
पर हस्ताक्षर किए datatypes में, नतीजा कुछ मालूम होता है अजीब व्यवहार में एक छोटा और अलग परिणाम है:
| सकारात्मक सीमा: | 32767 या 0111 1111 1111 1111 |
| बहुत बड़ा: | 32768 या 1000 0000 0000 0000 |
| क्या संग्रह किया गया है: | -32768 |
ऐसा क्यों है? यह 2 क्योंकि "की तारीफ," जो कैसे नकारात्मक द्विआधारी संख्या में प्रतिनिधित्व कर रहे हैं रहा है. एक लंबी कहानी छोटी है, सीमा (0 के माध्यम से 0111 1111 1111 1111) की पहली छमाही क्रम में धनात्मक संख्याओं के लिए कम से कम के महानतम के लिए प्रयोग किया जाता है बनाने के लिए. इस श्रेणी के दूसरे आधे तो क्रम में ऋणात्मक संख्याओं के लिए कम से कम के महानतम के लिए प्रयोग किया जाता है. इसलिए एक हस्ताक्षर 2 के लिए नकारात्मक लेकर छोटी बाइट -32768 -1 के माध्यम से, उस क्रम में है.
तुम अभी तक क्यों इस मामले, तुम नहीं कर रहे हैं पूछ रहे हैं? स्मृति एक अहस्ताक्षरित पूर्णांक डेटा प्रकार के मूल्य के आधार पर आवंटित किया जा रहा है तो. यदि यह मूल्य के आसपास लपेट रखी हैं, यह है कि अभी तक बहुत कम स्मृति उपलब्ध कराया जाएगा हो सकता है. या फिर अगर एक तुलना एक हस्ताक्षर पूर्णांक मान और कुछ अन्य संख्या के बीच, जो पूर्व के बाद से अधिक है, अगर उस मूल्य नकारात्मक है, तुलना पारित करेगी में overflown है कम किया जाना चाहिए संभालने बनाया जा रहा है. लेकिन हो बातें प्रोग्रामर के इरादे से इस तरह का व्यवहार करने के लिए जा रहा है? शायद नहीं.
पूर्णांक Overflows पर सूचना के अतिरिक्त स्रोत
हालांकि यह इस लेख के दायरे से परे है, जो पूर्णांक अतिप्रवाह के कीड़े के बारे में और अधिक विस्तार में जाने अन्य संसाधनों हैं, उनके निवारण, और उनके शोषण. अर्थात्, वहाँ Oded Horovitz द्वारा Phrack # 60 (एक में दो बहुत ही रोचक लेख है, और एक blexim द्वारा) पूर्णांक अतिप्रवाह vulnerabilities पर हैं. पूर्णांक लपेटकर भी "पेशेवर स्रोत कोड लेखा परीक्षा में 2002 यूएसए काले Hat वार्ता (Dowd, एट als) से" प्रस्तुति शामिल है.
एक उपकरण का प्रयोग करने के लिए पूर्णांक Overflows के साथ
यह कार्यक्रम int_wrap.c आप कमांड लाइन है कि क्या डेटा प्रकार (छोटी) पर निर्दिष्ट करके इस व्यवहार के साथ हस्ताक्षर किया जाना चाहिए या अहस्ताक्षरित, और जो आप प्रयोग करना चाहते हैं मूल्य के चारों ओर खेलने की अनुमति देता है.
नोट: perl एक 250-नंबर पर अंक सीमा है लगता है, और त्रुटि "संख्या बहुत लंबे समय के साथ मर जाता है" (संस्करण 5.8.0 का परीक्षण). बहरहाल, महत्वपूर्ण अंकों की संख्या अधिक है कि तुलना में कम है.
|
जोखिम प्रबंधन Dummies के लिए
नवीनतम ब्लॉग पोस्ट
- SourceForge बनाम Freshmeat






