जावा इंट या लंबे आदिम प्रकारों के लिए पूर्णांक अतिप्रवाह के साथ कुछ भी नहीं करता है और सकारात्मक और नकारात्मक पूर्णांक के साथ अतिप्रवाह को अनदेखा करता है।
यह उत्तर पहले पूर्णांक ओवरफ़्लो का वर्णन करता है, एक उदाहरण देता है कि यह कैसे हो सकता है, यहां तक कि अभिव्यक्ति मूल्यांकन में मध्यवर्ती मूल्यों के साथ, और फिर उन संसाधनों के लिंक देता है जो पूर्णांक ओवरफ़्लो को रोकने और पता लगाने के लिए विस्तृत तकनीक देते हैं।
पूर्ण या अनपेक्षित अतिप्रवाह में परिणामी अंकगणित और अभिव्यक्तियाँ एक सामान्य प्रोग्रामिंग त्रुटि हैं। अप्रत्याशित या अघोषित पूर्णांक अतिप्रवाह भी एक सुविख्यात शोषक सुरक्षा मुद्दा है, विशेष रूप से यह सरणी, स्टैक और सूची वस्तुओं को प्रभावित करता है।
अतिप्रवाह या तो सकारात्मक या नकारात्मक दिशा में हो सकता है जहां प्रश्न में आदिम प्रकार के लिए सकारात्मक या नकारात्मक मूल्य अधिकतम या न्यूनतम मूल्यों से परे होगा। ओवरफ़्लो अभिव्यक्ति या ऑपरेशन मूल्यांकन के दौरान एक मध्यवर्ती मूल्य में हो सकता है और एक अभिव्यक्ति या ऑपरेशन के परिणाम को प्रभावित कर सकता है जहां अंतिम मूल्य सीमा के भीतर होने की उम्मीद होगी।
कभी-कभी नकारात्मक अतिप्रवाह को गलती से अंडरफ्लो कहा जाता है। अंडरफ़्लो वह होता है जब कोई मूल्य प्रतिनिधित्व की अनुमति से शून्य के करीब होगा। अंडरफ़्लो पूर्णांक अंकगणित में होता है और अपेक्षित होता है। पूर्णांक अंडरफ़्लो तब होता है जब एक पूर्णांक मूल्यांकन -1 और 0 या 0 और 1. के बीच होगा। भिन्नात्मक परिणाम 0. से कम हो जाएगा। यह सामान्य है और पूर्णांक अंकगणित के साथ अपेक्षित है और त्रुटि नहीं माना जाता है। हालांकि, यह एक अपवाद को फेंकने वाले कोड को जन्म दे सकता है। एक उदाहरण "ArithmeticException: / शून्य से" अपवाद है यदि पूर्णांक अंडरफ़्लो का परिणाम अभिव्यक्ति में विभाजक के रूप में उपयोग किया जाता है।
निम्नलिखित कोड पर विचार करें:
int bigValue = Integer.MAX_VALUE;
int x = bigValue * 2 / 5;
int y = bigValue / x;
जिसके परिणामस्वरूप x को 0 असाइन किया जा रहा है और bigValue / x के बाद के मूल्यांकन में एक अपवाद फेंकता है, "ArithmeticException: / by zero" (यानी शून्य से विभाजित), y के बजाय मान 2 असाइन किया जा रहा है।
X के लिए अपेक्षित परिणाम 858,993,458 होगा जो 2,147,483,647 के अधिकतम अंतर मूल्य से कम है। हालांकि, Integer.MAX_Value * 2 का मूल्यांकन करने से मध्यवर्ती परिणाम, 4,294,967,294 होगा, जो कि अधिकतम int मान से अधिक है और 2s पूरक पूर्णांक निरूपण के अनुसार -2 है। -2 / 5 के बाद का मूल्यांकन 0 को मूल्यांकन करता है जो x को सौंपा गया है।
कंप्यूटिंग एक्स के लिए एक्सप्रेशन को फिर से अभिव्यक्त करना, जब मूल्यांकन किया जाता है, तो गुणा करने से पहले विभाजित होता है, निम्न कोड:
int bigValue = Integer.MAX_VALUE;
int x = bigValue / 5 * 2;
int y = bigValue / x;
x में परिणाम 858,993,458 और y को 2 असाइन किया जा रहा है, जो अपेक्षित है।
BigValue / 5 से मध्यवर्ती परिणाम 429,496,729 है जो एक इंट के लिए अधिकतम मान से अधिक नहीं है। 429,496,729 * 2 के बाद के मूल्यांकन एक इंट के लिए अधिकतम मूल्य से अधिक नहीं है और अपेक्षित परिणाम एक्स को सौंपा गया है। Y के लिए मूल्यांकन तब शून्य से विभाजित नहीं होता है। एक्स और वाई के लिए मूल्यांकन उम्मीद के मुताबिक काम करते हैं।
जावा पूर्णांक मानों को संग्रहीत किया जाता है और 2s पूरक पूर्णांक अभ्यावेदन के अनुसार व्यवहार किया जाता है। जब परिणामी मान अधिकतम या न्यूनतम पूर्णांक मानों से बड़ा या छोटा होगा, तो इसके बजाय 2 का पूरक पूर्णांक मान परिणाम होगा। स्थितियों में स्पष्ट रूप से 2s पूरक व्यवहार का उपयोग करने के लिए डिज़ाइन नहीं किया गया है, जो कि सबसे साधारण पूर्णांक अंकगणितीय स्थितियां हैं, जिसके परिणामस्वरूप 2s पूरक मूल्य प्रोग्रामिंग लॉजिक या कम्प्यूटेशन त्रुटि का कारण होगा जैसा कि ऊपर दिए गए उदाहरण में दिखाया गया था। एक उत्कृष्ट विकिपीडिया लेख में 2 एस तारीफों का वर्णन किया गया है जो बाइनरी पूर्णांक यहाँ हैं: दो का पूरक - विकिपीडिया
अनजाने पूर्णांक अतिप्रवाह से बचने की तकनीकें हैं। Techinques को प्री-कंडीशन टेस्टिंग, अपकास्टिंग और BigInteger के उपयोग के रूप में वर्गीकृत किया जा सकता है।
प्री-कंडीशन टेस्टिंग में एक अंकगणितीय ऑपरेशन या अभिव्यक्ति में जाने वाले मूल्यों की जांच करना शामिल है ताकि यह सुनिश्चित हो सके कि उन मूल्यों के साथ एक अतिप्रवाह नहीं होगा। प्रोग्रामिंग और डिज़ाइन को परीक्षण बनाने की आवश्यकता होगी जो सुनिश्चित करता है कि इनपुट मान अतिप्रवाह नहीं करेंगे और फिर यह निर्धारित करेंगे कि यदि इनपुट मान उत्पन्न होते हैं तो अतिप्रवाह का कारण क्या होगा।
अंकगणित में अंकगणितीय ऑपरेशन या अभिव्यक्ति करने के लिए एक बड़े आदिम प्रकार का उपयोग करना और फिर निर्धारित करना कि परिणामी मान एक पूर्णांक के लिए अधिकतम या न्यूनतम मान से परे है। उभार के साथ भी, यह अभी भी संभव है कि एक ऑपरेशन या अभिव्यक्ति में मूल्य या कुछ मध्यवर्ती मूल्य, अपस्टॉक प्रकार के लिए अधिकतम या न्यूनतम मूल्यों से परे होगा और अतिप्रवाह का कारण होगा, जिसका पता भी नहीं चलेगा और अप्रत्याशित और अवांछित परिणाम पैदा करेगा। विश्लेषण या पूर्व-स्थितियों के माध्यम से, अतिप्रवाह के साथ अतिप्रवाह को रोकने के लिए संभव हो सकता है जब उत्थान के बिना रोकथाम संभव या व्यावहारिक नहीं है। यदि प्रश्न में पूर्णांक पहले से ही लंबे आदिम प्रकार हैं, तो जावा में आदिम प्रकार के साथ उत्थान संभव नहीं है।
BigInteger तकनीक में BigInteger का उपयोग करने वाले पुस्तकालय के तरीकों का उपयोग करके अंकगणितीय ऑपरेशन या अभिव्यक्ति के लिए BigInteger का उपयोग करना शामिल है। BigInteger अतिप्रवाह नहीं करता है। यदि आवश्यक हो तो यह सभी उपलब्ध मेमोरी का उपयोग करेगा। इसके अंकगणितीय तरीके सामान्य रूप से पूर्णांक संचालन की तुलना में थोड़े कम कुशल होते हैं। यह अभी भी संभव है कि बिगइंटर का उपयोग करने वाला परिणाम पूर्णांक के लिए अधिकतम या न्यूनतम मानों से परे हो सकता है, हालांकि, परिणाम के लिए अग्रणी अंकगणित में अतिप्रवाह नहीं होगा। प्रोग्रामिंग और डिज़ाइन को अभी भी यह निर्धारित करने की आवश्यकता होगी कि यदि कोई BigInteger परिणाम वांछित आदिम परिणाम प्रकार, जैसे, int या लंबे समय के लिए अधिकतम या न्यूनतम मान से परे है, तो क्या करना है।
कार्नेगी मेलन सॉफ्टवेयर इंजीनियरिंग इंस्टीट्यूट के सीईआरटी कार्यक्रम और ओरेकल ने सुरक्षित जावा प्रोग्रामिंग के लिए मानकों का एक समूह बनाया है। मानकों में शामिल पूर्णांक अतिप्रवाह को रोकने और पता लगाने की तकनीकें हैं। मानक को यहां एक स्वतंत्र रूप से सुलभ ऑनलाइन संसाधन के रूप में प्रकाशित किया गया है: जावा के लिए सीईआरटी ओरेकल सिक्योर कोडिंग मानक
मानक खंड जो पूर्णांक अतिप्रवाह को रोकने या पता लगाने के लिए कोडिंग तकनीकों के व्यावहारिक उदाहरणों का वर्णन और समाहित करता है, यहां है: NUM00-J। पूर्णांक अतिप्रवाह का पता लगाना या रोकना
जावा के लिए सीईआरटी ओरेकल सिक्योर कोडिंग स्टैंडर्ड का बुक फॉर्म और पीडीएफ फॉर्म भी उपलब्ध है।