नल पॉइंटर
कम्प्यूटिंग में, शून्य सूचक या शून्य संदर्भ यह इंगित करने के लिए सहेजा गया मान है कि सूचक (कंप्यूटर प्रोग्रामिंग) या संदर्भ (कंप्यूटर विज्ञान) वैध ऑब्जेक्ट (कंप्यूटर विज्ञान) को संदर्भित नहीं करता है। प्रोग्राम नियमित रूप से अज्ञात लंबाई की सूची (कंप्यूटिंग) के अंत या कुछ कार्रवाई करने में विफलता जैसी स्थितियों का प्रतिनिधित्व करने के लिए शून्य पॉइंटर्स का उपयोग करते हैं; अशक्त सूचकों के इस उपयोग की तुलना अशक्त प्रकारों और विकल्प प्रकार में कुछ नहीं मान से की जा सकती है।
अशक्त सूचक को अप्रारंभीकृत चर के साथ भ्रमित नहीं किया जाना चाहिए: अशक्त सूचक को किसी वैध वस्तु को इंगित करने वाले किसी भी सूचक के साथ असमान तुलना करने की गारंटी दी जाती है। हालाँकि, भाषा और कार्यान्वयन के आधार पर, अप्रारंभीकृत सूचक के पास ऐसी कोई गारंटी नहीं हो सकती है। इसकी तुलना अन्य, मान्य संकेतकों के बराबर हो सकती है; या इसकी तुलना शून्य सूचकों के बराबर हो सकती है। यह अलग-अलग समय पर दोनों कार्य कर सकता है; या तुलना अपरिभाषित व्यवहार हो सकती है।
क्योंकि शून्य सूचक किसी सार्थक वस्तु को इंगित नहीं करता है, उस (अमान्य) मेमोरी स्थान पर संग्रहीत डेटा तक पहुंचने का प्रयास रन-टाइम त्रुटि या तत्काल प्रोग्राम क्रैश का कारण बन सकता है। यह शून्य सूचक त्रुटि है. यह सबसे सामान्य प्रकार की सॉफ़्टवेयर कमज़ोरियों में से है,[1] और इस अवधारणा को पेश करने वाले टोनी होरे ने इसे अरब डॉलर की गलती के रूप में संदर्भित किया है।
सी
सी (प्रोग्रामिंग भाषा) में, किसी भी प्रकार के दो शून्य पॉइंटर्स की तुलना बराबर होने की गारंटी दी जाती है।[2] प्रीप्रोसेसर मैक्रो NULL में कार्यान्वयन-परिभाषित शून्य सूचक स्थिरांक के रूप में परिभाषित किया गया है <stdlib.h>,[3] जिसे C99 में पोर्टेबल रूप से व्यक्त किया जा सकता है ((void *)0) जिसका अर्थ है कि पूर्णांक मान 0 प्रकार में परिवर्तित किया गया void* (शून्य प्रकार का सूचक)।[4] सी मानक यह नहीं कहता है कि नल पॉइंटर स्मृति पता 0 के पॉइंटर के समान है, हालांकि व्यवहार में ऐसा हो सकता है। शून्य सूचक को असंदर्भित करना C में अपरिभाषित व्यवहार है,[5]और अनुरूप कार्यान्वयन को यह मानने की अनुमति है कि कोई भी सूचक जो कि संदर्भित है वह शून्य नहीं है।
व्यवहार में, शून्य पॉइंटर को डीरेफ़रेंस करने के परिणामस्वरूप स्मृति से पढ़ने या लिखने का प्रयास किया जा सकता है जो मैप नहीं किया गया है, जिससे विखंडन दोष या मेमोरी ्सेस उल्लंघन शुरू हो सकता है। यह स्वयं प्रोग्राम क्रैश के रूप में प्रकट हो सकता है, या सॉफ़्टवेयर अपवाद हैंडलिंग में परिवर्तित हो सकता है जिसे प्रोग्राम कोड द्वारा पकड़ा जा सकता है। हालाँकि, कुछ परिस्थितियाँ ऐसी हैं जहाँ ऐसा नहीं है। उदाहरण के लिए, Intel x86 वास्तविक मोड में, पता 0000:0000 पढ़ने योग्य है और आमतौर पर लिखने योग्य भी है, और उस पते पर पॉइंटर को डीरेफ़र करना पूरी तरह से वैध लेकिन आम तौर पर अवांछित कार्रवाई है जो एप्लिकेशन में अपरिभाषित लेकिन गैर-क्रैशिंग व्यवहार को जन्म दे सकती है। ऐसे अवसर होते हैं जब शून्य को संबोधित करने के लिए सूचक को डीरेफ़रेंस करना जानबूझकर और अच्छी तरह से परिभाषित किया जाता है; उदाहरण के लिए, 16-बिट रियल-मोड x86 डिवाइस के लिए C में लिखा गया BIOS कोड, लिखने के लिए नल पॉइंटर को डीरेफ़रेंस करके मशीन के भौतिक पते 0 पर इंटरप्ट डिस्क्रिप्टर तालिका (IDT) लिख सकता है। कंपाइलर के लिए शून्य पॉइंटर डेरेफ़रेंस को अनुकूलित करना, विभाजन दोष से बचना, लेकिन अन्य अवांछित व्यवहार का कारण बनना भी संभव है।[6]
सी++
C++ में, जबकि NULL मैक्रो को C से विरासत में मिला था, शून्य के लिए पूर्णांक शाब्दिक को पारंपरिक रूप से शून्य सूचक स्थिरांक का प्रतिनिधित्व करने के लिए प्राथमिकता दी गई है।[7] हालाँकि, C++11 ने स्पष्ट शून्य सूचक स्थिरांक प्रस्तुत किया nullptr और टाइप करें nullptr_t इसके स्थान पर उपयोग किया जाना है।
अन्य भाषाएँ
कुछ प्रोग्रामिंग भाषा परिवेशों में (उदाहरण के लिए, कम से कम मालिकाना लिस्प कार्यान्वयन),[citation needed] शून्य सूचक के रूप में उपयोग किया जाने वाला मान (जिसे कहा जाता है)। nil लिस्प (प्रोग्रामिंग भाषा) में) वास्तव में कार्यान्वयन के लिए उपयोगी आंतरिक डेटा के ब्लॉक के लिए सूचक हो सकता है (लेकिन उपयोगकर्ता कार्यक्रमों से स्पष्ट रूप से पहुंच योग्य नहीं है), इस प्रकार उसी रजिस्टर को उपयोगी स्थिरांक और पहुंच के त्वरित तरीके के रूप में उपयोग करने की अनुमति मिलती है कार्यान्वयन आंतरिक. इसे के नाम से जाना जाता है nil वेक्टर।
टैग किए टैग की गई वास्तुकला वाली भाषाओं में, संभवतः शून्य पॉइंटर को टैग किए टैग किया गया संघ से बदला जा सकता है जो असाधारण मामले की स्पष्ट हैंडलिंग को लागू करता है; वास्तव में, संभवतः शून्य सूचक को परिकलित टैग के साथ टैग किए गए सूचक के रूप में देखा जा सकता है।
प्रोग्रामिंग भाषाएं नल पॉइंटर के लिए अलग-अलग अक्षर का उपयोग करती हैं। उदाहरण के लिए, पायथन में, शून्य मान कहा जाता है None. पास्कल (प्रोग्रामिंग भाषा) और स्विफ्ट (प्रोग्रामिंग भाषा) में, नल पॉइंटर कहा जाता है nil. एफिल (प्रोग्रामिंग भाषा) में इसे a कहा जाता है void संदर्भ।
अशक्त भिन्नतािंग
क्योंकि शून्य सूचक किसी सार्थक वस्तु को इंगित नहीं करता है, अशक्त सूचक को डीरेफ़रेंस करने का प्रयास (यानी, उस मेमोरी स्थान पर संग्रहीत डेटा तक पहुंच) आमतौर पर (लेकिन हमेशा नहीं) रन-टाइम त्रुटि या तत्काल प्रोग्राम क्रैश का कारण बनता है। MITER नल पॉइंटर त्रुटि को सबसे अधिक उपयोग की जाने वाली सॉफ़्टवेयर कमज़ोरियों में से के रूप में सूचीबद्ध करता है।[8] * सी (प्रोग्रामिंग भाषा) में, नल पॉइंटर को डीरेफ़रेंस करना अपरिभाषित व्यवहार है।[5] कई कार्यान्वयन ऐसे कोड का कारण बनते हैं जिसके परिणामस्वरूप प्रोग्राम को ्सेस उल्लंघन के साथ रोक दिया जाता है, क्योंकि नल पॉइंटर प्रतिनिधित्व को ऐसे पते के रूप में चुना जाता है जिसे सिस्टम द्वारा वस्तुओं को संग्रहीत करने के लिए कभी भी आवंटित नहीं किया जाता है। हालाँकि, यह व्यवहार सार्वभौमिक नहीं है। इसकी भी गारंटी नहीं है, क्योंकि कंपाइलर्स को इस धारणा के तहत प्रोग्राम को अनुकूलित करने की अनुमति है कि वे अपरिभाषित व्यवहार से मुक्त हैं।
- डेल्फ़ी (प्रोग्रामिंग भाषा) और कई अन्य पास्कल कार्यान्वयन में, स्थिरांक
nilमेमोरी में पहले पते पर शून्य सूचक का प्रतिनिधित्व करता है जिसका उपयोग प्रबंधित चर को प्रारंभ करने के लिए भी किया जाता है। इसे डीरेफ़रेंस करने से बाहरी OS अपवाद उत्पन्न होता है जिसे पास्कल पर मैप किया जा रहा हैEAccessViolationअपवाद उदाहरण यदिSystem.SysUtilsइकाई उपयोग खंड में जुड़ी हुई है। - जावा (प्रोग्रामिंग भाषा) में, शून्य संदर्भ तक पहुंच ट्रिगर होती है
NullPointerException(एनपीई), जिसे त्रुटि प्रबंधन कोड द्वारा पकड़ा जा सकता है, लेकिन पसंदीदा अभ्यास यह सुनिश्चित करना है कि ऐसे अपवाद कभी न हों। - लिस्प_(प्रोग्रामिंग_भाषा) में,
nilप्रथम श्रेणी की वस्तु है। रिवाज के सन्दर्भ मे,(first nil)हैnil, जैसा है(rest nil). इसलिए डीरेफ़रेंसिंगnilइन संदर्भों में कोई त्रुटि नहीं होगी, लेकिन खराब लिखा गया कोड अनंत लूप में जा सकता है। - .Net (प्रोग्रामिंग भाषा)|.NET में, शून्य संदर्भ तक पहुंच ट्रिगर होती है
NullReferenceExceptionफेंका जाना। हालाँकि इन्हें पकड़ना आम तौर पर खराब अभ्यास माना जाता है, इस अपवाद प्रकार को प्रोग्राम द्वारा पकड़ा और नियंत्रित किया जा सकता है। - उद्देश्य सी में, संदेश भेजे जा सकते हैं
nilप्रोग्राम को बाधित किए बिना ऑब्जेक्ट (जो शून्य सूचक है); संदेश को आसानी से अनदेखा कर दिया जाता है, और वापसी मान (यदि कोई हो) हैnilया0, प्रकार पर निर्भर करता है।[9] - पर्यवेक्षक मोड पहुंच रोकथाम (एसएमएपी) की शुरुआत से पहले, शून्य पृष्ठ को हमलावर के पता स्थान में मैप करके नल पॉइंटर डेरेफ़रेंस बग का फायदा उठाया जा सकता था और इस प्रकार नल पॉइंटर उस क्षेत्र को इंगित कर सकता था। इससे कुछ मामलों में मनमाना कोड निष्पादन हो सकता है।[10]
शमन
नल पॉइंटर डेरेफ़रेंस को डीबग करने की सुविधा प्रदान करने वाली तकनीकें हैं।[11] बॉन्ड एट अल.[11]अशक्त प्रसार पर नज़र रखने के लिए जावा वर्चुअल मशीन (जेवीएम) को संशोधित करने का सुझाव दें।
कई दुभाषिया (कंप्यूटिंग) या वर्चुअल-मशीन भाषाओं में चलने वाली शुद्ध कार्यात्मक भाषाएं और उपयोगकर्ता कोड नल पॉइंटर डीरेफ़रेंसिंग की समस्या से ग्रस्त नहीं होते हैं, क्योंकि पॉइंटर्स तक कोई सीधी पहुंच प्रदान नहीं की जाती है और, शुद्ध कार्यात्मक भाषाओं के मामले में, सभी कोड और डेटा अपरिवर्तनीय है.
जहां कोई भाषा ऐसे पॉइंटर्स प्रदान या उपयोग करती है जो अन्यथा शून्य हो सकते हैं, स्थैतिक विश्लेषण या अन्य तकनीकों के माध्यम से संकलन-समय जांच प्रदान करके रनटाइम नल डेरेफ़रेंस को कम करना या उनसे बचना संभव हो सकता है, जैसे कि भाषा सुविधाओं से सिंटेक्टिक सहायता की ओर बढ़ते आंदोलन के साथ। जिन्हें एफिल प्रोग्रामिंग भाषा के आधुनिक संस्करणों में देखा गया है,[12] डी प्रोग्रामिंग भाषा,[13] और रस्ट प्रोग्रामिंग भाषा।[14] कुछ भाषाओं में बाहरी उपकरणों का उपयोग करके समान विश्लेषण किया जा सकता है।
इतिहास
2009 में, टोनी होरे ने कहा[15] उन्होंने 1965 में ALGOL W भाषा के भाग के रूप में शून्य संदर्भ का आविष्कार किया। 2009 के उस संदर्भ में होरे ने अपने आविष्कार को अरबों डॉलर की गलती के रूप में वर्णित किया है:
I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
यह भी देखें
- मेमोरी डिबगर
- शून्य पृष्ठ
संदर्भ
उद्धरण
- ↑ "CWE-476: NULL Pointer Dereference". MITRE.
- ↑ ISO/IEC 9899, clause 6.3.2.3, paragraph 4.
- ↑ ISO/IEC 9899, clause 7.17, paragraph 3: NULL... which expands to an implementation-defined null pointer constant...
- ↑ ISO/IEC 9899, clause 6.3.2.3, paragraph 3.
- ↑ 5.0 5.1 ISO/IEC 9899, clause 6.5.3.2, paragraph 4, esp. footnote 87.
- ↑ Lattner, Chris (2011-05-13). "What Every C Programmer Should Know About Undefined Behavior #1/3". blog.llvm.org (in English). Archived from the original on 2023-06-14. Retrieved 2023-06-14.
- ↑ Stroustrup, Bjarne (March 2001). "Chapter 5:
Theconstqualifier (§5.4) prevents accidental redefinition ofNULLand ensures thatNULLcan be used where a constant is required.". The C++ Programming Language (14th printing of 3rd ed.). United States and Canada: Addison–Wesley. p. 88. ISBN 0-201-88954-4. - ↑ "CWE-476: NULL Pointer Dereference". MITRE.
- ↑ The Objective-C 2.0 Programming Language, section "Sending Messages to nil".
- ↑ OS X exploitable kernel NULL pointer dereference in AppleGraphicsDeviceControl
- ↑ 11.0 11.1 Bond, Michael D.; Nethercote, Nicholas; Kent, Stephen W.; Guyer, Samuel Z.; McKinley, Kathryn S. (2007). "Tracking bad apples". Proceedings of the 22nd annual ACM SIGPLAN conference on Object oriented programming systems and applications - OOPSLA '07. p. 405. doi:10.1145/1297027.1297057. ISBN 9781595937865. S2CID 2832749.
- ↑ "Void-safety: Background, definition, and tools". Retrieved 2021-11-24.
- ↑ Bartosz Milewski. "SafeD – D Programming Language". Retrieved 17 July 2014.
- ↑ "Fearless Security: Memory Safety". Archived from the original on 8 November 2020. Retrieved 4 November 2020.
- ↑ Tony Hoare (2009-08-25). "Null References: The Billion Dollar Mistake". InfoQ.com.
स्रोत
- Joint Technical Committee ISO/IEC JTC 1, Subcommittee SC 22, Working Group WG 14 (2007-09-08). अंतर्राष्ट्रीय मानक आईएसओ/आईईसी 9899 (PDF) (Committee Draft).
{{cite book}}: CS1 maint: multiple names: authors list (link)
श्रेणी:डेटा प्रकार