Khả năng của vấn đề năm 2038 là rất có vấn đề?
Khả năng của vấn đề năm 2038 là rất có vấn đề?
Câu trả lời:
Tôi đã gặp phải vấn đề này trong một hệ thống Linux nhúng cần xử lý ngày 2038 trong một số chứng chỉ mật mã dài hạn, vì vậy tôi muốn nói rằng sự giống nhau của điều này phụ thuộc vào miền ứng dụng của bạn.
Mặc dù hầu hết các hệ thống nên sẵn sàng trước năm 2038, nhưng nếu bạn thấy mình tính toán ngày hôm nay trong tương lai, bạn có thể gặp vấn đề.
mktime
cuộc gọi đã âm thầm thất bại.
Tôi nghĩ rằng đây sẽ là một vấn đề quan trọng, nguy hiểm hơn nhiều so với các vấn đề Y2K năm 1999/2000 bởi vì mã bị ảnh hưởng thường ở cấp độ thấp hơn (đó là CTIME) và do đó khó phát hiện ra những nơi lưu trữ thời gian theo cách đó.
Để làm phức tạp vấn đề hơn nữa, việc Y2K bị coi là một đội hình ẩm ướt sẽ khiến việc thu hút sự chú ý đến vấn đề trong sự kiện diễn ra sự kiện trở nên khó khăn hơn.
Tài liệu tham khảo văn hóa:
Cory Doctorow đang thử một mô hình mới để bắt đầu / xuất bản truyện ngắn theo giấy phép mở và tôi đã đề xuất một chủ đề năm 2038, một trong số đó, anh ấy đã làm rất xuất sắc trong Epoch: http://craphound.com/?p=2337
Vài năm trước, đã có báo cáo về các vấn đề đã xảy ra, trong các lĩnh vực như các chương trình thế chấp thực hiện tính toán cho các khoản vay 30 năm: 2008 + 30 = 2038.
Một hệ điều hành 64 bit cuối cùng không liên quan đến vấn đề 2037. (CTIME hết gần năm 2037 so với năm 2038).
Câu hỏi không phải là độ sâu bit của HĐH, mà là hệ điều hành lưu trữ thời gian như thế nào. Hoặc làm thế nào để cột cơ sở dữ liệu chọn để lưu trữ thời gian. Hoặc làm thế nào để thư mục này dịch vụ thời gian thuộc tính cú pháp lưu trữ thời gian ở phía sau.
Đây là một vấn đề lớn hơn nhiều so với mọi người nghĩ, vì nó rất đặc hữu và phổ biến khi sử dụng bộ đếm thời gian 32 bit.
Mỗi trường hợp lưu trữ thời gian cần phải được xem lại và tất cả các API được cập nhật và tất cả các công cụ sử dụng nó cũng được cập nhật.
Các lớp trừu tượng cho phép bạn đặt thời gian thông qua định dạng thời gian có thể đọc được của con người, thay vì dữ liệu thô được viết ra giúp dễ dàng hơn, nhưng đó chỉ là một trường hợp.
Tôi nghi ngờ đây sẽ là một thỏa thuận lớn hơn nhiều so với hầu hết mọi người nghĩ.
time_t
. Nó lưu trữ năm, tháng và ngày dưới dạng các trường trong một giá trị 16 bit: 5 bit cho ngày, 4 cho tháng, để lại 7 cho năm. 2107 là 1980 (năm số 0 ở vùng đất FAT) + 2 ^ 7-1. Để vui hơn, FAT lưu trữ thời gian trong ngày theo cùng một cách trong một giá trị 16 bit khác, nhưng nếu bạn làm toán, bạn thấy rằng bạn cần 17 bit để lưu trữ thời gian trong ngày theo cách này. FAT khắc phục điều này bằng cách giảm một chút độ phân giải trong vài giây; FAT không thể phân biệt các thay đổi cách nhau dưới 2 giây. Ah, Microsoft, thật là một thế giới nhàm chán nếu không có sự không tương thích không cần thiết của bạn!
Đây là ý kiến của tôi, nhưng vấn đề này là do sự cố bộ đếm 32 bit, ngày nay hầu hết các hệ điều hành được cập nhật để xử lý thời gian trên 64 bit (ít nhất là trên máy tính 64 bit), vì vậy tôi đoán rằng tất cả hệ điều hành và phần mềm sẽ sẵn sàng lâu thời gian trước năm 2038, giả sử năm 2020. Vì vậy, bạn chỉ có thể gặp sự cố nếu vào năm 2038, bạn vẫn sẽ chạy phần mềm từ năm 2020.
Nó có thể không phải là vấn đề trong hầu hết mọi trường hợp. Tôi hi vọng.
Trong phiên bản Y2K đầu tiên, trong đó các nhà cung cấp phần mềm và phần cứng được yêu cầu chứng nhận sản phẩm của họ là "tuân thủ Y2K" để bán (Tôi nhớ rằng cáp mạng trên PC Connection được chứng nhận Y2K tuân thủ) rất nhiều công ty đã kiểm tra chi tiết mọi thứ , bằng cách đặt đồng hồ trong tương lai và thử nghiệm.
Vào thời điểm đó, vì chi phí thử nghiệm rất cao, nên hầu như họ luôn thử nghiệm với một số ngày, chẳng hạn như 1/1/99 (một số nhà phát triển có thể đã sử dụng 99 như một tình cảm), 12/12/99, 1/1 / 00, bước nhảy vọt của năm 2000, 1/19/38 và nhiều thứ khác. Xem ở đây cho một danh sách tẻ nhạt.
Vì vậy, tôi tin rằng bất kỳ phần mềm quan trọng nào xuất hiện vào năm 1999 có thể sẽ không có 2038 lỗi, nhưng phần mềm mới được viết bởi những lập trình viên không biết gì có thể. Sau khi toàn bộ các lập trình viên của Y2K nói chung đã nhận thức rõ hơn về các vấn đề mã hóa ngày, do đó, nó không có khả năng gây ảnh hưởng lớn như Y2K (mà, bản thân nó, là một thứ gì đó của thuốc chống sốt rét).
Hệ thống 32 bit vẫn chạy sau đó sẽ là một vấn đề.
#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));
}
nó phải là 1 thay vì 9 nhưng ctime không xử lý ngày lớn hơn:
8 - Sun Jun 13 07:26:08 1141709097
Thời gian hệ thống của tôi (64 bit) có thể chạy thêm 1 triệu năm nữa. Giải pháp là cập nhật hệ thống lên 64 bit.
Điều hấp dẫn là các chương trình có thể không xử lý nó. Đặc biệt là cũ, đúng cách và không được duy trì. Devs được sử dụng để theo dõi sự thật:
int
Của chúng là 32 bit (thực tế chúng được bảo toàn là 32 bit trên các hệ thống 64 bit trong số các bit khác vì nó được giả định là chúng luôn có 32 bit)time_t
) có thể được đúc một cách an toànint
Trong phần mềm FLOSS phổ biến, cả hai điều có thể sẽ không thông qua đánh giá 'nhiều mắt'. Trên ít phổ biến và phù hợp, nó sẽ phụ thuộc rất nhiều vào tác giả.
Tôi đoán trên thế giới * nix miễn phí, năm 2038 sẽ nhận được 'không chú ý' trong khi tôi mong đợi các vấn đề trên nền tảng "đúng cách" (tức là những phần mềm có số lượng lớn phần mềm phù hợp) - đặc biệt là nếu một số phần quan trọng sẽ không được duy trì.
time_t
(hoặc tương đương) trên HĐH 32 bit xảy ra có 32 bit trong khi time_t
(hoặc tương đương) trên HĐH 64 bit xảy ra có 64 bit. Tôi nghĩ rằng nó đã đủ rõ ràng ngay cả khi với sự đơn giản hóa nhất định.
Nếu đó là bất cứ thứ gì như Y2K, một số người đã bị ảnh hưởng và đang thay đổi phần mềm, nhưng hầu hết các nhà phát triển sẽ bỏ qua nó cho đến khoảng những năm 2030, có thể là 2035 hoặc lâu hơn, tại thời điểm đó sẽ có rất nhiều công việc được thực hiện và bất kỳ ai cũng đủ tuổi để biết K & R C và chưa quá già sẽ đột nhiên có thể ký hợp đồng với rất nhiều tiền. Việc chuyển đổi thực tế sẽ cho thấy rất nhiều điều chưa được thực hiện, có lẽ không có gì quan trọng cả.
Vấn đề Y2K là hai biểu đồ đại diện cho năm thay vì bốn.
Nhiều hệ thống không có cách nào để phân biệt giữa năm 2000 và 1900 vì chúng chỉ lưu trữ '00'.
Hầu như tất cả các hệ thống hiện nay đều sử dụng 4 ký tự để lưu trữ trong năm hoặc chúng sử dụng một thư viện nào đó.
Vì vậy, hãy để tất cả lo lắng về năm 10000 (Y10K) thay vào đó. Ngoại trừ các nhà văn hệ điều hành và thư viện ...