OS X 10.6 "Snow Leopard"より前のすべてのバージョンには、2038年の問題があります。10.6のほとんどのインストールと10.7 "Lion"のすべてのインストールにより、問題の主な原因が修正されました。ほとんどなくなっていますが、2038年のバグはいくつかのアプリで生き残るかもしれません。
私の古いPowerPC MacはOS X 10.4.11「Tiger」を実行しています。システム環境設定の日付と時刻に行き、2038年以降の日付を入力しようとしましたが、2037年12月31日に日付をリセットしました。2038年に何かが間違っていることがわかりました。
OS Xは、BSD経由でUnixから派生しています。OS X用アプリは、ファイルを開いたりインターネットに接続したりするためにBSDシステムコールを使用します。BSDには長い歴史があり、そのシステムコールの一部は1980年代からのものです。そのシステムコールの1つはgettimeofday()
、4.1cBSDで初めて登場しました。UC Berkeley は、2038年の半世紀以上前の1982年に4.1cBSDをリリースしました。時間gettimeofday()
はの整数ですtime_t
。秒をカウントします。ゼロは、1970-01-01 00:00:00 UTCのUnixエポックです。
私の古いPowerPC Macではtime_t
、符号付き32ビット整数です。これにより、2038年の問題が発生します。署名された32ビットtime_t
の範囲は-2147483648〜2147483647です。これは、1901-12-13 20:45:52 UTC〜2038-01-19 03:14:07 UTCの時間しか保持できません。これがオーバーフローすると、gettimeofday()
2038年1月19日月曜日から1901年12月13日金曜日に日付が反転します。
修正は、32ビットtime_t
から64 ビットに移行することですtime_t
。OS Xの場合、この移行は32ビットポインターから64ビットポインターへの別の移行とともに発生しましたが、64ビットポインターには64ビットプロセッサが必要です。Appleはtime_t
、64ビットプロセッサ用に64 ビットのみを提供しています。32ビットプロセッサが64ビットを処理することは可能ですtime_t
が、Appleはその機能を提供しませんでした。
Appleのコンパイラは、OS X 10.0 "Cheetah"(time_t
32ビットおよびoff_t
64ビット)以来、32ビットプロセッサで64ビット整数をサポートしています。UnixおよびBSDではoff_t
、ファイルまたはディスク全体のサイズです。32ビットでoff_t
は、OS Xは2 GiB未満のディスクに制限されます。Apple off_t
は64ビットと定義したため、OS Xはより大きなディスクで動作しました。Apple time_t
は10.0で32ビットと定義したため、time_t
後で64ビットへの移行が必要になりました。
私の古いPowerPC Macでは、ヘッダーファイル<ppc/_types.h>
は__darwin_time_t
として定義されていlong
ます。Intel Macの場合、ヘッダー<i386/_types.h>
は同じことを行います。OS Xではlong
、ポインターと同じサイズになります。したがって、ポインターが64ビットになり、64ビットにlong
もなり、64ビットにもなりtime_t
、2038年問題の主な原因が修正されました。
Appleの64ビット移行ガイドには、「OS X v10.6より前は、オペレーティングシステムに同梱されていたアプリケーションはすべて32ビットアプリケーションでした。v10.6以降、オペレーティングシステムに同梱されているアプリケーションは一般に64ビットアプリケーションです。 」ウィキペディアから、10.6にはIntelプロセッサが必要であり、10.7には64ビットIntelプロセッサが必要であることを知っています。32ビットIntelプロセッサで10.6を実行しているMacには、32ビットアプリが必要でした。私は、10.6を実行しているほとんどのMacと10.7を実行しているすべてのMacには、64ビットポインターと64ビットの64ビットアプリがあると結論付けていますtime_t
。Appleは2038年1月よりかなり前の2011年に10.7をリリースしました。
64ビットtime_t
では、2038年のバグはほとんどなくなりましたが、いくつかのアプリで存続する可能性があります。古い32ビットアプリは、新しいシステムでも実行される可能性があります。また、64ビットアプリにはコーディングの誤りや古いデザインが含まれている可能性があり、64ビットtime_t
から32ビットに変換される可能性があります。これは、macOSだけでなく、すべてのシステムの問題です。
マッハ時間もあります。OS Xのカーネルは、BSDとMachを組み合わせています。ほとんどのアプリはを使用してBSDから時間を取得しますが、BSDをgettimeofday()
回ってMachから時間を取得する方法があります。これはさらに困難です。プログラムはmach_host_self()
、ホストポートを取得するために呼び出し、次にhost_get_clock_service()
を取得しCALENDAR_CLOCK
、最後にを取得しclock_get_time()
ます。
10.4 "Tiger"を実行している私の古いMacでは<mach/clock_types.h>
、時間をunsigned int
(内部struct mach_timespec
)として宣言しています。これは、0〜4294967295の範囲で、1970-01-01 00:00:00 UTC〜2106-02-07 06:28:15 UTCの範囲の符号なし32ビット整数です。これは、2038年問題を2106年問題に交換します。29,940年には到達できません。
host_get_clock_service()
Appleが時間を取得するためのより高速な方法を提供していたため、10.0 "Cheetah"から廃止されたと思われます。これらはgettimeofday()
カレンダー時間用のBSD でありmach_absolute_time()
、単調時間用のAppleのものでした。gettimeofday()
2106ではなく、2038年に問題を置くことを好みます。