เครื่องมือสำหรับนักพัฒนา · ตัวแปลงการประทับเวลา Unix
ปัญหาปี 2038: จะเกิดอะไรขึ้นเมื่อ 32-bit time_t ล้น
· พื้นหลัง
การประทับเวลา เวลายูนิกซ์ การดีบัก
ในวันที่ 19 มกราคม 2038 เวลา 03:14:07 UTC ตัวนับวินาทีที่เซ็นชื่อ 32 บิตจะตัดเป็น 1901 โพสต์นี้จะอธิบายคณิตศาสตร์ โดยที่เวลา 32 บิตยังคงซ่อนอยู่ และวิธีการจดจำระบบที่จะได้รับผลกระทบ
วันที่ที่ใกล้กว่าที่คิด — การจำนอง ใบรับรอง และเฟิร์มแวร์ที่คำนวณวันที่เลย 2038 แล้ว
ขีดจำกัดที่ลงวันที่ 2038 ส่งผลต่อโค้ดเมื่อใดก็ตามที่คำนวณการหมดอายุ กำหนดการ หรือกำหนดเวลาการเก็บรักษาที่เลยจุดนั้น ความล้มเหลวอาจปรากฏเร็วกว่าวันที่ในนาฬิกาหลายปี พื้นที่เก็บข้อมูลนี้ไม่มีเอกสารการจำนอง ใบรับรอง หรือผลิตภัณฑ์เฟิร์มแวร์ ดังนั้นจึงไม่มีการนำเสนอตัวอย่างเหล่านั้นเป็นกรณีที่สังเกตได้
คำถามการตรวจสอบเชิงปฏิบัติคือขอบเขตใด ๆ เก็บวินาที Unix ไว้ในจำนวนเต็ม 32- บิตที่ลงนามแล้วหรือไม่ เบราว์เซอร์สมัยใหม่ที่จัดรูปแบบวันที่ในอนาคตได้สำเร็จไม่ได้บอกอะไรเกี่ยวกับฟิลด์ดาวน์สตรีมที่แคบลง ติดตามการทำให้เป็นอนุกรมและความคงอยู่ ไม่ใช่แค่อินเทอร์เฟซผู้ใช้
ค้นหาการคำนวณวันที่ในอนาคตในการทดสอบวันนี้ แทนที่จะรอนาฬิกาที่ใช้งานจริง ขอบเขตคงที่จะเปลี่ยนความกังวลเรื่องปฏิทินที่อยู่ห่างไกลให้กลายเป็นการตรวจสอบซ้ำได้ทันที
การคำนวณวันที่ในอนาคตสามารถเปิดเผยขีดจำกัด 32-บิตก่อน 2038 แต่อุตสาหกรรมที่มีชื่อไม่ได้รับการพิสูจน์ที่นี่
ค่าสูงสุดของจำนวนเต็ม 32 บิตที่ลงนามคือ 2³¹−1 หรือ 2,147,483,647 การทดสอบกำหนดว่าหลายวินาทีหลังจากยุคเป็น `2038-01-19T03:14:07.000Z` อีกหนึ่งวินาทีทางคณิตศาสตร์ควรเป็น 03:14:08 และ ToolAcre จะแสดงค่าดังกล่าว เนื่องจาก JavaScript ตัวเลขและวันที่สามารถนำค่าดังกล่าวไปได้
การห่อให้เป็นค่าลบจำเป็นต้องมีการดำเนินการ 32-bit ที่ลงชื่อภายนอก `fromEpoch` ไม่ได้ดำเนินการอย่างใดอย่างหนึ่ง ผลลัพธ์ 1901 เดือนธันวาคมที่อ้างถึงบ่อยครั้งสามารถได้มาจากการตัดคำเสริมสองส่วน แต่การอ้างว่าทุกระบบที่ได้รับผลกระทบตัดคำแทนที่จะปฏิเสธ ทำให้อิ่มตัวหรือเสียหายจะเกินหลักฐาน ทดสอบขอบเขตจริง
หากการหล่อภายนอกตัดผ่านเลขคณิตเสริมสองตัว ให้ตรวจสอบผลลัพธ์บิตที่เก็บไว้และค่าลบที่ถอดรหัสแล้ว อย่าอนุมาน wrap จากวันที่ในอดีตที่ไม่คาดคิดเพียงอย่างเดียว
ทันทีบนที่แน่นอนได้รับการตรวจสอบแล้ว ลักษณะการห่อขึ้นอยู่กับการดำเนินการจำนวนเต็มภายนอก
ค้นหาสคีมา คำจำกัดความของโปรโตคอล และรูปแบบไบนารีสำหรับฟิลด์ที่เซ็นชื่อ 32 บิตซึ่งเก็บ epoch วินาที คอลัมน์ SQL ชื่อ INTEGER มีหลักฐานไม่เพียงพอสำหรับกลไกทั้งหมด และแพลตฟอร์มแบบฝังจะไม่ได้รับผลกระทบโดยอัตโนมัติ กำหนดความกว้าง ความลงนาม หน่วย และโค้ดการแปลงสำหรับแต่ละเส้นทาง
รวมไฟล์และบันทึกแคชไว้ในการตรวจสอบ ประเภทในหน่วยความจำที่กว้างขึ้นยังคงสามารถเขียนรูปแบบแคบแบบเก่าได้ ในขณะที่ฐานข้อมูลแบบกว้างสามารถรับค่าไคลเอ็นต์ที่ถูกตัดทอนได้ สร้างฟิกซ์เจอร์ที่ค่าสูงสุดและมากกว่านั้น จากนั้นตรวจสอบไบต์หรือค่าคงอยู่ แทนที่จะตรวจสอบว่าฟังก์ชันส่งคืนความสำเร็จเท่านั้น
ค้นหาฟิลด์ยุค 32 บิตที่ลงนามแล้วโดยการตรวจสอบสคีมาและรูปแบบจริง
การแก้ไขแนวความคิดคือการนำเสนอช่วงที่มีวันที่ที่ต้องการ โดยทั่วไปจะเป็นจำนวนที่ลงนามในวงกว้างหรือประเภทเวลาที่เหมาะสม เคอร์เนลของเวิร์กบุ๊ก 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 เป็นเวกเตอร์ทดสอบที่อยู่ติดกัน ตรวจสอบความคงอยู่ที่แน่นอน และหน่วยเอกสารและการลงนาม หลักฐานในทุกขอบเขตมีค่ามากกว่ารายการตรวจสอบทั่วไปเกี่ยวกับเทคโนโลยีที่อาจมีความเสี่ยง
เวกเตอร์ที่อยู่ติดกันควรข้ามพาธการทำให้เป็นอนุกรมจริง ไม่ใช่เพียงการคำนวณในหน่วยความจำเท่านั้น นั่นคือจุดที่การใช้งานที่กว้างขึ้นสามารถเผยให้เห็นตะเข็บแคบที่หลงเหลืออยู่