21億4748万5548年問題

読み:にじゅういちおく・よんせんななひゃくよんじゅうはちまん・ごせんごひゃくよんじゅうはち・ねんもんだい
外語:year 2,147,485,548 problem 英語
品詞:名詞

64ビット化されたtime_tCで開発されたアプリケーションの組み合わせで生じる時限爆弾の一つ。

目次

32ビット長のtime_tは、符号を考慮すると31ビットしかなく、このため2038年問題が存在する。

その解決として、timt_tは64ビット化され、符号を考慮すると63ビット長となった。

充分な長さがあり、この長さすべてが使えるなら人類が生存する間は安泰と見込まれた。しかし―

time_tは64ビット化されたが、一つだけ手抜かりがあり、実は有効63ビットすべてを使うことができない。

Cでは、localtime()関数などを用いて日時に変換し結果をstruct tmに得る。さて、struct tm内で、年を格納する変数はint tm_yearであるが、途中でこれがオーバーフローしてマイナスになってしまい、正常動作しなくなるのである。要するに、年が31ビットに収まらないため、問題が生じてしまう。

tm_yearは1900年からのオフセットであるため、結果として、年は0x7fffffff+1900(=2147485547)まで、つまり日時にして2147485547/12/31 23:59:59までしか扱えないということになる。

このときのtime_tは、0xf0c29d868bfd7fである。つまりこの翌年に問題が生じる、21億4748万5548年問題があることになる。

なお、オーバーフロー時、GCC 4.4.3はデタラメな結果を返すが、clang/LLVMは1900/01/00 00:00:00を返す。つまりstruct tmの中をゼロクリアして返却する。

用語の所属
20XX年問題
関連する用語
time_t
2038年問題

コメントなどを投稿するフォームは、日本語対応時のみ表示されます


KisoDic通信用語の基礎知識検索システム WDIC Explorer Version 7.04a (27-May-2022)
Search System : Copyright © Mirai corporation
Dictionary : Copyright © WDIC Creators club