बाउंडस चेकिंग: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|In programming, detecting whether a variable is within given bounds before use}} {{more footnotes|date=March 2012}} कंप्यूटर प्रो...")
 
No edit summary
 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Short description|In programming, detecting whether a variable is within given bounds before use}}
{{Short description|In programming, detecting whether a variable is within given bounds before use}}
{{more footnotes|date=March 2012}}
[[कंप्यूटर प्रोग्रामिंग]] में, '''बाउंडस चेकिंग''' (सीमा की जाँच) यह ज्ञात करने की एक विधि है कि क्या कोई चर उपयोग करने से पहले कुछ बाउंडस के अन्दर है। इसका उपयोग सामान्यतः यह सुनिश्चित करने के लिए किया जाता है कि कोई संख्या किसी दिए गए प्रकार (रेंज चेकिंग) में फिट होती है, या कि ऐरे इंडेक्स के रूप में उपयोग किया जा रहा एक चर ऐरे (इंडेक्स चेकिंग) की बाउंडस के भीतर है। विफल बाउंडस चेकिंग के परिणामस्वरूप सामान्यतः कुछ प्रकार के अपवाद संकेत उत्पन्न होते हैं।
[[कंप्यूटर प्रोग्रामिंग]] में, सीमा जांच यह पता लगाने की कोई विधि है कि कोई [[चर (प्रोग्रामिंग)]] उपयोग करने से पहले कुछ ऊपरी और निचली सीमाओं के भीतर है या नहीं। इसका उपयोग आम तौर पर यह सुनिश्चित करने के लिए किया जाता है कि कोई संख्या किसी दिए गए प्रकार (रेंज चेकिंग) में फिट बैठती है, या कि एक ऐरे डेटा संरचना इंडेक्स के रूप में उपयोग किया जा रहा एक वेरिएबल ऐरे (इंडेक्स चेकिंग) की सीमा के भीतर है। एक असफल सीमा जांच के परिणामस्वरूप आमतौर पर कुछ प्रकार के अपवाद हैंडलिंग सिग्नल उत्पन्न होते हैं।


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


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


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


सूचकांक जाँच क्षमता वाली आरंभिक संकलित प्रोग्रामिंग भाषाओं में [[ALGOL 60]], [[ALGOL 68]] और [[पास्कल (प्रोग्रामिंग भाषा)]] के साथ-साथ [[BASIC]] जैसी व्याख्या की गई प्रोग्रामिंग भाषाएँ शामिल थीं।
इंडेक्स-चेकिंग क्षमता वाली प्रारंभिक संकलित प्रोग्रामिंग लैंग्वेज में [[ALGOL 60]], [[ALGOL 68]] और [[पास्कल (प्रोग्रामिंग भाषा)|पास्कल]] के साथ-साथ [[BASIC]] जैसी व्याख्या की गई प्रोग्रामिंग लैंग्वेज सम्मिलित थीं।


कई प्रोग्रामिंग भाषाएं, जैसे [[सी (प्रोग्रामिंग भाषा)]], गति बढ़ाने के लिए कभी भी स्वचालित सीमा जांच नहीं करती हैं। हालाँकि, इससे एक-एक करके कई त्रुटियाँ और बफ़र ओवरफ़्लो पकड़ में नहीं आते हैं। कई प्रोग्रामर मानते हैं कि ये भाषाएँ तेजी से निष्पादन के लिए बहुत अधिक त्याग करती हैं।<ref>{{Cite book |doi=10.1109/DISCEX.2000.821514|chapter=Buffer overflows: Attacks and defenses for the vulnerability of the decade|title=कार्यवाही DARPA सूचना उत्तरजीविता सम्मेलन और प्रदर्शनी। डिस्केक्स'00|volume=2|pages=119–129|year=1999|last1=Cowan|first1=C|last2=Wagle|first2=F|last3=Calton Pu|last4=Beattie|first4=S|last5=Walpole|first5=J|isbn=978-0-7695-0490-2|s2cid=167759976}}</ref> अपने 1980 के [[ ट्यूरिंग पुरस्कार ]] व्याख्यान में, सी. ए. आर. होरे ने ALGOL 60 के डिज़ाइन में अपने अनुभव का वर्णन किया, एक ऐसी भाषा जिसमें सीमा जाँच शामिल थी, उन्होंने कहा:
कई प्रोग्रामिंग लैंग्वेज, जैसे C, गति बढ़ाने के लिए कभी भी स्वचालित बाउंडस चेकिंग नहीं करती हैं। हालाँकि, इससे कई बार-बार होने वाली त्रुटियाँ और बफ़र ओवरफ़्लो पकड़ में नहीं आते हैं। कई प्रोग्रामर का मानना है कि ये लैंग्वेज त्वरित निष्पादन के लिए बहुत अधिक समय लगता है।<ref>{{Cite book |doi=10.1109/DISCEX.2000.821514|chapter=Buffer overflows: Attacks and defenses for the vulnerability of the decade|title=कार्यवाही DARPA सूचना उत्तरजीविता सम्मेलन और प्रदर्शनी। डिस्केक्स'00|volume=2|pages=119–129|year=1999|last1=Cowan|first1=C|last2=Wagle|first2=F|last3=Calton Pu|last4=Beattie|first4=S|last5=Walpole|first5=J|isbn=978-0-7695-0490-2|s2cid=167759976}}</ref> अपने 1980 के ट्यूरिंग अवार्ड व्याख्यान में, सी. ए. आर. होरे ने ALGOL 60 के डिजाइन में अपने अनुभव का वर्णन किया, ऐसी लैंग्वेज जिसमें बाउंडस चेकिंग सम्मिलित थी, उन्होंने कहा:<blockquote>इस सिद्धांत का एक परिणाम यह है कि प्रत्येक सबस्क्रिप्टेड वेरिएबल की प्रत्येक सबस्क्रिप्ट की प्रत्येक घटना को प्रत्येक अवसर पर ऐरे के ऊपरी और निचले दोनों घोषित बाउंडस के विरुद्ध रन टाइम पर जांचा गया था। कई वर्षों बाद हमने अपने ग्राहकों से पूछा कि क्या वे चाहते हैं कि हम उत्पादन संचालन की दक्षता के हित में इन चेकों को बंद करने का विकल्प प्रदान करें। सर्वसम्मति से, उन्होंने हमसे ऐसा न करने का आग्रह किया - वे पहले से ही जानते थे कि उत्पादन संचालन में कितनी बार सबस्क्रिप्ट एरर होती हैं, जहाँ उनका पता लगाने में विफलता विनाशकारी हो सकती है। मैं भय और भय के साथ नोट करता हूं कि 1980 में भी, लैंग्वेज डिजाइनरों और उपयोगकर्ताओं ने यह सबक नहीं सीखा है। इंजीनियरिंग की किसी भी सम्मानजनक शाखा में, ऐसी प्राथमिक सावधानियों का पालन करने में विफलता लंबे समय तक नियम के विरूद्ध होती है।</blockquote>रन टाइम चेकिंग लागू करने वाली मेनस्ट्रीम की लैंग्वेज में Ada, C#, [[हास्केल (प्रोग्रामिंग भाषा)|हास्केल]], [[जावा (प्रोग्रामिंग भाषा)|जावा]], [[जावास्क्रिप्ट]], [[लिस्प (प्रोग्रामिंग भाषा)|लिस्प]], [[पीएचपी]], [[पायथन (प्रोग्रामिंग भाषा)|पायथन]], रूबी, रस्ट और विज़ुअल बेसिक सम्मिलित हैं। D और [[OCaml]] लैंग्वेज में समय बाउंडस जांच चल रही है जो कंपाइलर स्विच के साथ सक्षम या अक्षम है। [[C++]] में रन टाइम चेकिंग लैंग्वेज का हिस्सा नहीं है, बल्कि STL का हिस्सा है और कंपाइलर स्विच (_GLIBCXX_DEBUG=1 या _LIBCPP_DEBUG=1) के साथ सक्षम है। C# असुरक्षित क्षेत्रों का भी समर्थन करता है: कोड के अनुभाग जो (अन्य बातों के अतिरिक्त) दक्षता बढ़ाने के लिए अस्थायी रूप से बाउंडस जांच को निलंबित कर देते हैं। ये पूरे प्रोग्राम की सुरक्षा से समझौता किए बिना समय-महत्वपूर्ण छोटी बाधाओं को तेज करने के लिए उपयोगी हैं।


<ब्लॉककोट>इस सिद्धांत का एक परिणाम यह है कि प्रत्येक सबस्क्रिप्टेड वेरिएबल की प्रत्येक सबस्क्रिप्ट की प्रत्येक घटना को हर अवसर पर सरणी की ऊपरी और निचली दोनों घोषित सीमाओं के विरुद्ध रन टाइम पर जांचा जाता था। कई वर्षों के बाद हमने अपने ग्राहकों से पूछा कि क्या वे चाहते हैं कि हम उत्पादन संचालन में दक्षता के हित में इन चेकों को बंद करने का विकल्प प्रदान करें। सर्वसम्मति से, उन्होंने हमसे ऐसा न करने का आग्रह किया - वे पहले से ही जानते थे कि उत्पादन में कितनी बार सबस्क्रिप्ट त्रुटियां होती हैं, जहां उनका पता लगाने में विफलता विनाशकारी हो सकती है। मैं डर और भय के साथ नोट करता हूं कि 1980 में भी, भाषा डिजाइनरों और उपयोगकर्ताओं ने यह सबक नहीं सीखा है। इंजीनियरिंग की किसी भी सम्मानित शाखा में, ऐसी प्राथमिक सावधानियों का पालन करने में विफलता लंबे समय तक कानून के खिलाफ होती।</ब्लॉककोट>
[[JS++]] प्रोग्रामिंग लैंग्वेज यह विश्लेषण करने में सक्षम है कि उपस्थित प्रकारों का उपयोग करके संकलन समय पर कोई ऐरे अनुक्रमणिका या मानचित्र की बाउंडस से बाहर है या नहीं, जो नाममात्र प्रकार है जो यह बताता है कि इंडेक्स या कुंजी बाउंडस के भीतर है या बाउंडस से बाहर है और कोड निर्माण का मार्गदर्शन करता है। उपस्थित प्रकारों को संकलन समय में केवल 1 एमएस ओवरहेड जोड़ने के लिए दिखाया गया है।<ref>{{Cite web | url=https://www.onux.com/jspp/blog/jspp-0-9-0-efficient-compile-time-analysis-of-out-of-bounds-errors/ | archive-url=https://web.archive.org/web/20190112060200/https://www.onux.com/jspp/blog/jspp-0-9-0-efficient-compile-time-analysis-of-out-of-bounds-errors/| archive-date=2019-01-12| title=JS++ 0.9.0: Efficient Compile Time Analysis of Out-of-Bounds Errors – JS++ Blog}}</ref>
== हार्डवेयर बाउंडस चेकिंग ==


रन टाइम चेकिंग को लागू करने वाली मुख्यधारा की भाषाओं में [[एडा (प्रोग्रामिंग भाषा)]], सी शार्प (प्रोग्रामिंग भाषा)|सी#, [[हास्केल (प्रोग्रामिंग भाषा)]], [[जावा (प्रोग्रामिंग भाषा)]], [[जावास्क्रिप्ट]], [[लिस्प (प्रोग्रामिंग भाषा)]], [[पीएचपी]], [[पायथन (प्रोग्रामिंग भाषा)]] शामिल हैं। , [[रूबी (प्रोग्रामिंग भाषा)]], रस्ट (प्रोग्रामिंग भाषा), और [[मूल दृश्य]] D (प्रोग्रामिंग भाषा) और [[OCaml]] भाषाओं में समय सीमा की जाँच होती है जो कंपाइलर स्विच के साथ सक्षम या अक्षम होती है। [[C++]] में रन टाइम चेकिंग भाषा का हिस्सा नहीं है, बल्कि [[मानक टेम्पलेट लाइब्रेरी]] का हिस्सा है और एक कंपाइलर स्विच (_GLIBCXX_DEBUG=1 या _LIBCPP_DEBUG=1) के साथ सक्षम है। C# असुरक्षित क्षेत्रों का भी समर्थन करता है: कोड के अनुभाग जो (अन्य बातों के अलावा) दक्षता बढ़ाने के लिए सीमा जांच को अस्थायी रूप से निलंबित कर देते हैं। ये पूरे कार्यक्रम की सुरक्षा से समझौता किए बिना छोटी समय-महत्वपूर्ण बाधाओं को तेज करने के लिए उपयोगी हैं।
यदि सॉफ़्टवेयर में जाँच की जाती है तो बाउंडस चेकिंग द्वारा जोड़ी गई सुरक्षा में आवश्यक रूप से CPU समय खर्च होता है; हालाँकि, यदि जाँच हार्डवेयर द्वारा की जा सकती है, तो सुरक्षा बिना किसी रनटाइम लागत के "मुफ़्त" प्रदान की जा सकती है। 1974 में घोषित आईसीएल 2900 सीरीज मेनफ्रेम हार्डवेयर बाउंडस चेकिंग करने वाली प्रारंभिक प्रणाली थी।<ref>{{cite book |pages=17, 77 |url=http://www.fujitsu.com/uk/Images/icl-2900-series-by-jk-buckle.pdf |title=The ICL 2900 Series |author=J. K. Buckle |publisher=Macmillan Computer Science Series |year=1978 |isbn=978-0-333-21917-1 |access-date=20 April 2018 |archive-date=20 April 2018 |archive-url=https://web.archive.org/web/20180420203006/http://www.fujitsu.com/uk/Images/icl-2900-series-by-jk-buckle.pdf |url-status=dead }}</ref> [[VAX]] कंप्यूटर में ऐरे इंडेक्स चेकिंग के लिए INDEX असेंबली इंस्ट्रक्शन होता है, जिसमें छह ऑपरेंड लगते हैं, जिनमें से सभी किसी भी VAX एड्रेसिंग मोड का उपयोग कर सकते हैं। B6500 और इसी तरह के बरोज़ कंप्यूटरों ने हार्डवेयर के माध्यम से बाउंड चेकिंग की, भले ही मशीन कोड का उत्पादन करने के लिए किसी भी कंप्यूटर लैंग्वेज को संकलित किया गया हो। सीमित संख्या में बाद के सीपीयू में बाउंडस चेकिंग के लिए विशेष निर्देश हैं, उदाहरण के लिए, मोटोरोला 68000 श्रृंखला पर CHK2 निर्देश हैं।


[[JS++]] प्रोग्रामिंग भाषा मौजूदा प्रकारों का उपयोग करके यह विश्लेषण करने में सक्षम है कि क्या कोई सरणी सूचकांक या मानचित्र कुंजी संकलन समय पर सीमा से बाहर है, जो एक [[नाममात्र प्रकार की प्रणाली]] है जो यह बताती है कि सूचकांक या कुंजी सीमा के भीतर है या सीमा से बाहर है। और कोड जनरेशन का मार्गदर्शन करता है। मौजूदा प्रकारों को संकलन समय में केवल 1ms ओवरहेड जोड़ने के लिए दिखाया गया है।<ref>{{Cite web | url=https://www.onux.com/jspp/blog/jspp-0-9-0-efficient-compile-time-analysis-of-out-of-bounds-errors/ | archive-url=https://web.archive.org/web/20190112060200/https://www.onux.com/jspp/blog/jspp-0-9-0-efficient-compile-time-analysis-of-out-of-bounds-errors/| archive-date=2019-01-12| title=JS++ 0.9.0: Efficient Compile Time Analysis of Out-of-Bounds Errors – JS++ Blog}}</ref>
ऐरे और बफर एक्सेस की सुरक्षा सुनिश्चित करने के लिए x86 की अंतर्निहित वर्चुअल मेमोरी प्रबंधन इकाई का उपयोग करने के तरीकों के संबंध में कम से कम 2005 से शोध चल रहा है।<ref>{{Cite book | doi=10.1109/DSN.2005.25| chapter=Checking Array Bound Violation Using Segmentation Hardware| title=2005 International Conference on Dependable Systems and Networks (DSN'05)| pages=388–397| year=2005| last1=Lap-Chung Lam| last2=Tzi-Cker Chiueh| isbn=0-7695-2282-3| s2cid=6278708}}</ref> 2015 में इंटेल ने अपने [[स्काईलेक (माइक्रोआर्किटेक्चर)|स्काईलेक]] प्रोसेसर आर्किटेक्चर में अपने [[इंटेल एमपीएक्स]] एक्सटेंशन प्रदान किए जो सीपीयू रजिस्टर और मेमोरी में टेबल में बाउंडस को संग्रहीत करते हैं। 2017 के प्रारम्भ में कम से कम GCC MPX एक्सटेंशन का समर्थन करता है।


== यह भी देखें ==


== हार्डवेयर सीमा जाँच ==
* डायनामिक कोड एनालिसिस
 
* रनटाइम एरर डिटेक्शन
यदि जाँच सॉफ़्टवेयर में की जाती है तो सीमा जाँच द्वारा जोड़ी गई सुरक्षा में आवश्यक रूप से CPU समय खर्च होता है; हालाँकि, यदि जाँच हार्डवेयर द्वारा की जा सकती है, तो बिना किसी रनटाइम लागत के सुरक्षा निःशुल्क प्रदान की जा सकती है। हार्डवेयर सीमा जाँच वाली एक प्रारंभिक प्रणाली 1974 में घोषित [[आईसीएल 2900 सीरीज]] मेनफ्रेम थी।<ref>{{cite book |pages=17, 77 |url=http://www.fujitsu.com/uk/Images/icl-2900-series-by-jk-buckle.pdf |title=The ICL 2900 Series |author=J. K. Buckle |publisher=Macmillan Computer Science Series |year=1978 |isbn=978-0-333-21917-1 |access-date=20 April 2018 |archive-date=20 April 2018 |archive-url=https://web.archive.org/web/20180420203006/http://www.fujitsu.com/uk/Images/icl-2900-series-by-jk-buckle.pdf |url-status=dead }}</ref> [[VAX]] कंप्यूटर में ऐरे इंडेक्स जाँच के लिए एक INDEX असेंबली निर्देश होता है जिसमें छह ऑपरेंड लगते हैं, जिनमें से सभी किसी भी VAX एड्रेसिंग मोड का उपयोग कर सकते हैं। B6500 और इसी तरह के [[बरोज़ कॉर्पोरेशन]] कंप्यूटरों ने हार्डवेयर के माध्यम से बाउंड चेकिंग की, भले ही मशीन कोड का उत्पादन करने के लिए किसी भी कंप्यूटर भाषा को संकलित किया गया हो। सीमित संख्या में बाद के [[ CPU ]] में सीमाओं की जांच के लिए विशेष निर्देश हैं, उदाहरण के लिए, मोटोरोला 68000#इंटरप्ट्स श्रृंखला पर सीएचके2 निर्देश।
* स्टेटिक कोड एनालिसिस
 
ऐरे और बफर एक्सेस की सुरक्षा सुनिश्चित करने के लिए x86 की अंतर्निहित वर्चुअल मेमोरी प्रबंधन इकाई का उपयोग करने के तरीकों के संबंध में कम से कम 2005 से अनुसंधान चल रहा है।<ref>{{Cite book | doi=10.1109/DSN.2005.25| chapter=Checking Array Bound Violation Using Segmentation Hardware| title=2005 International Conference on Dependable Systems and Networks (DSN'05)| pages=388–397| year=2005| last1=Lap-Chung Lam| last2=Tzi-Cker Chiueh| isbn=0-7695-2282-3| s2cid=6278708}}</ref> 2015 में इंटेल ने अपने [[स्काईलेक (माइक्रोआर्किटेक्चर)]] प्रोसेसर आर्किटेक्चर में [[इंटेल एमपीएक्स]] एक्सटेंशन प्रदान किया जो सीपीयू रजिस्टर और मेमोरी में टेबल में सीमाओं को संग्रहीत करता है। 2017 की शुरुआत में कम से कम जीसीसी एमपीएक्स एक्सटेंशन का समर्थन करता है।
 
== यह भी देखें ==
* [[गतिशील कोड विश्लेषण]]
* [[रनटाइम त्रुटि का पता लगाना]]
* [[स्थैतिक कार्यक्रम विश्लेषण]]


==संदर्भ==
==संदर्भ==
{{Reflist}}
{{Reflist}}


 
बाहरी संबंध
== बाहरी संबंध ==
 
* “[https://web.archive.org/web/20160623195112/http://www.feustel.us/Feustel%20%26%20Associates/Advantages.pdf On The Advantages Of Tagged Architecture]”, IEEE Transactions On Computers, Volume C-22, Number 7, July, 1973.
* “[https://web.archive.org/web/20160623195112/http://www.feustel.us/Feustel%20%26%20Associates/Advantages.pdf On The Advantages Of Tagged Architecture]”, IEEE Transactions On Computers, Volume C-22, Number 7, July, 1973.
* “[http://zoo.cs.yale.edu/classes/cs422/2011/bib/hoare81emperor.pdf The Emperor’s Old Clothes] {{Webarchive|url=https://web.archive.org/web/20171002195604/http://zoo.cs.yale.edu/classes/cs422/2011/bib/hoare81emperor.pdf |date=2017-10-02 }}”, The 1980 ACM Turing Award Lecture, CACM volume 24 number 2, February 1981, pp 75–83.
* “[http://zoo.cs.yale.edu/classes/cs422/2011/bib/hoare81emperor.pdf The Emperor’s Old Clothes] {{Webarchive|url=https://web.archive.org/web/20171002195604/http://zoo.cs.yale.edu/classes/cs422/2011/bib/hoare81emperor.pdf |date=2017-10-02 }}”, The 1980 ACM Turing Award Lecture, CACM volume 24 number 2, February 1981, pp 75–83.
Line 53: Line 45:
* [https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html libc++ 11.0 documentation Debug Mode]
* [https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html libc++ 11.0 documentation Debug Mode]


{{DEFAULTSORT:Bounds Checking}}[[Category: कंप्यूटर त्रुटियाँ]] [[Category: सरणियों]]
{{DEFAULTSORT:Bounds Checking}}
 
 


[[Category: Machine Translated Page]]
[[Category:Created On 09/08/2023|Bounds Checking]]
[[Category:Created On 09/08/2023]]
[[Category:Lua-based templates|Bounds Checking]]
[[Category:Machine Translated Page|Bounds Checking]]
[[Category:Pages with script errors|Bounds Checking]]
[[Category:Short description with empty Wikidata description|Bounds Checking]]
[[Category:Templates Vigyan Ready|Bounds Checking]]
[[Category:Templates that add a tracking category|Bounds Checking]]
[[Category:Templates that generate short descriptions|Bounds Checking]]
[[Category:Templates using TemplateData|Bounds Checking]]
[[Category:Webarchive template wayback links|Bounds Checking]]
[[Category:कंप्यूटर त्रुटियाँ|Bounds Checking]]
[[Category:सरणियों|Bounds Checking]]

Latest revision as of 09:42, 23 August 2023

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

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

रेंज चेकिंग

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

इंडेक्स चेकिंग (इंडेक्स चेकिंग)

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

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

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

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

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

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

हार्डवेयर बाउंडस चेकिंग

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

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

यह भी देखें

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

संदर्भ

  1. Cowan, C; Wagle, F; Calton Pu; Beattie, S; Walpole, J (1999). "Buffer overflows: Attacks and defenses for the vulnerability of the decade". कार्यवाही DARPA सूचना उत्तरजीविता सम्मेलन और प्रदर्शनी। डिस्केक्स'00. Vol. 2. pp. 119–129. doi:10.1109/DISCEX.2000.821514. ISBN 978-0-7695-0490-2. S2CID 167759976.
  2. "JS++ 0.9.0: Efficient Compile Time Analysis of Out-of-Bounds Errors – JS++ Blog". Archived from the original on 2019-01-12.
  3. J. K. Buckle (1978). The ICL 2900 Series (PDF). Macmillan Computer Science Series. pp. 17, 77. ISBN 978-0-333-21917-1. Archived from the original (PDF) on 20 April 2018. Retrieved 20 April 2018.
  4. Lap-Chung Lam; Tzi-Cker Chiueh (2005). "Checking Array Bound Violation Using Segmentation Hardware". 2005 International Conference on Dependable Systems and Networks (DSN'05). pp. 388–397. doi:10.1109/DSN.2005.25. ISBN 0-7695-2282-3. S2CID 6278708.

बाहरी संबंध