2038年問題

出典: フリー百科事典『ウィキペディア(Wikipedia)』

292277026596年問題 から転送)

2038年問題(にせんさんじゅうはちねんもんだい)は、2038年1月19日3時14分7秒(UTC)を過ぎると、コンピュータが誤動作する可能性があるとされる問題。

目次

[編集] 経緯

上から「二進数」「十進数」「問題のある時刻」「正しい時刻」の順番。

標準的なC言語の実装では、時刻の表現形式としてUNIX時間1970年1月1日0時0分0秒(UTC)からの経過秒数》を使用している。これはUNIXの仕様に由来するもので、time_tという。

C言語の規格を定めた「ISO/IEC 9899:1999」では、time_t型の範囲や精度はいずれも処理系依存としているが、[1]time_t型は、伝統的には符号つき32ビット整数(signed long int型)であり、最大値は (231 - 1) = 2,147,483,647 となる。つまり、2,147,483,647秒までしか計算できない。

このようなAPIの下で作られたアプリケーションでは、1970年1月1日0時0分0秒から2,147,483,647秒を経過した、2038年1月19日3時14分7秒を越えると、この値がオーバーフローし、と扱われる[2]ため、誤作動する可能性が高い。さらに、この仕様は他の多くのプログラミング言語でも採用されているため、それらの言語で作られたアプリケーションも同様に誤作動する可能性が高い。

また、ファイルシステムext2ext3ReiserFSタイムスタンプも同日付までしか対応していない。

ただし、この期日以前でもプログラムで内部的にこの秒数を超えた時刻データを扱おうとすれば同様のエラーが発生するため、2004年1月11日にはすでにATMの誤作動といったトラブルが発生した(プログラム中に現在時刻を2倍する式があったため、2,147,483,647秒の半分以上経過した時点で誤動作が発生した)。他にも顕在化していないトラブルが今後表面化するという可能性はあり得る。

以下のような理由により、2000年問題より深刻であるという指摘もある。

  • 2000年問題はアプリケーションレベルでの修正が可能であったが、この問題は現在普及しているC言語処理系の実装による。
  • 「32ビットの符号付二進数の桁あふれ」という理由を理解するには、ある程度の専門知識を必要とするので、一般大衆、経営者、政治家などの理解と関心を得にくい可能性がある。
  • 2000年問題のように暦年の変わり目というキリのよいときに地域の標準時に応じて波状的に問題の時刻が世界を巡るのではなく、ごく中途半端な時刻に世界同時に一斉に問題の時刻が訪れるので、もし問題が生じた場合は対応するための人的資源の確保がより困難となる可能性がある。

[編集] 対策

対策としては、time_t型を符号つき64ビット整数型(一般にはlong long int型)にするという方法がある。符号つき64ビット整数型の場合、上限は9,223,372,036,854,775,807(263 - 1)である。

しかし、2038年問題と同じように考えると、292277026596年に桁あふれが起こる可能性があり、これを「292277026596年問題」と呼ぶこともある。ただ、符号つき64ビット整数型は、上記の通り、292277026596年(西暦3000億年近く)まで使用できるので、この問題は宇宙の歴史(推定137億年)の20倍から21倍ほどの時間が経過しないと発生しない。西暦10000年問題と同じく、真面目な話ではなく、一種のジョークとして語られている。

最近のオペレーティングシステム処理系では、time_t型は符号つき64ビット整数型で表されるようになってきている。

[編集] 関連した問題

  • 秒数を2倍して計算すると桁数がオーバーフローしてしまうため元に戻しても結果がおかしくなる。半分になるのは1,073,741,824秒目であり、2004年1月10日13時37分4秒となる。
  • 2001年9月9日問題は、2001年9月9日にtime_t型の値が999,999,999秒から1,000,000,000秒と桁が増えることに伴う問題。
  • NTPMicrosoft Windowsなど、1900年1月1日からの積算秒数で時間を表現するシステムもあり、符号なし32ビットの値が2036年2月6日にオーバーフローすることによって問題が発生する(→2036年問題)。

[編集] 脚注

[ヘルプ]
  1. ^ "The range and precision of times representable in clock_t and time_t are implementation-defined.", ISO/IEC 9899 7.23.1.4
  2. ^ 時刻の場合、2038年1月19日3時14分7秒の次は、1901年12月13日20時45分52秒となる。

[編集] 関連項目

[編集] 外部リンク