整数型の上限に起因するバグ
その昔,2000年問題というバグで世の中が大騒ぎになった。1900年代は西暦の下2桁で年号を表すのが一般的だったが,1999年になって,やばいということに気づき,パニックになった。
日本で昭和時代に作られたソフトは,2桁の昭和の年を使っているものがある。昭和64年の途中から平成元年になっても,昭和64年のままとした。平成31年(昭和94年)の途中から平成元年になり,平成6年には昭和99年となり,平成7年に破綻する。
2022年1月1日に,Microsoft Exchange Serverが止まってしまった(例えばITmediaの記事参照)。どうやら日付を西暦下2桁のYYを使ってYYMMDDnnnnのような形で表していたようで,2022年になると2201010001のような日付になり,32ビットint型の上限を超えてしまったのが原因らしい。32ビットint型(符号付き32ビット整数)の上限は2147483647である(ちなみに,上記記事では当初signed int32を「署名付きのint32」と訳していたが,すぐに「符号付きのint32」に直された。signedには署名付きという意味と符号付きという意味がある)。 UNIXおよびその末裔(LinuxもMacも)は1970年1月1日0時を起点とする秒数で時刻を表す。C言語では time(NULL) で取得できる。結果の型は time_t 型であるが,これは当初は32ビットint型であった。したがって 2147483647 までしか表すことができない。その日はいつであろうか? その時刻から1秒後には,どのような値になるであろうか(2038年問題)。今自分が使っている処理系はどうなっているか調べてみよう。ヒント:
code:test.c
int main(void)
{
time_t now = time(NULL);
printf("%ld, %lu\n", now, sizeof(now));
return 0;
}