बाउंडस चेकिंग

कंप्यूटर प्रोग्रामिंग में, बाउंडस चेकिंग (सीमा की जाँच) यह ज्ञात करने की एक विधि है कि क्या कोई चर उपयोग करने से पहले कुछ बाउंडस के अन्दर है। इसका उपयोग सामान्यतः यह सुनिश्चित करने के लिए किया जाता है कि कोई संख्या किसी दिए गए प्रकार (रेंज चेकिंग) में फिट होती है, या कि ऐरे इंडेक्स के रूप में उपयोग किया जा रहा एक चर ऐरे (इंडेक्स चेकिंग) की बाउंडस के भीतर है। विफल बाउंडस चेकिंग के परिणामस्वरूप सामान्यतः कुछ प्रकार के अपवाद संकेत उत्पन्न होते हैं।

क्योंकि प्रत्येक उपयोग के लिए बाउंडस चेकिंग में समय लग सकता है, यह हमेशा नहीं किया जाता है। बाउंडस-जांच उन्मूलन कंपाइलर अनुकूलन तकनीक है जो अनावश्यक बाउंडस चेकिंग को समाप्त करती है।

रेंज चेकिंग
रेंज चेकिंग एक जांच है जो यह सुनिश्चित करती है कि कोई संख्या एक निश्चित बाउंडस के भीतर है; उदाहरण के लिए, यह सुनिश्चित करने के लिए कि 16-बिट पूर्णांक को सौंपा जाने वाला मान 16-बिट पूर्णांक की क्षमता के भीतर है (अर्थात रैप-अराउंड के विरुद्ध जाँच करना)। यह टाइप चेकिंग के बिल्कुल समान नहीं है। अन्य श्रेणी की जाँचें अधिक प्रतिबंधात्मक हो सकती हैं; उदाहरण के लिए, कैलेंडर माह की संख्या रखने के लिए एकचर को केवल 1 से 12 तक की बाउंडस को स्वीकार करने के लिए घोषित किया जा सकता है।

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

इंडेक्स-चेकिंग क्षमता वाली प्रारंभिक संकलित प्रोग्रामिंग लैंग्वेज में ALGOL 60, ALGOL 68 और पास्कल के साथ-साथ BASIC जैसी व्याख्या की गई प्रोग्रामिंग लैंग्वेज सम्मिलित थीं।

कई प्रोग्रामिंग लैंग्वेज, जैसे C, गति बढ़ाने के लिए कभी भी स्वचालित बाउंडस चेकिंग नहीं करती हैं। हालाँकि, इससे कई बार-बार होने वाली त्रुटियाँ और बफ़र ओवरफ़्लो पकड़ में नहीं आते हैं। कई प्रोग्रामर का मानना है कि ये लैंग्वेज त्वरित निष्पादन के लिए बहुत अधिक समय लगता है। अपने 1980 के ट्यूरिंग अवार्ड व्याख्यान में, सी. ए. आर. होरे ने ALGOL 60 के डिजाइन में अपने अनुभव का वर्णन किया, ऐसी लैंग्वेज जिसमें बाउंडस चेकिंग सम्मिलित थी, उन्होंने कहा:"इस सिद्धांत का एक परिणाम यह है कि प्रत्येक सबस्क्रिप्टेड वेरिएबल की प्रत्येक सबस्क्रिप्ट की प्रत्येक घटना को प्रत्येक अवसर पर ऐरे के ऊपरी और निचले दोनों घोषित बाउंडस के विरुद्ध रन टाइम पर जांचा गया था। कई वर्षों बाद हमने अपने ग्राहकों से पूछा कि क्या वे चाहते हैं कि हम उत्पादन संचालन की दक्षता के हित में इन चेकों को बंद करने का विकल्प प्रदान करें। सर्वसम्मति से, उन्होंने हमसे ऐसा न करने का आग्रह किया - वे पहले से ही जानते थे कि उत्पादन संचालन में कितनी बार सबस्क्रिप्ट एरर होती हैं, जहाँ उनका पता लगाने में विफलता विनाशकारी हो सकती है। मैं भय और भय के साथ नोट करता हूं कि 1980 में भी, लैंग्वेज डिजाइनरों और उपयोगकर्ताओं ने यह सबक नहीं सीखा है। इंजीनियरिंग की किसी भी सम्मानजनक शाखा में, ऐसी प्राथमिक सावधानियों का पालन करने में विफलता लंबे समय तक नियम के विरूद्ध होती है।"रन टाइम चेकिंग लागू करने वाली मेनस्ट्रीम की लैंग्वेज में Ada, C#, हास्केल, जावा, जावास्क्रिप्ट, लिस्प, पीएचपी, पायथन, रूबी, रस्ट और विज़ुअल बेसिक सम्मिलित हैं। D और OCaml लैंग्वेज में समय बाउंडस जांच चल रही है जो कंपाइलर स्विच के साथ सक्षम या अक्षम है। C++ में रन टाइम चेकिंग लैंग्वेज का हिस्सा नहीं है, बल्कि STL का हिस्सा है और कंपाइलर स्विच (_GLIBCXX_DEBUG=1 या _LIBCPP_DEBUG=1) के साथ सक्षम है। C# असुरक्षित क्षेत्रों का भी समर्थन करता है: कोड के अनुभाग जो (अन्य बातों के अतिरिक्त) दक्षता बढ़ाने के लिए अस्थायी रूप से बाउंडस जांच को निलंबित कर देते हैं। ये पूरे प्रोग्राम की सुरक्षा से समझौता किए बिना समय-महत्वपूर्ण छोटी बाधाओं को तेज करने के लिए उपयोगी हैं।

JS++ प्रोग्रामिंग लैंग्वेज यह विश्लेषण करने में सक्षम है कि उपस्थित प्रकारों का उपयोग करके संकलन समय पर कोई ऐरे अनुक्रमणिका या मानचित्र की बाउंडस से बाहर है या नहीं, जो नाममात्र प्रकार है जो यह बताता है कि इंडेक्स या कुंजी बाउंडस के भीतर है या बाउंडस से बाहर है और कोड निर्माण का मार्गदर्शन करता है। उपस्थित प्रकारों को संकलन समय में केवल 1 एमएस ओवरहेड जोड़ने के लिए दिखाया गया है।

हार्डवेयर बाउंडस चेकिंग
यदि सॉफ़्टवेयर में जाँच की जाती है तो बाउंडस चेकिंग द्वारा जोड़ी गई सुरक्षा में आवश्यक रूप से CPU समय खर्च होता है; हालाँकि, यदि जाँच हार्डवेयर द्वारा की जा सकती है, तो सुरक्षा बिना किसी रनटाइम लागत के "मुफ़्त" प्रदान की जा सकती है। 1974 में घोषित आईसीएल 2900 सीरीज मेनफ्रेम हार्डवेयर बाउंडस चेकिंग करने वाली प्रारंभिक प्रणाली थी। VAX कंप्यूटर में ऐरे इंडेक्स चेकिंग के लिए INDEX असेंबली इंस्ट्रक्शन होता है, जिसमें छह ऑपरेंड लगते हैं, जिनमें से सभी किसी भी VAX एड्रेसिंग मोड का उपयोग कर सकते हैं। B6500 और इसी तरह के बरोज़ कंप्यूटरों ने हार्डवेयर के माध्यम से बाउंड चेकिंग की, भले ही मशीन कोड का उत्पादन करने के लिए किसी भी कंप्यूटर लैंग्वेज को संकलित किया गया हो। सीमित संख्या में बाद के सीपीयू में बाउंडस चेकिंग के लिए विशेष निर्देश हैं, उदाहरण के लिए, मोटोरोला 68000 श्रृंखला पर CHK2 निर्देश हैं।

ऐरे और बफर एक्सेस की सुरक्षा सुनिश्चित करने के लिए x86 की अंतर्निहित वर्चुअल मेमोरी प्रबंधन इकाई का उपयोग करने के तरीकों के संबंध में कम से कम 2005 से शोध चल रहा है। 2015 में इंटेल ने अपने स्काईलेक प्रोसेसर आर्किटेक्चर में अपने इंटेल एमपीएक्स एक्सटेंशन प्रदान किए जो सीपीयू रजिस्टर और मेमोरी में टेबल में बाउंडस को संग्रहीत करते हैं। 2017 के प्रारम्भ में कम से कम GCC MPX एक्सटेंशन का समर्थन करता है।

यह भी देखें

 * डायनामिक कोड एनालिसिस
 * रनटाइम एरर डिटेक्शन
 * स्टेटिक कोड एनालिसिस

संदर्भ
बाहरी संबंध
 * “On The Advantages Of Tagged Architecture”, IEEE Transactions On Computers, Volume C-22, Number 7, July, 1973.
 * “The Emperor’s Old Clothes ”, The 1980 ACM Turing Award Lecture, CACM volume 24 number 2, February 1981, pp 75–83.
 * “Bcc: Runtime checking for C programs”, Samuel C. Kendall, Proceedings of the USENIX Summer 1983 Conference.
 * “Bounds Checking for C”, Richard Jones and Paul Kelly, Imperial College, July 1995.
 * “ClearPath Enterprise Servers MCP Security Overview”, Unisys, April 2006.
 * “Secure Virtual Architecture: A Safe Execution Environment for Commodity Operating Systems”, John Criswell, Andrew Lenharth, Dinakar Dhurjati, Vikram Adve, SOSP'07 21st ACM Symposium on Operating Systems Principles, 2007.
 * “Fail-Safe C”, Yutaka Oiwa. Implementation of the Memory-safe Full ANSI-C Compiler. ACM SIGPLAN Conference on Programing Language Design and Implementations (PLDI2009), June 2009.
 * “address-sanitizer”, Timur Iskhodzhanov, Alexander Potapenko, Alexey Samsonov, Kostya Serebryany, Evgeniy Stepanov, Dmitriy Vyukov, LLVM Dev Meeting, November 18, 2011.
 * Safe C Library of Bounded APIs
 * Safe C API—Concise solution of buffer overflow, The OWASP Foundation, OWASP AppSec, Beijing 2011
 * The GNU C++ Library Manual Macros
 * libc++ 11.0 documentation Debug Mode
 * libc++ 11.0 documentation Debug Mode