SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

伏石ちゃんは意図に反したい

2038年問題はなぜ起こる? 2036年問題との違いは?【伏石ちゃんは意図に反したい】

FILE 0x05 2038年問題


  • X ポスト
  • このエントリーをはてなブックマークに追加

解説:教えて那々子先生

充希
――って話を聞いたんです
先生
2038年問題か……。私が生まれる前の話だな
充希
ええ! そうなんですか!
先生
私をいくつだと思ってんだ
充希
マズい……
先生
おい、何がマズい?

2038年問題はなぜ起こる?

充希
ところで、2038年問題は整数オーバーフローの問題って聞きました
先生
ああ、その通り。UNIX時間では1970年01月01日からの経過秒数で時刻を表す。その秒数が符号付き32ビット整数のシステムでトラブルが起きたんだ
先生
OKコンピューター、教えてやれ
コンピューター
はい

 UNIX時間は、UNIX系のOS(Unix、BSD、Linuxなど)で採用されている時刻の表現方法で、世界協定時(UTC)で1970年01月01日 0時0分0秒からの(閏秒を除いた)経過秒数で時刻を表します。この時刻表現方法は、UNIX系のOSだけでなく、C言語の多くの処理系でtime_t型の内部表現としても採用されています。

 多くの処理系で事実上UNIX時刻が採用されていますが、time_t型について、C99(ISO/IEC 9899:1999)では「which are arithmetic types capable of representing times」、C11(ISO/IEC 9899:2011)規格では、「which are real types capable of representing times」とのみ定められています。そのため、UNIX時刻ではない場合や整数型でない場合も考えられます。

 時刻の表現にUNIX時間を用い、なおかつデータの格納に符号付き32ビット整数を用いているシステムでは、2038年01月19日 午前3時14分7秒に最大値に達し、同8秒でオーバーフローが発生します。その結果、マイナスの数値となり、最小値である1901年12月13日 20時45分52秒にジャンプしてしまうのです。

UNIX時間におけるオーバーフロー
時刻(UTC) 10進数 2進数
1970/01/01 00:00:00 0 00000000000000000000000000000000
1970/01/01 00:00:01 1 00000000000000000000000000000001
1970/01/01 00:00:02 2 00000000000000000000000000000010
   
2038/01/19 03:14:05 2147483645 01111111111111111111111111111101
2038/01/19 03:14:06 2147483646 01111111111111111111111111111110
2038/01/19 03:14:07 2147483647 01111111111111111111111111111111
1901/12/13 20:45:52 -2147483648 10000000000000000000000000000000

 その結果、時刻順でソートする処理で想定外の動きになったり、処理対象のデータが検索でヒットしなくなる、データチェックで不正データと判定されるなど、色々な不具合が発生するのです。

 さらに厄介なのが、日本時刻では平日の日中という業中まっただ中に発生するということです。そして、日付がジャンプすることにより、火曜日が突然木曜日になってしまうことから、バッチの実行スケジュールにも大きな影響が生じ得ます。

 2000年問題よりもさらに深刻なのは、UNIX時間かつ符号付き32ビット整数を採用しているシステムが非常に多いことです。

 例えば、Linuxカーネル5.6よりも前の32ビット版Linuxも2038年問題を抱えていました。また、ext3ファイルシステムでは、ファイルの更新時刻に2038年01月19日 午前3時14分8秒以降の時刻を記録できません。しかし、そもそも「ファイルシステムに何を使用しているか?」を意識していないユーザーも多く、充分な対応を行わないまま2038年を迎えてしまう……ということもあるかもしれません。

 現在は、多くのC言語の処理系で、time_t型に符号付き64ビット整数が採用されていますが、昔コンパイルされたプログラムはその恩恵にあずかることができません。修正にはソースコードの変更と再コンパイル、場合によっては入出力データ仕様にも変更を加える必要があります。したがって、そもそもソースコードが残っていないようなソフトウェアではもはや対応できない可能性があるということなのです。

 また、64ビットのtime_tを使っているから2038年問題に対応していると思っていても、システムの一部に非対応のプログラムが混じっていると、異常動作が引き起こされることがあります。例えば、32ビットのtime_tの値がオーバーフローでマイナスになってしまえば、その後で、その値を64ビットのtime_tに代入してもマイナスのままだからです。

充希
だから色々な異常が起きたんですね
先生
2038年頃というと、京姫鉄道の無線式ATCが導入された頃だったか。処理のどこかで枯れたプログラムライブラリを使ってて、内部に32ビットのtime_tが残っていたりしたんだろう
充希
あぁ……
先生
ああいうシステムだと、古い時刻のデータを受信するとエラーになるようになっている。一定期間正常なデータを受信できなければ、安全のため、非常ブレーキが掛かるように設計されているからな
充希
そんなの対処のしようがなかったんでしょうね
先生
いや、言い訳はできないだろうな。鉄道関係だと、その前の2年前にも大混乱が起きたはずなんだ。2036年問題が
充希
2036年問題?

次のページ
2036年問題とは

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
伏石ちゃんは意図に反したい連載記事一覧

もっと読む

この記事の著者

井二 かける(イブタ カケル)

 情報処理安全確保支援士、プログラマー、作家。「物語の力でIT・セキュリティをもっと面白く」をモットーに、作家活動、セキュリティ啓発活動を行う。主な作品はアニメ「こうしす!」、小説「こうしす!社内SE祝園アカネの情報セキュリティ事件簿」(翔泳社)、マンガ「伏石ちゃんは意図に反したい ~ハッキングから始まる高校生活~」(京姫鉄道出版)など。 Twitter:@k_ibuta@kyoki_railway

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山口 しずか(ヤマグチ シズカ)

 やりたいことはなんでもやる精神で急成長中の漫画家。2019年よりマンガアプリにて商業連載デビュー。連載の傍ら企業のPR漫画や漫画動画など媒体・ジャンルにとらわれず時代に合わせた漫画を制作中。趣味はお酒と旅行。 Twitter:@shizuckey

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15216 2021/12/13 14:03

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング