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

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

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

रेंज चेकिंग
रेंज चेकिंग एक जांच है जो यह सुनिश्चित करती है कि कोई संख्या एक निश्चित सीमा के भीतर है; उदाहरण के लिए, यह सुनिश्चित करने के लिए कि 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# असुरक्षित क्षेत्रों का भी समर्थन करता है: कोड के अनुभाग जो (अन्य बातों के अलावा) दक्षता बढ़ाने के लिए अस्थायी रूप से सीमा जांच को निलंबित कर देते हैं। ये पूरे प्रोग्राम की सुरक्षा से समझौता किए बिना समय-महत्वपूर्ण छोटी बाधाओं को तेज करने के लिए उपयोगी हैं।

रन टाइम चेकिंग को लागू करने वाली मुख्यधारा की भाषाओं में एडा (प्रोग्रामिंग भाषा), सी शार्प (प्रोग्रामिंग भाषा)|सी#, हास्केल (प्रोग्रामिंग भाषा), जावा (प्रोग्रामिंग भाषा), जावास्क्रिप्ट, लिस्प (प्रोग्रामिंग भाषा), पीएचपी, पायथन (प्रोग्रामिंग भाषा) सम्मिलित हैं।, रूबी (प्रोग्रामिंग भाषा), रस्ट (प्रोग्रामिंग भाषा), और मूल दृश्य D (प्रोग्रामिंग भाषा) और OCaml भाषाओं में समय सीमा की जाँच होती है जो कंपाइलर स्विच के साथ सक्षम या अक्षम होती है। C++ में रन टाइम चेकिंग भाषा का हिस्सा नहीं है, बल्कि मानक टेम्पलेट लाइब्रेरी का हिस्सा है और कंपाइलर स्विच (_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