ความเป็นไปได้ของปัญหาปี 2038 มีปัญหามากคืออะไร?
ความเป็นไปได้ของปัญหาปี 2038 มีปัญหามากคืออะไร?
คำตอบ:
ฉันพบปัญหานี้ในระบบ Linux แบบฝังที่จำเป็นต้องจัดการกับวันที่ผ่านมา 2038 ในใบรับรองการเข้ารหัสระยะยาวดังนั้นฉันจึงบอกว่าสิ่งนี้เป็นสิ่งที่ขึ้นอยู่กับโดเมนแอปพลิเคชันของคุณ
ในขณะที่ระบบส่วนใหญ่ควรจะพร้อมก่อนปี 2581 หากคุณพบว่าตัวเองกำลังคำนวณวันที่ในอนาคตคุณอาจมีปัญหา
mktime
โทรล้มเหลวอย่างเงียบ ๆ
ฉันคิดว่านี่จะเป็นปัญหาที่สำคัญยิ่งกว่าปัญหา Y2K ในปี 1999/2000 เพราะรหัสที่ได้รับผลกระทบมักจะอยู่ในระดับต่ำกว่า (มันคือ CTIME) และดังนั้นจึงยากที่จะระบุสถานที่ที่เก็บเวลาด้วยวิธีนั้น
เพื่อเพิ่มความซับซ้อนในเรื่องต่อไปความจริงที่ว่า Y2K ถูกมองว่าเป็นปะทัดที่เปียกชื้นจะทำให้ยากที่จะดึงความสนใจไปที่ปัญหาในการวิ่งไปยังเหตุการณ์
การอ้างอิงทางวัฒนธรรม:
Cory Doctorow กำลังทดลองใช้รูปแบบใหม่สำหรับการเขียน / เผยแพร่สั้น ๆ ภายใต้ลิขสิทธิ์แบบเปิดและฉันแนะนำธีมหนึ่งใน 2038 หนึ่งในนั้นซึ่งเขาทำได้อย่างยอดเยี่ยมใน Epoch: http://craphound.com/?p=2337
ไม่กี่ปีที่ผ่านมามีรายงานปัญหาอยู่แล้วในพื้นที่เช่นโปรแกรมการจำนองที่คำนวณเงินกู้ยืม 30 ปี: 2008 + 30 = 2038
ท้ายที่สุดระบบปฏิบัติการ 64 บิตนั้นไม่เกี่ยวข้องกับปัญหา 2037 (CTIME ใกล้จะถึง 2037 กว่า 2038)
คำถามไม่ได้เป็นความลึกบิตของระบบปฏิบัติการ แต่เก็บเวลาได้อย่างไร หรือคอลัมน์ฐานข้อมูลเลือกเก็บเวลาอย่างไร หรือวิธีการที่ไดเรกทอรีเวลาบริการไดเรกทอรีไวยากรณ์เวลาการจัดเก็บที่ปลายด้านหลัง
นี่เป็นปัญหาที่ใหญ่กว่าที่คนคิดกันมากเพราะมันเป็นโรคประจำถิ่นและเป็นเรื่องธรรมดาที่ต้องใช้เคาน์เตอร์ 32 บิต
แต่ละอินสแตนซ์ที่เก็บเวลาจำเป็นต้องได้รับการตรวจสอบอีกครั้งและอัปเดต API ทั้งหมดและเครื่องมือทั้งหมดที่ใช้อัปเดตด้วยเช่นกัน
เลเยอร์สิ่งที่เป็นนามธรรมที่ให้คุณตั้งเวลาผ่านรูปแบบเวลาที่มนุษย์อ่านแทนข้อมูลดิบที่เขียนออกมาทำให้ง่ายขึ้น แต่นั่นเป็นเพียงกรณีเดียวเท่านั้น
ฉันสงสัยว่านี่จะเป็นข้อตกลงที่ใหญ่กว่าที่คนส่วนใหญ่คิด
time_t
เลย มันเก็บปี, เดือนและวันเป็นเขตข้อมูลในหนึ่งค่า 16 บิต: 5 บิตต่อวัน, 4 สำหรับเดือน, ทิ้ง 7 สำหรับปี 2107 คือ 1980 (ศูนย์ปีในดินแดน FAT) + 2 ^ 7-1 เพื่อความสนุกสนานยิ่งขึ้น FAT จะเก็บช่วงเวลาของวันด้วยวิธีเดียวกันกับค่า 16 บิตอื่น แต่ถ้าคุณทำคณิตศาสตร์คุณจะพบว่าคุณต้องการ 17 บิตเพื่อเก็บเวลาของวันด้วยวิธีนี้ FAT ได้รับสิ่งนี้โดยการลดความละเอียดลงไปหนึ่งวินาที FAT ไม่สามารถแยกความแตกต่างของการเปลี่ยนแปลงน้อยกว่า 2 วินาที Ah, Microsoft โลกที่น่าเบื่อนี้จะไม่มีความเข้ากันไม่จำเป็นของคุณ!
นี่คือความคิดเห็นของฉัน แต่ปัญหานี้เกิดจากปัญหาตัวนับ 32 บิตวันนี้ระบบปฏิบัติการส่วนใหญ่ได้รับการปรับปรุงเพื่อจัดการเวลาบน 64 บิต (อย่างน้อยบนคอมพิวเตอร์ 64 บิต) ดังนั้นฉันเดาว่าระบบปฏิบัติการและซอฟต์แวร์ทั้งหมดจะพร้อมใช้งานนาน เวลาก่อนปี 2038 สมมติว่า 2020 ดังนั้นคุณอาจมีปัญหาเฉพาะในปี 2038 คุณจะยังคงใช้งานซอฟต์แวร์จากปี 2020
เป็นไปได้ว่ามันจะไม่เป็นปัญหาในเกือบทุกกรณี ฉันหวังว่า.
ในช่วงการโจมตีแบบสายฟ้าแลบครั้งแรกของ Y2K ซึ่งผู้จำหน่ายซอฟต์แวร์และฮาร์ดแวร์จำเป็นต้องรับรองผลิตภัณฑ์ของตนว่า "สอดคล้องกับ Y2K" เพื่อจำหน่าย โดยการตั้งค่านาฬิกาในอนาคตและการทดสอบ
ในขณะนั้นเนื่องจากค่าใช้จ่ายในการทดสอบสูงมากพวกเขามักจะทำการทดสอบกับหลาย ๆ วันเช่น 1/1/99 (นักพัฒนาบางคนอาจใช้ 99 เป็นประโยค), 12/31/99, 1/1 / 00, leapness ปี 2000 1/19/38 และอื่น ๆ อีกมากมาย ดูที่นี่สำหรับรายการที่น่าเบื่อ
ดังนั้นฉันเชื่อว่าซอฟต์แวร์ที่สำคัญใด ๆ ที่มีในปี 1999 อาจจะไม่ได้มีข้อบกพร่องในปี 2038 แต่ซอฟต์แวร์ใหม่ที่เขียนตั้งแต่นั้นมาโดยโปรแกรมเมอร์ไม่รู้ หลังจากโปรแกรมเมอร์ debacle Y2K โดยทั่วไปเริ่มตระหนักถึงปัญหาการเข้ารหัสวันมากขึ้นดังนั้นจึงไม่น่าที่จะส่งผลกระทบอย่างใหญ่หลวงเหมือน Y2K คือ (ซึ่งในตัวของมันเองนั้นเป็น anticlimax)
ระบบ 32 บิตที่ยังทำงานอยู่จะมีปัญหา
#include <time.h>
#include <stdio.h>
int main() {
time_t t = (time_t)(1L << (sizeof(time_t)*8 - 9));
printf("%d\n", sizeof(time_t));
}
ควรเป็น 1 แทนที่จะเป็น 9 แต่ ctime ไม่รองรับวันที่ที่ใหญ่กว่า:
8 - Sun Jun 13 07:26:08 1141709097
เวลาระบบของฉัน (64 บิต) สามารถใช้งานได้มากกว่า 1 ล้านปี วิธีแก้ไขคือการอัพเดตระบบเป็น 64 บิต
สิ่งที่จับได้คือโปรแกรมอาจไม่รองรับ โดยเฉพาะอย่างยิ่งเก่าเหมาะสมและไม่ได้รับการบำรุงรักษา Devs ใช้เพื่อติดตามข้อเท็จจริง:
int
เป็น 32 บิต (ในความเป็นจริงพวกเขาถูกเก็บรักษาไว้เป็น 32 บิตบนระบบ 64 บิตในหมู่คนอื่น ๆ เพราะมันคิดว่าพวกเขาเป็น 32 บิตเสมอ)time_t
) สามารถโยนได้อย่างปลอดภัยint
ในซอฟต์แวร์ FLOSS ที่ได้รับความนิยมทั้งสองสิ่งอาจจะไม่ผ่านการตรวจสอบ 'หลายตา' เมื่อได้รับความนิยมน้อยและเหมาะสมมันจะขึ้นอยู่กับผู้แต่ง
ฉันเดาบน free * nix world ปี 2038 จะได้รับ 'unnoticed' ในขณะที่ฉันคาดหวังว่าจะเกิดปัญหากับแพลตฟอร์ม "propertary" (เช่นผู้ที่มีซอฟท์แวร์อสังหาริมทรัพย์จำนวนมาก) - โดยเฉพาะอย่างยิ่งถ้าส่วนที่สำคัญ
time_t
(หรือเทียบเท่า) บนระบบปฏิบัติการ 32 บิตมี 32 บิตในขณะที่time_t
(หรือเทียบเท่า) บนระบบปฏิบัติการ 64 บิตมี 64 บิต ฉันคิดว่ามันชัดเจนเพียงพอแม้ว่าจะมีการทำให้เข้าใจง่ายบางอย่าง
หากเป็นเช่น Y2K บางคนได้รับผลกระทบแล้วและกำลังเปลี่ยนซอฟต์แวร์ แต่นักพัฒนาส่วนใหญ่จะไม่สนใจจนกระทั่งในช่วงปี 2030 อาจเป็น 2035 หรือมากกว่านั้น ณ จุดนี้จะมีงานทำมากมายและใครก็ตามที่อายุมากพอ รู้จัก K&R C และยังไม่แก่เกินไปก็จะสามารถทำสัญญากับเงินจำนวนมากได้ การเปลี่ยนแปลงที่เกิดขึ้นจริงจะแสดงหลายสิ่งหลายอย่างที่ยังไม่ได้ทำอาจไม่มีสิ่งที่สำคัญทั้งหมด
ปัญหา Y2K คือสองเทอร์สเตอร์ที่แสดงถึงปีแทนที่จะเป็นสี่
ระบบจำนวนมากไม่มีวิธีแยกความแตกต่างระหว่าง 2000 จาก 1900 เนื่องจากพวกเขาเก็บเฉพาะ '00'
ระบบเกือบทั้งหมดจะใช้ตัวอักษร 4 ตัวเพื่อจัดเก็บปีหรือใช้ไลบรารีบางประเภท
ดังนั้นให้ทุกคนกังวลเกี่ยวกับปี 10000 (Y10K) แทน ยกเว้นสำหรับ OS และ Library writer ...