Tiếng Việt

Công cụ dành cho nhà phát triển · Trình chuyển đổi dấu thời gian Unix

Sự cố 2038 năm: điều gì xảy ra khi 32-bit time_t tràn

· Lý lịch

dấu thời gian unix-time gỡ lỗi

Bộ đếm 32-bit đã ký đạt đến ranh giới trên của nó bên cạnh dòng thời gian tiếp tục
Hình minh họa vector ToolAcre gốc

Vào 19 tháng 1 2038 lúc 03:14:07 UTC bộ đếm thứ hai 32 bit đã ký kết thúc thành 1901. Bài đăng này giải thích số học, trong đó thời gian 32-bit vẫn ẩn và cách nhận biết hệ thống sẽ bị ảnh hưởng.

Một ngày gần hơn người ta tưởng — các khoản thế chấp, chứng chỉ và chương trình cơ sở đã được tính toán đã qua 2038

Giới hạn ngày 2038 ảnh hưởng đến mã bất cứ khi nào nó tính toán thời hạn hết hạn, lịch trình hoặc thời hạn lưu giữ vượt quá thời điểm đó. Do đó, lỗi có thể xuất hiện sớm hơn nhiều năm so với ngày trên đồng hồ. Kho lưu trữ này không ghi lại các sản phẩm thế chấp, chứng chỉ hoặc phần sụn, vì vậy những ví dụ đó không được trình bày dưới dạng trường hợp được quan sát.

Câu hỏi kiểm tra thực tế là liệu có bất kỳ ranh giới nào lưu trữ các giây Unix trong số nguyên 32-bit đã ký hay không. Một trình duyệt hiện đại định dạng thành công một ngày trong tương lai không nói lên điều gì về trường hẹp hơn ở phía dưới. Theo dõi quá trình tuần tự hóa và tính bền bỉ, không chỉ giao diện người dùng.

Tìm kiếm các phép tính ngày trong tương lai trong các thử nghiệm ngày hôm nay thay vì chờ đợi đồng hồ sản xuất. Việc cố định ranh giới cố định sẽ biến mối quan tâm về lịch ở xa thành một cuộc kiểm tra ngay lập tức và có thể lặp lại.

Các tính toán trong tương lai có thể hiển thị giới hạn 32 bit trước 2038, nhưng các ngành được đặt tên không được chứng minh ở đây

Giá trị tối đa của số nguyên 32-bit có dấu là 2³¹−1 hoặc 2,147,483,647. Quá trình kiểm tra xác định nhiều giây sau kỷ nguyên đó là `2038-01-19T03:14:07.000Z`. Một giây toán học nữa phải là 03:14:08 và ToolAcre hiển thị nó vì JavaScript Số và Ngày có thể mang giá trị.

Việc gói thành giá trị âm yêu cầu thao tác 32-bit được ký bên ngoài; `fromEpoch` không thực hiện một thao tác nào. Kết quả 1901 tháng 12 thường được trích dẫn có thể được rút ra từ gói phần bù hai, nhưng tuyên bố rằng mọi hệ thống bị ảnh hưởng sẽ bao bọc thay vì từ chối, bão hòa hoặc hỏng sẽ vượt quá bằng chứng. Kiểm tra ranh giới thực tế.

Nếu một phép truyền bên ngoài bao trùm số học bù hai, hãy kiểm tra các bit được lưu trữ kết quả và giá trị âm được giải mã. Đừng suy luận bọc chỉ từ một ngày lịch sử bất ngờ.

Ngay lập tức chính xác được xác minh; hành vi bọc phụ thuộc vào hoạt động số nguyên bên ngoài

Tìm kiếm lược đồ, định nghĩa giao thức và bố cục nhị phân cho các trường có chữ ký 32-bit chứa giây kỷ nguyên. Cột SQL có tên INTEGER không đủ bằng chứng trên tất cả các công cụ và nền tảng được nhúng không tự động bị ảnh hưởng. Xác định độ rộng, ký hiệu, đơn vị và mã chuyển đổi cho từng đường dẫn.

Bao gồm các tệp và bản ghi được lưu trữ trong quá trình kiểm tra. Loại trong bộ nhớ được mở rộng vẫn có thể ghi định dạng hẹp cũ, trong khi cơ sở dữ liệu rộng có thể nhận giá trị máy khách bị cắt bớt. Tạo các giá trị cố định ở mức tối đa và một giá trị vượt quá, sau đó kiểm tra các byte hoặc giá trị cố định thay vì chỉ kiểm tra xem một hàm có trả về thành công hay không.

Xác định vị trí các trường kỷ nguyên 32-bit đã ký bằng cách kiểm tra các lược đồ và định dạng thực tế

Bản sửa lỗi về mặt khái niệm là một bản trình bày có phạm vi bao gồm các ngày bắt buộc, thường là số lượng được ký rộng hơn hoặc loại thời gian thích hợp. Tường thuật di chuyển hạt nhân, libc và định dạng của sổ làm việc nằm ngoài các tệp nguồn này. Mỗi hệ thống có khả năng tương thích và công việc triển khai riêng.

Mở rộng mọi ranh giới như một sự thay đổi hợp đồng phối hợp. Cập nhật bộ lưu trữ mà không có trường dây hoặc thư viện không có dữ liệu hiện có sẽ để lại một liên kết hẹp. Thêm phiên bản khi cần thiết và kiểm tra trình đọc cũ một cách rõ ràng. Bản thân định nghĩa thời đại không cần phải thay đổi; thùng chứa thì có.

Lập kế hoạch di chuyển phải bao gồm hành vi quay lui và phiên bản hỗn hợp. Trình ghi mới tạo ra các giá trị rộng có thể phá vỡ trình đọc cũ trước khi bất kỳ ngày nào vẫn tồn tại đến ranh giới lịch.

Mở rộng sự thể hiện là cách khắc phục cốt lõi; di chuyển hạt nhân và định dạng là dành riêng cho hệ thống

Chuyển đổi 2,147,483,647 thành giây để thu được `2038-01-19T03:14:07.000Z`; chuyển đổi 2,147,483,648 để nhận `2038-01-19T03:14:08.000Z`. Bước một giây suôn sẻ chứng tỏ đường dẫn ToolAcre không có vách đá 32-bit ở giá trị đó.

Bây giờ buộc các chữ số giống như mili giây. Chúng rơi vào tháng 1 1970 vì các giá trị trở thành khoảng 25 ngày sau 0. Sự so sánh đó giúp ngăn lỗi đơn vị bị gắn nhãn sai là vấn đề 2038. Chiều rộng và tỷ lệ trường là các kích thước độc lập.

Sự so sánh này cũng chứng minh lý do tại sao trình chuyển đổi mang tính chẩn đoán chứ không phải dễ bị tấn công: việc lựa chọn đơn vị rõ ràng sẽ xác định thang đo, trong khi cách trình bày rộng hơn của trình duyệt mang cả hai giá trị.

Ví dụ đã hoạt động: trình chuyển đổi vượt qua ranh giới vì JavaScript Ngày không được ký 32-bit giây

Kho lưu trữ cũng kiểm tra 4,294,967,295 giây dưới dạng `2106-02-07T06:28:15.000Z`, số lượng bit 32 không dấu tối đa. Nó không kiểm tra quá trình chuyển đổi GPS tuần hoặc chỉ định giới hạn mili giây 64 bit đã ký, vì vậy những chủ đề được đặt tên đó sẽ bị bỏ qua thay vì được khái quát hóa.

Phân tích ranh giới phải tuân theo loại chính xác được sử dụng. Việc chuyển từ đã ký sang chưa ký sẽ mở rộng một hướng nhưng loại bỏ ngày âm và vẫn tạo cạnh trên. Một đại diện có chữ ký rộng hơn thường bảo toàn cả hai hướng, tùy thuộc vào phạm vi ngày của người tiêu dùng.

Mỗi vách đá cần có nguồn gốc riêng từ chiều rộng, ký hiệu và đơn vị. Việc nhóm các lần chuyển đổi không liên quan trong “2038” sẽ che khuất trường nhị phân nào thực sự yêu cầu thay đổi.

Ranh giới 32-bit không dấu đã được kiểm tra; những vách đá được đặt tên khác là bằng chứng kho lưu trữ bên ngoài

Trình chuyển đổi không thể kiểm tra mã nguồn, tệp nhị phân, lược đồ cơ sở dữ liệu hoặc thiết bị được triển khai. Nó cho biết ý nghĩa của số ứng viên và cung cấp các thiết bị cố định cụ thể cho các cuộc kiểm tra. Tìm kiếm tĩnh, kiểm tra loại, kiểm tra số sê-ri và diễn tập di chuyển phải xác định xem sản phẩm có an toàn hay không.

Không đóng quá trình kiểm tra vì trình duyệt hiển thị 2038 chính xác. Điều đó chỉ xác minh đường dẫn trình duyệt này. Tuân theo giá trị từ đầu đến cuối, đặc biệt là thông qua các ràng buộc ngôn ngữ và các định dạng cũ có thể xảy ra việc thu hẹp ngầm.

Bao gồm các giao diện phụ thuộc và nhà cung cấp trong dấu vết đó. Nguồn ứng dụng có thể sử dụng loại rộng trong khi thư viện gốc hoặc giao thức thiết bị thu hẹp cùng một giá trị một cách vô hình.

Bài học rút ra: kỷ nguyên vẫn ổn, độ rộng số nguyên là vấn đề - và cách trình chuyển đổi dấu thời gian Unix cho phép bạn kiểm tra bất kỳ giá trị biên nào trong UTC và giờ địa phương

Vấn đề năm 2038 là ranh giới có chiều rộng số nguyên, không phải là lỗi trong số học kỷ nguyên Unix. Sự chuyển đổi thành công của ToolAcre ở cả hai bên làm cho sự tách biệt đó trở nên rõ ràng. Hệ thống bên ngoài chỉ bị lỗi nếu một trong các biểu diễn của nó không thể mang số đếm tiếp theo.

Sử dụng 2,147,483,647 và 2,147,483,648 làm vectơ kiểm tra liền kề, xác minh tính bền vững chính xác cũng như đơn vị tài liệu và chữ ký. Bằng chứng ở mọi ranh giới có giá trị hơn một danh sách kiểm tra chung về các công nghệ được cho là dễ bị tổn thương.

Các vectơ liền kề phải đi qua một đường dẫn tuần tự hóa thực chứ không chỉ là phép tính trong bộ nhớ. Đó là nơi mà một ứng dụng được mở rộng trên danh nghĩa có thể để lộ một đường nối hẹp còn lại.