Alat pembangun · Penukar cap masa Unix
Masalah tahun 2038: apa yang berlaku apabila 32-bit time_t melimpah
· Latar belakang
cap masa masa unix penyahpepijatan
Pada 19 Januari 2038 di 03:14:07 UTC yang ditandatangani 32-bit pembalut kedua kepada 1901. Siaran ini menerangkan aritmetik, di mana masa 32-bit masih bersembunyi dan cara mengenali sistem yang akan terjejas.
Tarikh yang lebih dekat daripada yang didengari — gadai janji, sijil dan perisian tegar sudah mengira tarikh melepasi 2038
Had bertarikh 2038 mempengaruhi kod apabila ia mengira tarikh akhir tamat, jadual atau pengekalan melebihi titik itu. Oleh itu, kegagalan boleh muncul beberapa tahun lebih awal daripada tarikh jam. Repositori ini tidak mendokumenkan produk gadai janji, sijil atau perisian tegar, jadi contoh tersebut tidak dibentangkan sebagai kes yang diperhatikan.
Soalan audit praktikal ialah sama ada mana-mana sempadan menyimpan saat Unix dalam integer 32-bit yang ditandatangani. Pelayar moden berjaya memformat tarikh masa hadapan tidak mengatakan apa-apa tentang medan yang lebih sempit di hiliran. Jejaki siri dan ketekunan, bukan sahaja antara muka pengguna.
Cari pengiraan tarikh masa hadapan dalam ujian hari ini daripada menunggu jam pengeluaran. Lekapan sempadan tetap menukar kebimbangan kalendar yang jauh menjadi pemeriksaan segera yang boleh diulang.
Pengiraan tarikh hadapan boleh mendedahkan had 32-bit sebelum 2038, tetapi industri yang dinamakan tidak dibuktikan di sini
Maksimum integer 32-bit yang ditandatangani ialah 2³¹−1 atau 2,147,483,647. Ujian menetapkan bahawa beberapa saat selepas zaman itu sebagai `2038-01-19T03:14:07.000Z`. Satu saat matematik lagi hendaklah 03:14:08 dan ToolAcre memaparkannya kerana JavaScript Nombor dan Tarikh boleh membawa nilai.
Membungkus kepada nilai negatif memerlukan operasi 32-bit yang ditandatangani luaran; `fromEpoch` tidak melaksanakannya. Keputusan 1901 Disember yang sering disebut boleh diperolehi untuk balut pelengkap dua, tetapi mendakwa bahawa setiap pembalut sistem yang terjejas dan bukannya menolak, tepu atau rosak akan melebihi bukti. Uji sempadan sebenar.
Jika cast luaran membungkus aritmetik pelengkap dua, periksa bit disimpan yang terhasil dan nilai negatif yang dinyahkod. Jangan menyimpulkan bungkus semata-mata daripada tarikh sejarah yang tidak dijangka.
Segera atas tepat disahkan; kelakuan bungkus bergantung pada operasi integer luaran
Skema carian, takrifan protokol dan susun atur binari untuk medan bertanda 32-bit yang memegang detik zaman. Lajur SQL bernama INTEGER tidak cukup bukti merentas semua enjin dan platform terbenam tidak terjejas secara automatik. Tentukan lebar, tandatangan, unit dan kod penukaran untuk setiap laluan.
Sertakan fail dan rekod cache dalam audit. Jenis dalam memori yang diluaskan masih boleh menulis format sempit lama, manakala pangkalan data yang luas boleh menerima nilai pelanggan yang dipotong. Cipta lekapan pada maksimum dan satu lagi, kemudian periksa bait atau nilai berterusan dan bukannya sekadar menyemak bahawa fungsi mengembalikan kejayaan.
Cari medan zaman 32-bit yang ditandatangani dengan memeriksa skema dan format sebenar
Pembetulan konseptual ialah perwakilan yang julatnya termasuk tarikh yang diperlukan, biasanya kiraan yang ditandatangani lebih luas atau jenis temporal yang sesuai. Kernel buku kerja, libc dan naratif penghijrahan format berada di luar fail sumber ini. Setiap sistem mempunyai keserasian dan kerja penggunaannya sendiri.
Luaskan setiap sempadan sebagai perubahan kontrak yang diselaraskan. Mengemas kini storan tanpa medan wayar, atau pustaka tanpa data sedia ada, meninggalkan pautan sempit. Tambahkan versi jika perlu dan uji pembaca lama secara eksplisit. Takrifan zaman itu sendiri tidak perlu diubah; bekas itu lakukan.
Perancangan migrasi mesti termasuk gelagat rollback dan versi campuran. Penulis baharu yang menghasilkan nilai luas boleh memecahkan pembaca lama sebelum sebarang tarikh yang berterusan mencapai sempadan kalendar.
Memperluaskan perwakilan ialah pembetulan teras; penghijrahan kernel dan format adalah khusus sistem
Tukar 2,147,483,647 sebagai saat untuk mendapatkan `2038-01-19T03:14:07.000Z`; tukar 2,147,483,648 untuk mendapatkan `2038-01-19T03:14:08.000Z`. Langkah satu saat yang lancar membuktikan laluan ToolAcre tidak mempunyai tebing 32-bit pada nilai tersebut.
Sekarang paksa angka yang sama seperti milisaat. Ia jatuh pada bulan Januari 1970 kerana nilai menjadi kira-kira dua puluh lima hari selepas sifar. Perbandingan itu menghalang kesilapan unit daripada disalahlabelkan sebagai masalah 2038. Lebar dan skala medan adalah dimensi bebas.
Perbandingan ini juga menunjukkan sebab penukar adalah diagnostik dan bukannya terdedah: pemilihan unit yang jelas menentukan skala, manakala perwakilan pelayar yang lebih luas membawa kedua-dua nilai.
Contoh berfungsi: penukar melintasi sempadan kerana JavaScript Tarikh tidak ditandatangani 32-bit saat
Repositori juga menguji 4,294,967,295 saat sebagai `2106-02-07T06:28:15.000Z`, bilangan maksimum 32-bit yang tidak ditandatangani. Ia tidak menguji peralihan minggu GPS atau menentukan tebing milisaat 64-bit yang ditandatangani, jadi topik yang dinamakan ditinggalkan dan bukannya digeneralisasikan.
Analisis sempadan harus mengikut jenis penggunaan yang tepat. Beralih daripada ditandatangani kepada tidak ditandatangani memanjangkan satu arah tetapi mengalih keluar tarikh negatif dan masih mencipta tepi atas. Perwakilan yang ditandatangani lebih luas secara amnya mengekalkan kedua-dua arah, tertakluk pada julat tarikh pengguna.
Setiap tebing memerlukan terbitan sendiri daripada lebar, tanda dan unit. Mengumpulkan peralihan yang tidak berkaitan di bawah "2038" mengaburkan medan perduaan yang sebenarnya memerlukan perubahan.
Sempadan 32-bit yang tidak ditandatangani diuji; tebing lain yang dinamakan adalah bukti repositori di luar
Penukar tidak boleh mengaudit kod sumber, binari, skema pangkalan data atau peranti yang digunakan. Ia menunjukkan maksud nombor calon dan membekalkan lekapan konkrit untuk ujian. Carian statik, pemeriksaan jenis, ujian bersiri dan latihan migrasi mesti menentukan sama ada produk itu selamat.
Jangan tutup audit kerana pelayar memaparkan 2038 dengan betul. Itu sahaja mengesahkan laluan pelayar ini. Ikuti nilai hujung ke hujung, terutamanya melalui pengikatan bahasa dan format lama di mana penyempitan tersirat boleh berlaku.
Sertakan pergantungan dan antara muka vendor dalam surih itu. Sumber aplikasi mungkin menggunakan jenis yang luas manakala perpustakaan asli atau protokol peranti mengecilkan nilai yang sama secara tidak kelihatan.
Bawa pulang: zamannya baik-baik saja, lebar integer adalah masalahnya — dan cara penukar cap waktu Unix membolehkan anda menyemak sebarang nilai sempadan dalam UTC dan waktu tempatan
Isu tahun 2038 ialah sempadan lebar integer, bukan kecacatan dalam aritmetik zaman Unix. Penukaran ToolAcre yang berjaya pada kedua-dua belah pihak menjadikan pemisahan itu kelihatan. Sistem luaran gagal sahaja jika salah satu perwakilannya tidak dapat membawa kiraan seterusnya.
Gunakan 2,147,483,647 dan 2,147,483,648 sebagai vektor ujian bersebelahan, sahkan kegigihan yang tepat dan unit dokumen serta tandatangan. Bukti di setiap sempadan adalah lebih berharga daripada senarai semak generik bagi teknologi yang dikatakan terdedah.
Vektor bersebelahan harus melintasi laluan bersiri sebenar, bukan sahaja pengiraan dalam memori. Di situlah aplikasi yang diluaskan secara nominal boleh mendedahkan jahitan sempit yang tinggal.