| ア | イ | ウ | エ | オ |
| カ | キ | ク | ケ | コ |
| サ | シ | ス | セ | ソ |
| タ | チ | ツ | テ | ト |
| ナ | ニ | ヌ | ネ | ノ |
| ハ | ヒ | フ | ヘ | ホ |
| マ | ミ | ム | メ | モ |
| ヤ | ユ | ヨ | ||
| ラ | リ | ル | レ | ロ |
| ワ | ヰ | ヴ | ヱ | ヲ |
| ン |
| 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の中をゼロクリアして返却する。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます