अशक्त-समाप्त स्ट्रिंग (नल्ल-टर्मिनेटेड स्ट्रिंग)
कंप्यूटर प्रोग्रामिंग में, एक अशक्त-समाप्त स्ट्रिंग एक वर्ण स्ट्रिंग है जिसे एक सरणी डेटा संरचना के रूप में संग्रहीत किया जाता है जिसमें वर्ण होते हैं और एक अशक्त वर्ण (शून्य के मान वाला एक वर्ण, जिसे इस लेख में NUL कहा जाता है) के साथ समाप्त होता है। वैकल्पिक नाम सी स्ट्रिंग हैं, जो सी (प्रोग्रामिंग भाषा) और एएससीआईआईजेड को संदर्भित करता है[citation needed] (हालाँकि C ASCII के अलावा अन्य एन्कोडिंग का उपयोग कर सकता है)।
(पहले) एनयूएल की खोज करके एक स्ट्रिंग की लंबाई पाई जाती है। यह धीमा हो सकता है क्योंकि इसमें स्ट्रिंग की लंबाई के संबंध में O(n) (रैखिक समय) लगता है। इसका अर्थ यह भी है कि स्ट्रिंग में एनयूएल नहीं हो सकता है (स्मृति में एनयूएल है, लेकिन यह अंतिम वर्ण के बाद है, स्ट्रिंग में नहीं)।
इतिहास
अशक्त-समाप्त स्ट्रिंग्स द्वारा निर्मित किए गए थे .ASCIZ
पीडीपी-11 विधानसभा भाषाओं के निर्देश और ASCIZ
PDP-10 के लिए MACRO-10 मैक्रो असेंबली लैंग्वेज का निर्देश। ये सी प्रोग्रामिंग भाषा के विकास से पहले के हैं, लेकिन तार के अन्य रूपों का अक्सर उपयोग किया जाता था।
उस समय सी (और जिन भाषाओं से इसे प्राप्त किया गया था) विकसित किया गया था, मेमोरी बेहद सीमित थी, इसलिए एक स्ट्रिंग की लंबाई को स्टोर करने के लिए ओवरहेड के केवल एक बाइट का उपयोग करना आकर्षक था। उस समय का एकमात्र लोकप्रिय विकल्प, जिसे आमतौर पर पास्कल स्ट्रिंग कहा जाता है (एक अधिक आधुनिक शब्द है स्ट्रिंग (कंप्यूटर विज्ञान) #Length-prefixed|length-prefixed), स्ट्रिंग की लंबाई को स्टोर करने के लिए एक अग्रणी बाइट का उपयोग करता है। यह स्ट्रिंग को एनयूएल रखने की अनुमति देता है और पहले से संग्रहीत स्ट्रिंग की लंबाई को खोजने के लिए केवल एक मेमोरी एक्सेस (ओ (1) निरंतर समय | (स्थिर) समय) की आवश्यकता होती है, लेकिन स्ट्रिंग की लंबाई 255 वर्णों तक सीमित होती है (मशीन पर 8- बिट बाइट्स)। सी डिजाइनर डेनिस रिची ने एक स्ट्रिंग की लंबाई पर सीमा से बचने के लिए अशक्त-समाप्ति के सम्मेलन का पालन करना चुना और क्योंकि गिनती को बनाए रखना, उनके अनुभव में, टर्मिनेटर का उपयोग करने से कम सुविधाजनक था।[1][2] सीपीयू निर्देश समुच्चय डिज़ाइन पर इसका कुछ प्रभाव पड़ा। 1970 और 1980 के दशक में कुछ CPU, जैसे कि Zilog Z80 और डिजिटल उपकरण निगम VAX, ने लंबाई-प्रीफिक्स्ड स्ट्रिंग्स को संभालने के लिए समर्पित निर्देश दिए थे। हालांकि, जैसे-जैसे अशक्त-टर्मिनेटेड स्ट्रिंग ने कर्षण प्राप्त किया, सीपीयू डिजाइनरों ने इसे ध्यान में रखना शुरू कर दिया, जैसा कि उदाहरण के लिए IBM के 1992 में IBM ES/9000 परिवार | ES/9000 520 में लॉजिकल स्ट्रिंग असिस्ट निर्देश जोड़ने के निर्णय में देखा गया था। 2015 में IBM z13 (माइक्रोप्रोसेसर) को वेक्टर स्ट्रिंग निर्देश।[3] FreeBSD डेवलपर Poul-Henning Kamp, ACM Queue में लिखते हुए, 2-बाइट (एक-बाइट नहीं) लंबाई पर नल-टर्मिनेटेड स्ट्रिंग्स की जीत को अब तक की सबसे महंगी एक-बाइट गलती के रूप में संदर्भित करता है।[4]
सीमाएं
लागू करने में सरल होने के बावजूद, यह प्रतिनिधित्व त्रुटियों और प्रदर्शन समस्याओं से ग्रस्त रहा है।
अशक्त-समाप्ति ने ऐतिहासिक रूप से कंप्यूटर असुरक्षा पैदा की है।[5] एक स्ट्रिंग के बीच में डाला गया एक एनयूएल इसे अप्रत्याशित रूप से छोटा कर देगा।[6] एक सामान्य बग एनयूएल के लिए अतिरिक्त स्थान आवंटित नहीं करना था, इसलिए इसे सन्निकट मेमोरी पर लिखा गया था। एक और एनयूएल को बिल्कुल नहीं लिखना था, जिसे अक्सर परीक्षण के दौरान पता नहीं चला था क्योंकि मेमोरी के ब्लॉक में पहले से ही शून्य था। लंबाई खोजने के खर्च के कारण, कई प्रोग्राम स्ट्रिंग को एक निश्चित आकार के डेटा बफ़र में कॉपी करने से पहले परेशान नहीं करते थे, जिससे बफ़र अधिकता हो जाता था यदि यह बहुत लंबा था।
शून्य को स्टोर करने में असमर्थता के लिए आवश्यक है कि पाठ और बाइनरी डेटा को अलग-अलग रखा जाए और विभिन्न कार्यों द्वारा नियंत्रित किया जाए (बाद वाले को डेटा की लंबाई की भी आवश्यकता होती है)। गलत फ़ंक्शन का उपयोग करने पर यह कोड अतिरेक और त्रुटियों का कारण बन सकता है।
लंबाई खोजने के साथ गति की समस्याओं को आम तौर पर ओ (एन) जैसे किसी अन्य ऑपरेशन के साथ जोड़कर कम किया जा सकता है, जैसे कि strlcpy
. हालांकि, यह हमेशा एक सहज ज्ञान युक्त एपीआई में परिणत नहीं होता है।
कैरेक्टर एनकोडिंग
अशक्त-समाप्त स्ट्रिंग्स के लिए आवश्यक है कि एन्कोडिंग कहीं भी शून्य बाइट (0x00) का उपयोग न करे; इसलिए हर संभव ASCII या UTF-8 स्ट्रिंग को स्टोर करना संभव नहीं है।[7][8][9] हालाँकि, ASCII या UTF-8 के सबसेट को स्टोर करना आम है - NUL को छोड़कर हर कैरेक्टर - नल-टर्मिनेटेड स्ट्रिंग्स में। कुछ प्रणालियाँ संशोधित UTF-8 का उपयोग करती हैं जो NUL को दो गैर-शून्य बाइट्स (0xC0, 0x80) के रूप में एन्कोड करता है और इस प्रकार सभी संभावित स्ट्रिंग्स को संग्रहीत करने की अनुमति देता है। UTF-8 मानक द्वारा इसकी अनुमति नहीं है, क्योंकि यह UTF-8#Overlong एन्कोडिंग है, और इसे सुरक्षा जोखिम के रूप में देखा जाता है। इसके बजाय स्ट्रिंग के अंत के रूप में कुछ अन्य बाइट का उपयोग किया जा सकता है, जैसे 0xFE या 0xFF, जिनका उपयोग UTF-8 में नहीं किया जाता है।
UTF-16 2-बाइट पूर्णांकों का उपयोग करता है और या तो बाइट शून्य हो सकता है (और वास्तव में ASCII पाठ का प्रतिनिधित्व करते समय प्रत्येक अन्य बाइट है), एक अशक्त-समाप्त बाइट स्ट्रिंग में संग्रहीत नहीं किया जा सकता है। हालाँकि, कुछ भाषाएँ 16-बिट UTF-16 वर्णों की एक स्ट्रिंग को लागू करती हैं, जिसे 16-बिट NUL (0x0000) द्वारा समाप्त किया जाता है।
सुधार
सी स्ट्रिंग को कम त्रुटि प्रवण बनाने के कई प्रयास किए गए हैं। एक रणनीति सुरक्षित कार्यों को जोड़ना है जैसे strdup
और strlcpy
, जबकि C मानक लाइब्रेरी # बफ़र अतिप्रवाह भेद्यताएँ जैसे gets
. दूसरा सी स्ट्रिंग्स के चारों ओर ऑब्जेक्ट उन्मुख रैपर जोड़ना है ताकि केवल सुरक्षित कॉल किया जा सके। हालांकि, असुरक्षित कार्यों को वैसे भी कॉल करना संभव है।
अधिकांश आधुनिक पुस्तकालय सी स्ट्रिंग्स को एक 32-बिट या बड़े लंबाई मान (लंबाई-प्रीफ़िक्स्ड स्ट्रिंग्स के लिए पहले से कहीं अधिक माना जाता है) वाली संरचना के साथ प्रतिस्थापित करते हैं, और रूपांतरण को गति देने के लिए अक्सर एक अन्य सूचक, एक संदर्भ गणना और यहां तक कि एक एनयूएल जोड़ते हैं। सी स्ट्रिंग पर वापस। मेमोरी अब बहुत बड़ी है, जैसे कि यदि प्रत्येक स्ट्रिंग में 3 (या 16, या अधिक) बाइट्स का जोड़ एक वास्तविक समस्या है, तो सॉफ़्टवेयर को इतने छोटे स्ट्रिंग्स से निपटना होगा कि कुछ अन्य स्टोरेज विधि और भी मेमोरी बचा लेगी (उदाहरण के लिए इतने सारे डुप्लीकेट हो सकते हैं कि हैश तालिका कम मेमोरी का उपयोग करेगी)। उदाहरणों में C++ मानक टेम्पलेट लाइब्रेरी शामिल है std::string
क्यूटी (टूलकिट) QString
, माइक्रोसॉफ्ट फाउंडेशन क्लास लाइब्रेरी CString
, और सी-आधारित कार्यान्वयन CFString
कोर फाउंडेशन के साथ-साथ इसके उद्देश्य सी सिबलिंग से NSString
फाउंडेशन किट से, दोनों एप्पल द्वारा। रस्सी (कंप्यूटर विज्ञान) जैसे तारों को संग्रहित करने के लिए अधिक जटिल संरचनाओं का भी उपयोग किया जा सकता है।
यह भी देखें
संदर्भ
- ↑ Ritchie, Dennis M. (April 1993). सी भाषा का विकास. Second History of Programming Languages conference. Cambridge, MA.
- ↑ Ritchie, Dennis M. (1996). "The development of the C language". In Bergin, Jr., Thomas J.; Gibson, Jr., Richard G. (eds.). History of Programming Languages (2 ed.). New York: ACM Press. ISBN 0-201-89502-1 – via Addison-Wesley (Reading, Mass).
- ↑ IBM z/Architecture Principles of Operation
- ↑ Kamp, Poul-Henning (25 July 2011), "The Most Expensive One-byte Mistake", ACM Queue, 9 (7): 40–43, doi:10.1145/2001562.2010365, ISSN 1542-7730, S2CID 30282393
- ↑ Rain Forest Puppy (9 September 1999). "पर्ल सीजीआई समस्याएं". Phrack Magazine. artofhacking.com. 9 (55): 7. Retrieved 3 January 2016.
- ↑ "Null byte injection on PHP?".
- ↑ "UTF-8, a transformation format of ISO 10646". Retrieved 19 September 2013.
- ↑ "Unicode/UTF-8-character table". Retrieved 13 September 2013.
- ↑ Kuhn, Markus. "UTF-8 and Unicode FAQ". Retrieved 13 September 2013.