ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
64ビット化されたtime_tとCで開発されたアプリケーションの組み合わせで生じる時限爆弾の一つ。
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の中をゼロクリアして返却する。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます