डेवलपर टूल · Unix टाइमस्टैम्प कन्वर्टर
वर्ष 2038 समस्या: क्या होता है जब 32-बिट टाइम_टी ओवरफ्लो हो जाता है
· पेजभूमि
टाइम स्टाम्प्स Unix-समय डिबगिंग
19 जनवरी 2038 को 03:14:07 UTC पर एक हस्ताक्षरित 32-बिट दूसरा काउंटर 1901 पर लपेटता है। यह पोस्ट अंकगणित की व्याख्या करती है, जहां 32-बिट समय अभी भी छिपा हुआ है, और उस सिस्टम को कैसे पहचाना जाए जो प्रभावित होगा।
एक तारीख जो सुनने में जितनी नजदीक लगती है - बंधक, प्रमाणपत्र और फ़र्मवेयर पहले से ही 2038 से पहले की तारीखों की गणना कर रहे हैं
2038 दिनांक की एक सीमा कोड को प्रभावित करती है जब भी वह उस बिंदु से परे समाप्ति, शेड्यूल या अवधारण समय सीमा की गणना करता है। इसलिए विफलता घड़ी की तारीख से वर्षों पहले दिखाई दे सकती है। यह भंडार बंधक, प्रमाणपत्र या फ़र्मवेयर उत्पादों का दस्तावेज़ीकरण नहीं करता है, इसलिए उन उदाहरणों को देखे गए मामलों के रूप में प्रस्तुत नहीं किया जाता है।
व्यावहारिक ऑडिट प्रश्न यह है कि क्या कोई सीमा Unix सेकंड को हस्ताक्षरित 32-बिट पूर्णांक में संग्रहीत करती है। भविष्य की तारीख को सफलतापूर्वक प्रारूपित करने वाला एक आधुनिक ब्राउज़र डाउनस्ट्रीम के संकीर्ण क्षेत्र के बारे में कुछ नहीं कहता है। केवल उपयोगकर्ता इंटरफ़ेस ही नहीं, क्रमबद्धता और दृढ़ता का भी पता लगाएं।
उत्पादन घड़ी की प्रतीक्षा करने के बजाय आज ही परीक्षणों में भविष्य-तिथि की गणना खोजें। एक निश्चित सीमा निर्धारण एक दूर के कैलेंडर चिंता को तत्काल, दोहराए जाने योग्य जांच में बदल देता है।
भविष्य-तिथि की गणना 2038 से पहले 32-बिट सीमा को उजागर कर सकती है, लेकिन नामित उद्योगों का यहां प्रमाण नहीं है
एक हस्ताक्षरित 32-बिट पूर्णांक की अधिकतम सीमा 2³¹−1, या 2,147,483,647 है। परीक्षण युग के बाद के कई सेकंड को `2038-01-19T03:14:07.000Z` के रूप में स्थापित करते हैं। एक और गणितीय सेकंड 03:14:08 होना चाहिए, और ToolAcre इसे प्रदर्शित करता है क्योंकि JavaScript संख्या और दिनांक मान ले सकते हैं।
नकारात्मक मान पर लपेटने के लिए बाहरी हस्ताक्षरित 32-बिट ऑपरेशन की आवश्यकता होती है; `fromEpoch` एक भी कार्य नहीं करता. अक्सर उद्धृत दिसंबर 1901 परिणाम दो-पूरक रैप के लिए प्राप्त किया जा सकता है, लेकिन यह दावा करना कि प्रत्येक प्रभावित सिस्टम अस्वीकार, संतृप्त या भ्रष्ट करने के बजाय रैप करता है, सबूत से अधिक होगा। वास्तविक सीमा का परीक्षण करें.
यदि कोई बाहरी कास्ट दो-पूरक अंकगणित के माध्यम से लपेटता है, तो परिणामी संग्रहीत बिट्स और डिकोड किए गए नकारात्मक मान का निरीक्षण करें। किसी अप्रत्याशित ऐतिहासिक तारीख से केवल लपेटे का अनुमान न लगाएं।
सटीक ऊपरी क्षण सत्यापित है; रैप व्यवहार बाहरी पूर्णांक ऑपरेशन पर निर्भर करता है
32-बिट हस्ताक्षरित फ़ील्ड के लिए स्कीमा, प्रोटोकॉल परिभाषाएँ और बाइनरी लेआउट खोजें जो युग सेकंड रखते हैं। INTEGER नामक SQL कॉलम सभी इंजनों के लिए पर्याप्त साक्ष्य नहीं है, और एक एम्बेडेड प्लेटफ़ॉर्म स्वचालित रूप से प्रभावित नहीं होता है। प्रत्येक पथ के लिए चौड़ाई, हस्ताक्षर, इकाई और रूपांतरण कोड निर्धारित करें।
ऑडिट में फ़ाइलें और कैश्ड रिकॉर्ड शामिल करें। एक विस्तृत इन-मेमोरी प्रकार अभी भी एक पुराना संकीर्ण प्रारूप लिख सकता है, जबकि एक विस्तृत डेटाबेस एक छोटा क्लाइंट मान प्राप्त कर सकता है। अधिकतम और एक से अधिक पर फिक्स्चर बनाएं, फिर केवल यह जाँचने के बजाय कि कोई फ़ंक्शन सफल हुआ है, बाइट्स या निरंतर मान का निरीक्षण करें।
वास्तविक स्कीमा और प्रारूपों का निरीक्षण करके हस्ताक्षरित 32-बिट युग फ़ील्ड का पता लगाएं
वैचारिक निर्धारण एक प्रतिनिधित्व है जिसकी सीमा में आवश्यक तिथियां, आमतौर पर एक व्यापक हस्ताक्षरित गणना या एक उपयुक्त अस्थायी प्रकार शामिल होता है। कार्यपुस्तिका की कर्नेल, libc और प्रारूप माइग्रेशन कथा इन स्रोत फ़ाइलों के बाहर है। प्रत्येक सिस्टम की अपनी अनुकूलता और परिनियोजन कार्य होता है।
समन्वित अनुबंध परिवर्तन के रूप में प्रत्येक सीमा को चौड़ा करें। वायर फ़ील्ड के बिना स्टोरेज को अपडेट करना, या मौजूदा डेटा के बिना लाइब्रेरी को अपडेट करना, एक संकीर्ण लिंक छोड़ देता है। जहां आवश्यक हो वहां संस्करण जोड़ें और पुराने पाठकों का स्पष्ट रूप से परीक्षण करें। युग की परिभाषा को बदलने की आवश्यकता नहीं है; कंटेनर करता है.
प्रवासन योजना में रोलबैक और मिश्रित-संस्करण व्यवहार शामिल होना चाहिए। व्यापक मूल्यों का निर्माण करने वाला एक नया लेखक किसी पुरानी तारीख को कैलेंडर सीमा तक पहुंचने से पहले ही एक पुराने पाठक को तोड़ सकता है।
प्रतिनिधित्व का विस्तार करना मुख्य समाधान है; कर्नेल और प्रारूप माइग्रेशन सिस्टम-विशिष्ट हैं
`2038-01-19T03:14:07.000Z` प्राप्त करने के लिए 2,147,483,647 को सेकंड के रूप में बदलें; `2038-01-19T03:14:08.000Z` प्राप्त करने के लिए 2,147,483,648 को रूपांतरित करें। एक सेकंड का सहज कदम साबित करता है कि ToolAcre पथ में उस मान पर कोई 32-बिट क्लिफ़ नहीं है।
अब समान अंकों को मिलीसेकेंड के रूप में लागू करें। वे जनवरी 1970 में आते हैं क्योंकि मान शून्य के लगभग पच्चीस दिन बाद हो जाते हैं। यह तुलना एक इकाई गलती को 2038 समस्या के रूप में गलत लेबल किए जाने से रोकती है। फ़ील्ड की चौड़ाई और पैमाना स्वतंत्र आयाम हैं।
यह तुलना यह भी दर्शाती है कि कन्वर्टर कमजोर होने के बजाय निदानात्मक क्यों है: स्पष्ट इकाई चयन पैमाने को निर्धारित करता है, जबकि ब्राउज़र का व्यापक प्रतिनिधित्व दोनों मूल्यों को वहन करता है।
कार्यान्वित उदाहरण: कन्वर्टर सीमा पार करता है क्योंकि JavaScript दिनांक हस्ताक्षरित नहीं है 32-बिट सेकंड
रिपॉजिटरी 4,294,967,295 सेकंड को `2106-02-07T06:28:15.000Z` के रूप में भी परीक्षण करती है, जो अधिकतम अहस्ताक्षरित 32-बिट गणना है। यह GPS सप्ताह के रोलओवर का परीक्षण नहीं करता है या हस्ताक्षरित 64-बिट मिलीसेकंड क्लिफ़ को निर्दिष्ट नहीं करता है, इसलिए उन नामित विषयों को सामान्यीकृत करने के बजाय छोड़ दिया जाता है।
सीमा विश्लेषण को उपयोग में आने वाले सटीक प्रकार का पालन करना चाहिए। हस्ताक्षरित से अहस्ताक्षरित पर स्विच करना एक दिशा का विस्तार करता है लेकिन नकारात्मक तिथियों को हटा देता है और फिर भी एक ऊपरी किनारा बनाता है। एक व्यापक हस्ताक्षरित प्रतिनिधित्व आम तौर पर उपभोक्ता की तिथि सीमा के अधीन दोनों दिशाओं को संरक्षित करता है।
प्रत्येक चट्टान को चौड़ाई, हस्ताक्षर और इकाई से अपनी व्युत्पत्ति की आवश्यकता होती है। "2038" के अंतर्गत असंबंधित रोलओवर को समूहीकृत करने से यह अस्पष्ट हो जाता है कि वास्तव में किस बाइनरी फ़ील्ड में परिवर्तन की आवश्यकता है।
अहस्ताक्षरित 32-बिट सीमा का परीक्षण किया गया है; अन्य नामित चट्टानें बाहरी भंडार साक्ष्य हैं
एक कन्वर्टर स्रोत कोड, बायनेरिज़, डेटाबेस स्कीमा या तैनात टूलों का ऑडिट नहीं कर सकता है। यह दिखाता है कि उम्मीदवार संख्या का क्या मतलब है और परीक्षणों के लिए ठोस फिक्स्चर की आपूर्ति करता है। स्थैतिक खोज, प्रकार निरीक्षण, क्रमांकन परीक्षण और माइग्रेशन रिहर्सल से यह स्थापित होना चाहिए कि कोई उत्पाद सुरक्षित है या नहीं।
ऑडिट बंद न करें क्योंकि ब्राउज़र 2038 को सही ढंग से प्रस्तुत करता है। वह केवल इस ब्राउज़र पथ को सत्यापित करता है। मूल्य का अंत से अंत तक पालन करें, विशेष रूप से भाषा बाइंडिंग और पुराने प्रारूपों के माध्यम से जहां अंतर्निहित संकुचन हो सकता है।
उस ट्रेस में निर्भरता और विक्रेता इंटरफ़ेस शामिल करें। एप्लिकेशन स्रोत एक विस्तृत प्रकार का उपयोग कर सकता है जबकि एक मूल लाइब्रेरी या डिवाइस प्रोटोकॉल समान मान को अदृश्य रूप से सीमित कर देता है।
टेकअवे: युग ठीक है, पूर्णांक चौड़ाई समस्या है - और कैसे Unix टाइमस्टैम्प कन्वर्टर आपको UTC और स्थानीय समय में किसी भी सीमा मान की जांच करने देता है
वर्ष 2038 अंक एक पूर्णांक-चौड़ाई सीमा है, Unix युग अंकगणित में कोई दोष नहीं है। ToolAcre का दोनों तरफ सफल रूपांतरण उस अलगाव को दृश्यमान बनाता है। बाहरी प्रणाली तभी विफल होती है जब उसका एक प्रतिनिधित्व अगली गिनती नहीं कर पाता।
आसन्न परीक्षण वैक्टर के रूप में 2,147,483,647 और 2,147,483,648 का उपयोग करें, सटीक दृढ़ता और दस्तावेज़ इकाई और हस्ताक्षर की पुष्टि करें। प्रत्येक सीमा पर साक्ष्य कथित रूप से कमजोर प्रौद्योगिकियों की सामान्य जांच सूची से अधिक मूल्यवान है।
आसन्न वैक्टर को केवल इन-मेमोरी गणना ही नहीं, बल्कि वास्तविक क्रमबद्धता पथ को भी पार करना चाहिए। यही वह जगह है जहां नाममात्र रूप से चौड़ा अनुप्रयोग शेष संकीर्ण सीम को प्रकट कर सकता है।