21億4748万5548年問題
読み:にじゅういちおく-よんせんななひゃくよんじゅうはちまん-ごせんごひゃくよんじゅうはち-ねんもんだい
外語:year 2,147,485,548 problem
64ビット化されたtime_tとCで開発されたアプリケーションの組み合わせで生じる時限爆弾の一つ。
概要
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の中をゼロクリアして返却する。
再検索