أدوات المطور · محول الطابع الزمني يونكس
مشكلة العام 2038: ماذا يحدث عندما يفيض 32 بت time_t
· خلفية
الطوابع الزمنية وقت يونكس تصحيح الأخطاء
في 19 يناير 2038 في 03:14:07 UTC يلتف العداد الثاني الموقع 32 بت إلى 1901. يشرح هذا المنشور العملية الحسابية، حيث لا يزال الوقت 32 بت مخفيًا، وكيفية التعرف على النظام الذي سيتأثر.
تاريخ أقرب مما يبدو — فالرهون العقارية والشهادات والبرامج الثابتة تحسب بالفعل التواريخ الماضية 2038
يؤثر الحد المؤرخ 2038 على الكود عندما يحسب انتهاء الصلاحية أو الجدول الزمني أو الموعد النهائي للاحتفاظ بعد تلك النقطة. ولذلك يمكن أن يظهر الفشل قبل تاريخ الساعة بسنوات. لا يوثق هذا المستودع منتجات الرهن العقاري أو الشهادات أو البرامج الثابتة، لذا لا يتم تقديم هذه الأمثلة كحالات تمت ملاحظتها.
سؤال التدقيق العملي هو ما إذا كان أي حد يخزن ثواني يونكس في عدد صحيح ذو 32 بت. المتصفح الحديث الذي ينجح في تنسيق تاريخ مستقبلي لا يقول شيئًا عن حقل أضيق في اتجاه مجرى النهر. تتبع التسلسل والثبات، وليس فقط واجهة المستخدم.
ابحث عن حسابات التاريخ المستقبلي في اختبارات اليوم بدلاً من انتظار ساعة الإنتاج. تعمل أداة الحدود الثابتة على تحويل اهتمامات التقويم البعيدة إلى فحص فوري وقابل للتكرار.
يمكن أن تكشف حسابات التاريخ المستقبلي عن حدود 32 بت قبل 2038، ولكن لا يتم إثبات الصناعات المسماة هنا
الحد الأقصى للعدد الصحيح 32 ذو البتات هو 2³¹−1، أو 2,147,483,647. تثبت الاختبارات أن عدة ثوانٍ بعد العصر هي `2038-01-19T03:14:07.000Z`. يجب أن تكون الثانية الرياضية الأخرى 03:14:08، وToolAcre تعرضها لأن JavaScript يمكن أن يحمل الرقم والتاريخ القيمة.
يتطلب الالتفاف إلى قيمة سالبة عملية 32 بت خارجية موقعة؛ `fromEpoch` لا يقوم بتنفيذ أي إجراء. يمكن استخلاص نتيجة ديسمبر 1901 التي يتم الاستشهاد بها في كثير من الأحيان من أجل التفاف المتممين، ولكن الادعاء بأن كل نظام متأثر يلتف بدلاً من أن يرفض أو يشبع أو يفسد سيتجاوز الأدلة. اختبار الحدود الفعلية.
إذا اجتاز قالب خارجي عملية حسابية مكملة لاثنين، فافحص البتات المخزنة الناتجة والقيمة السالبة التي تم فك تشفيرها. لا تستنتج الالتفاف فقط من تاريخ تاريخي غير متوقع.
يتم التحقق من اللحظة العليا الدقيقة؛ يعتمد سلوك الالتفاف على عملية الأعداد الصحيحة الخارجية
مخططات البحث وتعريفات البروتوكول والتخطيطات الثنائية للحقول الموقعة 32 بت التي تحتوي على ثواني زمنية. لا يعد العمود SQL المسمى INTEGER دليلاً كافيًا عبر جميع المحركات، ولا يتأثر النظام الأساسي المضمن تلقائيًا. تحديد العرض والتوقيع والوحدة ورمز التحويل لكل مسار.
قم بتضمين الملفات والسجلات المخزنة مؤقتًا في عملية التدقيق. لا يزال بإمكان نوع الذاكرة الداخلية الموسعة كتابة تنسيق ضيق قديم، بينما يمكن لقاعدة البيانات الواسعة تلقي قيمة عميل مبتورة. قم بإنشاء تركيبات عند الحد الأقصى وما بعده، ثم قم بفحص البايتات أو القيمة المستمرة بدلاً من مجرد التحقق من نجاح الوظيفة.
حدد موقع حقول الحقبة 32 ذات البتات الموقعة من خلال فحص المخططات والتنسيقات الفعلية
الإصلاح المفاهيمي هو تمثيل يتضمن نطاقه التواريخ المطلوبة، وعادة ما يكون عدد التوقيعات أوسع أو نوع زمني مناسب. يقع سرد ترحيل kernel وlibc وتنسيق المصنف خارج هذه الملفات المصدر. كل نظام له أعمال التوافق والنشر الخاصة به.
قم بتوسيع كل الحدود كتغيير منسق للعقد. يؤدي تحديث وحدة التخزين بدون حقل سلكي، أو مكتبة بدون بيانات موجودة، إلى ترك رابط ضيق. أضف الإصدارات عند الضرورة واختبر القراء القدامى بشكل صريح. إن تعريف العصر نفسه لا يحتاج إلى التغيير؛ الحاوية تفعل.
يجب أن يتضمن تخطيط الترحيل سلوك التراجع والإصدار المختلط. يمكن للكاتب الجديد الذي ينتج قيمًا واسعة أن يكسر القارئ القديم قبل أن يصل أي تاريخ ثابت إلى حدود التقويم.
إن توسيع التمثيل هو الحل الأساسي؛ تعد عمليات ترحيل النواة والتنسيق خاصة بالنظام
قم بتحويل 2,147,483,647 بالثواني للحصول على `2038-01-19T03:14:07.000Z`؛ قم بتحويل 2,147,483,648 للحصول على `2038-01-19T03:14:08.000Z`. تثبت الخطوة السلسة التي تبلغ ثانية واحدة أن المسار 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 كمتجهات اختبار متجاورة، وتحقق من الثبات الدقيق، ووحدة الوثيقة والتوقيع. إن الأدلة عند كل الحدود هي أكثر قيمة من قائمة مرجعية عامة للتكنولوجيات التي يفترض أنها معرضة للخطر.
يجب أن تعبر المتجهات المتجاورة مسار تسلسل حقيقي، وليس فقط عملية حسابية في الذاكرة. هذا هو المكان الذي يمكن أن يكشف فيه التطبيق الموسع اسميًا عن التماس الضيق المتبقي.