6 คะแนน โดย xguru 2021-12-30 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • หลังจาก 2038-01-09 3:14:07 UTC ไปแล้ว time_t แบบ 32-bit จะเกิด overflow

  • เคอร์เนลลินุกซ์ได้เปลี่ยนภายในเป็น 64-bit มาหลายปีก่อนแล้ว และ Alpine ก็เปลี่ยนเป็น time_t แบบ 64-bit ตั้งแต่ 3.13

  • GNU glibc เริ่มรองรับ time_t แบบ 64-bit ตั้งแต่ 2.34 แต่แนวทางการเข้าถึงยังไม่สมบูรณ์ทางเทคนิค

  • musl และ implementation ของ UNIX C library อื่น ๆ ใช้ time_t แบบ 64-bit เสมอในโค้ดใหม่ และมี compatibility stub สำหรับโค้ด 32-bit เดิม

→ ทำให้เมื่อเวลาผ่านไปสามารถเข้ากันได้กับ Y2038 โดยอัตโนมัติ

  • Microsoft ไปไกลกว่าใน msvcrt โดยใช้ time_t แบบ 64-bit เป็นค่าเริ่มต้น และหากใช้แมโคร _USE_32BIT_TIME_T ก็จะเข้าถึงฟังก์ชัน 32-bit แบบเดิมได้

  • GNU glibc ใช้วิธีที่ตรงกันข้ามกับสองแบบข้างต้นพอดี

→ ต้องระบุ -D_TIME_BITS=64 อย่างชัดเจนจึงจะใช้งานได้

→ สักวันหนึ่งค่าเริ่มต้นนี้อาจเปลี่ยนได้ แต่จนถึงตอนนี้ก็ยังไม่ทำเลย

⇨ ในทำนองเดียวกัน -D_FILE_OFFSET_BITS=64 ที่จำเป็นสำหรับจัดการไฟล์ใหญ่กว่า 2GiB ก็ยังต้องระบุเองอยู่

→ นอกจากนี้ บนระบบ 32-bit ก็ไม่ควร build ด้วย -D_TIME_BITS=64 (กล่าวคือ ไม่สามารถรองรับ Y2038 ได้)

1 ความคิดเห็น

 
xguru 2021-12-30

ยังเหลือเวลาอีกราว 16 ปี แต่ลินุกซ์ก็ถูกใช้งานในอุปกรณ์จำนวนมากที่ไม่ได้ถูกเปลี่ยนบ่อยนักด้วย..