2038年問題(Y2038)

32ビットUnix timestampがオーバーフローする2038年問題について解説。影響を受けるシステム、発生の仕組み、コードの対策方法を学べます。

Concept

2147483647

詳細な説明

2038年問題(Y2K38バグまたはEpochalypseとも呼ばれる)は、多くのシステムがUnix timestampを符号付き32ビット整数として格納していることに起因します。符号付き32ビット整数が保持できる最大値は2,147,483,647であり、これは2038年1月19日火曜日 03:14:07 UTCに相当します。その1秒後にカウンターがオーバーフローし、-2,147,483,648にラップアラウンドして、1901年12月の日付を表すことになります。

なぜ起こるのか:

符号付き32ビット最大値:  2^31 - 1 = 2,147,483,647
2進数:                  01111111 11111111 11111111 11111111
+1すると:               10000000 00000000 00000000 00000000
解釈結果:               -2,147,483,648 (負数、1901年に巻き戻る)

影響を受けるもの:

最もリスクが高いのは、32ビットプロセッサを使用する組み込みデバイス(IoTセンサー、医療機器、自動車システム)で、2038年にまだ稼働している可能性があるものです。time_tを32ビット型として使用する古いC/C++プログラム、timestampを32ビット整数で格納するレガシーデータベース、32ビットtimestampを使用するext3のようなファイルシステムも脆弱です。

修正方法:

解決策は64ビットtimestampを使用することです。符号付き64ビット整数は約2920億年先まで日付を表現できます。ほとんどの現代システムはすでに移行済みです:

  • Linux kernel 5.6以降は32ビットアーキテクチャでも64ビットtime_tを使用
  • 32ビットプラットフォーム上のglibcの最新版は64ビットtimeをサポート
  • JavaScript、Python、Java、Goは内部的にすでに64ビット(またはそれ以上)の型を使用

今すぐやるべきこと:

コードベースで32ビットtimestampストレージを監査してください。データベースのカラム型を確認しましょう。MySQLのTIMESTAMP型は2038-01-19 03:14:07が上限ですが、DATETIME9999-12-31まで拡張されます。組み込みシステムを開発している場合は、プラットフォームが64ビットtimeをサポートしていることを確認してください。2038年以降のtimestampでテストを実行し、本番環境で問題が発生する前にオーバーフローの問題を検出しましょう。

ユースケース

ビル管理システムや産業用コントローラなど長寿命のインフラ向けソフトウェアを開発する場合、これらのデバイスは15〜25年の寿命を持つことが多いため、今からY2038に備える必要があります。

Try It — Timestamp Converter

フルツールを開く