ปัญหาปี 2038 [ปิด]


คำตอบ:


17

ฉันพบปัญหานี้ในระบบ Linux แบบฝังที่จำเป็นต้องจัดการกับวันที่ผ่านมา 2038 ในใบรับรองการเข้ารหัสระยะยาวดังนั้นฉันจึงบอกว่าสิ่งนี้เป็นสิ่งที่ขึ้นอยู่กับโดเมนแอปพลิเคชันของคุณ

ในขณะที่ระบบส่วนใหญ่ควรจะพร้อมก่อนปี 2581 หากคุณพบว่าตัวเองกำลังคำนวณวันที่ในอนาคตคุณอาจมีปัญหา


สิ่งที่ดี! ฉันไม่ได้คิดถึงตัวอย่างนั้น! มาตรฐาน PKI ใช้อะไรเป็นไวยากรณ์เวลาในใบรับรอง ฉันไม่เคยดู!
geoffc

@geoffc จริงๆแล้วมันเป็นรูปแบบที่เป็นกรรมสิทธิ์และมีโครงสร้างวันที่ / เวลาภายในซึ่งมีขนาดใหญ่พอที่จะพอดีกับวันที่ที่ผ่านมา 2581 แต่มันใช้ฟังก์ชัน GLIBC สำหรับการแปลงวันที่ / เวลา ถ้าฉันจำได้ถูกต้องการmktimeโทรล้มเหลวอย่างเงียบ ๆ
อเล็กซ์ B

13

ฉันคิดว่านี่จะเป็นปัญหาที่สำคัญยิ่งกว่าปัญหา Y2K ในปี 1999/2000 เพราะรหัสที่ได้รับผลกระทบมักจะอยู่ในระดับต่ำกว่า (มันคือ CTIME) และดังนั้นจึงยากที่จะระบุสถานที่ที่เก็บเวลาด้วยวิธีนั้น

เพื่อเพิ่มความซับซ้อนในเรื่องต่อไปความจริงที่ว่า Y2K ถูกมองว่าเป็นปะทัดที่เปียกชื้นจะทำให้ยากที่จะดึงความสนใจไปที่ปัญหาในการวิ่งไปยังเหตุการณ์

การอ้างอิงทางวัฒนธรรม:

Cory Doctorow กำลังทดลองใช้รูปแบบใหม่สำหรับการเขียน / เผยแพร่สั้น ๆ ภายใต้ลิขสิทธิ์แบบเปิดและฉันแนะนำธีมหนึ่งใน 2038 หนึ่งในนั้นซึ่งเขาทำได้อย่างยอดเยี่ยมใน Epoch: http://craphound.com/?p=2337


เมื่อพูดถึงคนที่ทำงานเกี่ยวกับปัญหาในเวลานั้น Y2K ก็มลายไปเพราะการทำงานและการวางแผนล่วงหน้าจำนวนมาก การรับรู้ที่เปียกชื้นได้รับการเสริมโดยการลงโทษในสื่อต่าง ๆ ฉันคาดหวังว่าจะมีการวางแผนและการทำงานมากมายเริ่มต้นในปี 2035 หรือมากกว่านั้น แต่ถ้าเราโชคดีเราจะพลาดสื่อสายฟ้าแลบ
David Thornley

ไชโยสำหรับลิงค์มาร์ค
boehj

9

ไม่กี่ปีที่ผ่านมามีรายงานปัญหาอยู่แล้วในพื้นที่เช่นโปรแกรมการจำนองที่คำนวณเงินกู้ยืม 30 ปี: 2008 + 30 = 2038


8

ท้ายที่สุดระบบปฏิบัติการ 64 บิตนั้นไม่เกี่ยวข้องกับปัญหา 2037 (CTIME ใกล้จะถึง 2037 กว่า 2038)

คำถามไม่ได้เป็นความลึกบิตของระบบปฏิบัติการ แต่เก็บเวลาได้อย่างไร หรือคอลัมน์ฐานข้อมูลเลือกเก็บเวลาอย่างไร หรือวิธีการที่ไดเรกทอรีเวลาบริการไดเรกทอรีไวยากรณ์เวลาการจัดเก็บที่ปลายด้านหลัง

นี่เป็นปัญหาที่ใหญ่กว่าที่คนคิดกันมากเพราะมันเป็นโรคประจำถิ่นและเป็นเรื่องธรรมดาที่ต้องใช้เคาน์เตอร์ 32 บิต

แต่ละอินสแตนซ์ที่เก็บเวลาจำเป็นต้องได้รับการตรวจสอบอีกครั้งและอัปเดต API ทั้งหมดและเครื่องมือทั้งหมดที่ใช้อัปเดตด้วยเช่นกัน

เลเยอร์สิ่งที่เป็นนามธรรมที่ให้คุณตั้งเวลาผ่านรูปแบบเวลาที่มนุษย์อ่านแทนข้อมูลดิบที่เขียนออกมาทำให้ง่ายขึ้น แต่นั่นเป็นเพียงกรณีเดียวเท่านั้น

ฉันสงสัยว่านี่จะเป็นข้อตกลงที่ใหญ่กว่าที่คนส่วนใหญ่คิด


1
ปัญหาที่ใหญ่ที่สุดที่ฉันเห็นคือรูปแบบไฟล์และ filesystens อย่างไรก็ตามช่วงวันที่สำหรับ ext4 คือ 2514, vfat คือ 2107 ปัญหาอยู่ที่ reiserfs (2038)
Maciej Piechotka

ReiserFS มีปัญหาอื่น ๆ เช่นกัน ฉันยังคิดว่ามีสถานที่ที่ซ่อนอยู่มากมายมากกว่าที่ผู้คนคิดว่าจะเก็บเวลาไว้ใน CTIME มันเป็นรูปแบบเวลาที่ง่ายและมีประโยชน์ แน่นอน CTIME ที่ไม่ได้ลงนามไม่มีปัญหา 2037 ฉันคิดว่าเป็นกรณีการบันทึกเวลา 2107
geoffc

1
คุณกำลังคิดถึง Apple HFS FAT ไม่ได้ใช้time_tเลย มันเก็บปี, เดือนและวันเป็นเขตข้อมูลในหนึ่งค่า 16 บิต: 5 บิตต่อวัน, 4 สำหรับเดือน, ทิ้ง 7 สำหรับปี 2107 คือ 1980 (ศูนย์ปีในดินแดน FAT) + 2 ^ 7-1 เพื่อความสนุกสนานยิ่งขึ้น FAT จะเก็บช่วงเวลาของวันด้วยวิธีเดียวกันกับค่า 16 บิตอื่น แต่ถ้าคุณทำคณิตศาสตร์คุณจะพบว่าคุณต้องการ 17 บิตเพื่อเก็บเวลาของวันด้วยวิธีนี้ FAT ได้รับสิ่งนี้โดยการลดความละเอียดลงไปหนึ่งวินาที FAT ไม่สามารถแยกความแตกต่างของการเปลี่ยนแปลงน้อยกว่า 2 วินาที Ah, Microsoft โลกที่น่าเบื่อนี้จะไม่มีความเข้ากันไม่จำเป็นของคุณ!
Warren Young

8

นี่คือความคิดเห็นของฉัน แต่ปัญหานี้เกิดจากปัญหาตัวนับ 32 บิตวันนี้ระบบปฏิบัติการส่วนใหญ่ได้รับการปรับปรุงเพื่อจัดการเวลาบน 64 บิต (อย่างน้อยบนคอมพิวเตอร์ 64 บิต) ดังนั้นฉันเดาว่าระบบปฏิบัติการและซอฟต์แวร์ทั้งหมดจะพร้อมใช้งานนาน เวลาก่อนปี 2038 สมมติว่า 2020 ดังนั้นคุณอาจมีปัญหาเฉพาะในปี 2038 คุณจะยังคงใช้งานซอฟต์แวร์จากปี 2020
เป็นไปได้ว่ามันจะไม่เป็นปัญหาในเกือบทุกกรณี ฉันหวังว่า.


ฉันลองใช้ Ubuntu รุ่น 32 บิตและพบปัญหา 2038 แต่การเรียกใช้รุ่น 64 บิตของ Ubuntu แสดงว่าไม่มีสัญญาณของปัญหา 2038 ฉันไม่ได้ลองยูนิกซ์อื่น ๆ
Jimmy Hedman

ใช่ในรุ่น 32 บิตส่วนใหญ่คุณจะเห็นปัญหา แต่ไม่ใช่ในรุ่น 64 บิต คุณสามารถคาดหวังว่าจะไม่มีระบบปฏิบัติการ 32 บิตในปี 2038 อีกต่อไป
รัศมี

2
นี่คือสมมติฐานที่ไร้สาระ เรายังคงใช้ไมโครโปรเซสเซอร์ 16 (และ 8 บิต) ในโลกปัจจุบันสิ่งที่จะพูดว่า 32 บิตไมโครโปรเซสเซอร์จะหายไปอย่างน่าอัศจรรย์ในอนาคต? มีความเป็นธรรมที่จะกล่าวว่าสิ่งนี้จะไม่ส่งผลกระทบต่อผู้ใช้โดยเฉลี่ย แต่ในกรณีขอบอาจยังคงมีปัญหา
Eli Frey

ดี - คอมพิวเตอร์ 16 บิตและ 8 บิตสามารถ 1. ย้ายวันที่ 0 (จาก 1970-01-01 ไปเป็นตัวอย่าง 2010-01-01) - อย่างไรก็ตามมันจะหยุดการประชุม API / ABI บางอย่าง 2. ขยายเขตข้อมูลตัวจับเวลา ( ซึ่งในบางกรณีอาจทำลาย 'เฉพาะ' ABI)
Maciej Piechotka

1

ไม่ใช่เรื่องใหญ่อะไร

ในช่วงการโจมตีแบบสายฟ้าแลบครั้งแรกของ Y2K ซึ่งผู้จำหน่ายซอฟต์แวร์และฮาร์ดแวร์จำเป็นต้องรับรองผลิตภัณฑ์ของตนว่า "สอดคล้องกับ Y2K" เพื่อจำหน่าย โดยการตั้งค่านาฬิกาในอนาคตและการทดสอบ

ในขณะนั้นเนื่องจากค่าใช้จ่ายในการทดสอบสูงมากพวกเขามักจะทำการทดสอบกับหลาย ๆ วันเช่น 1/1/99 (นักพัฒนาบางคนอาจใช้ 99 เป็นประโยค), 12/31/99, 1/1 / 00, leapness ปี 2000 1/19/38 และอื่น ๆ อีกมากมาย ดูที่นี่สำหรับรายการที่น่าเบื่อ

ดังนั้นฉันเชื่อว่าซอฟต์แวร์ที่สำคัญใด ๆ ที่มีในปี 1999 อาจจะไม่ได้มีข้อบกพร่องในปี 2038 แต่ซอฟต์แวร์ใหม่ที่เขียนตั้งแต่นั้นมาโดยโปรแกรมเมอร์ไม่รู้ หลังจากโปรแกรมเมอร์ debacle Y2K โดยทั่วไปเริ่มตระหนักถึงปัญหาการเข้ารหัสวันมากขึ้นดังนั้นจึงไม่น่าที่จะส่งผลกระทบอย่างใหญ่หลวงเหมือน Y2K คือ (ซึ่งในตัวของมันเองนั้นเป็น anticlimax)


ยกเว้นว่าปัญหานี้เกิดจากชนิด UNIX time_t เป็น 32- บิต
Yuhong Bao

1

ระบบ 32 บิตที่ยังทำงานอยู่จะมีปัญหา


2
คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้เพื่อให้ชัดเจนยิ่งขึ้นว่าอะไรที่เป็นปัญหาและจะตอบโต้อย่างไร
Anthon

ปัญหานี้เกิดจากเลขจำนวนเต็ม 32 บิตที่ใช้สำหรับการคำนวณเวลา เวลาถูกวัดในจำนวนวินาทีที่ผ่านไปตั้งแต่ 1 มกราคม 1970 ตัวอย่างเช่นหลังจากหนึ่งวันตัวนับนี้จะอยู่ที่ 86400 ดังนั้นในปี 2038 ค่านี้จะล้นเนื่องจากมันจะเก็บค่าที่มากกว่าจำนวนที่สามารถเก็บไว้ใน จำนวนเต็ม 32 บิตที่ไม่ได้ลงนาม ระบบ 64 บิตที่ใช้ 64 บิตสำหรับการประทับเวลาจะไม่มีปัญหานี้เนื่องจากจะสามารถทำงานได้จนถึงเวลา 15:30:08 น. ในวันอาทิตย์ที่ 4 ธันวาคม 292,277,026,596 (292 พันล้านปี)
Rahul Kadukar

0
#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" (เช่นผู้ที่มีซอฟท์แวร์อสังหาริมทรัพย์จำนวนมาก) - โดยเฉพาะอย่างยิ่งถ้าส่วนที่สำคัญ


ไม่ใช่ 'ระบบ' หรือ 'OS' ระบบปฏิบัติการ 32 บิตส่วนใหญ่ก่อนหน้านี้ (heck แม้แต่ระบบปฏิบัติการ 16 บิต) สามารถทำคณิตศาสตร์ 64 บิตได้ ความลึก 64 บิตที่ระดับ OS นั้นเป็นการอ้างอิงถึงโมเดลหน่วยความจำไม่ใช่ความสามารถในการทำคณิตศาสตร์ และเวลาเป็นเรื่องของคณิตศาสตร์
geoffc

ใช่และไม่. เป็นความจริงที่ว่าระบบปฏิบัติการ 32 บิตและ 64 บิตสามารถดำเนินการทางคณิตศาสตร์ 64 บิต (คุณสามารถจำลองเลขคณิตใด ๆ ) อย่างไรก็ตามtime_t(หรือเทียบเท่า) บนระบบปฏิบัติการ 32 บิตมี 32 บิตในขณะที่time_t(หรือเทียบเท่า) บนระบบปฏิบัติการ 64 บิตมี 64 บิต ฉันคิดว่ามันชัดเจนเพียงพอแม้ว่าจะมีการทำให้เข้าใจง่ายบางอย่าง
Maciej Piechotka

0

หากเป็นเช่น Y2K บางคนได้รับผลกระทบแล้วและกำลังเปลี่ยนซอฟต์แวร์ แต่นักพัฒนาส่วนใหญ่จะไม่สนใจจนกระทั่งในช่วงปี 2030 อาจเป็น 2035 หรือมากกว่านั้น ณ จุดนี้จะมีงานทำมากมายและใครก็ตามที่อายุมากพอ รู้จัก K&R C และยังไม่แก่เกินไปก็จะสามารถทำสัญญากับเงินจำนวนมากได้ การเปลี่ยนแปลงที่เกิดขึ้นจริงจะแสดงหลายสิ่งหลายอย่างที่ยังไม่ได้ทำอาจไม่มีสิ่งที่สำคัญทั้งหมด


-5

ปัญหา Y2K คือสองเทอร์สเตอร์ที่แสดงถึงปีแทนที่จะเป็นสี่

ระบบจำนวนมากไม่มีวิธีแยกความแตกต่างระหว่าง 2000 จาก 1900 เนื่องจากพวกเขาเก็บเฉพาะ '00'

ระบบเกือบทั้งหมดจะใช้ตัวอักษร 4 ตัวเพื่อจัดเก็บปีหรือใช้ไลบรารีบางประเภท

ดังนั้นให้ทุกคนกังวลเกี่ยวกับปี 10000 (Y10K) แทน ยกเว้นสำหรับ OS และ Library writer ...


อาจเป็นไปได้ว่าใครคนใดคนหนึ่งกำลังเก็บวันที่เป็นรูปแบบดังกล่าว (เช่น DCD หรือสตริง) ตอนนี้ เวลามักจะจัดการโดยวัตถุหรือ ints (ดังนั้นรหัสที่แสดงจะต้องมีการปรับปรุง)
Maciej Piechotka

ใช่จุดของฉันอย่างแน่นอน Y2K ได้ฆ่าความคิดในการแสดงวันที่เป็นสตริงความยาวคงที่ได้อย่างมีประสิทธิภาพ
Stephen Jazdzewski

@ สตีเฟ่น: ไม่ได้อยู่ในโลกของภาษาโคบอล แต่มีโชคไม่ดีที่การใช้งานภาษาโคบอลบน Unix / Linux
David Thornley

@ David: โปรแกรมภาษาโคบอลเป็นปัญหา Y2K เป็นส่วนใหญ่ ระบบ Linux / Unix จากมุมมองของผู้ใช้เคยมีปัญหา Y2K หรือไม่ คำตอบง่ายๆสำหรับคำถามเดิมคือไม่
Stephen Jazdzewski

4
ผู้โพสต์ไม่ได้ถามถึงปัญหา y2k พวกเขาถามถึงปัญหา y2k38 ซึ่งเป็นสัตว์ร้ายที่แตกต่างอย่างสิ้นเชิง ตรวจสอบen.wikipedia.org/wiki/Y2K38สำหรับคำอธิบาย
Kevin M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.