日本語

開発者ツール · Unix タイムスタンプ コンバータ

2038 年問題: 32 ビット time_t がオーバーフローすると何が起こるか

· 背景

タイムスタンプ unix-time デバッグ

署名付き 32 ビット カウンタが継続タイムラインの横の上限に達しました
オリジナル ToolAcre ベクトル イラスト

19 1 月 2038 の 03:14:07 UTC に、符号付き 32 ビット秒カウンターが 1901 にラップされます。この投稿では、32 ビット時間がまだ隠されている算術演算と、影響を受けるシステムを認識する方法について説明します。

思ったよりも近い日付 — 住宅ローン、証明書、ファームウェアはすでに 2038 を過ぎた日付を計算しています

2038 という日付の制限は、その時点を超えて有効期限、スケジュール、または保存期限を計算するたびにコードに影響します。したがって、障害は時計の日付より何年も前に発生する可能性があります。このリポジトリは住宅ローン、証明書、またはファームウェア製品を文書化していないため、これらの例は観察された事例としては示されていません。

実際の監査の問題は、Unix 秒を符号付き 32 ビット整数に格納する境界があるかどうかです。将来の日付を正常にフォーマットできる最新のブラウザは、下流のより狭いフィールドについては何も言いません。ユーザー インターフェイスだけでなく、シリアル化と永続性もトレースします。

運用クロックを待つのではなく、今日のテストで将来の日付の計算を検索します。固定された境界フィクスチャは、遠いカレンダー上の懸念を即時の反復可能なチェックに変えます。

将来の日付の計算では、2038 よりも前の 32 ビット制限が明らかになる可能性がありますが、指定された業界はここでは証明されていません。

符号付き 32 ビット整数の最大値は、2³¹−1、または 2,147,483,647 です。テストでは、エポック後の秒数が `2038-01-19T03:14:07.000Z` であることが確立されます。もう 1 秒の数学的秒は 03:14:08 である必要があります。JavaScript の数値と日付で値を保持できるため、ToolAcre はそれを表示します。

負の値にラップするには、外部の符号付き 32 ビット操作が必要です。 `fromEpoch` は実行しません。よく引用される 12 月の 1901 結果は 2 の補数ラップで導き出すことができますが、影響を受けるすべてのシステムが拒否、飽和、または破損するのではなくラップするという主張は証拠を超えることになります。実際の境界をテストします。

外部キャストが 2 の補数演算をラップする場合、結果として格納されたビットとデコードされた負の値を検査します。予期せぬ歴史的日付のみからラップを推測しないでください。

正確な上限の瞬間が検証されます。ラップ動作は外部整数演算に依存します

エポック秒を保持する 32 ビットの符号付きフィールドのスキーマ、プロトコル定義、およびバイナリ レイアウトを検索します。 INTEGER という名前の SQL 列は、すべてのエンジンにわたって十分な証拠ではなく、組み込みプラットフォームは自動的に影響を受けません。各パスの幅、符号の有無、単位、変換コードを決定します。

ファイルとキャッシュされたレコードを監査に含めます。拡張されたインメモリ型は依然として古いナロー形式を書き込むことができますが、ワイド データベースは切り捨てられたクライアント値を受け取る可能性があります。最大値以降のフィクスチャを作成し、関数が成功を返したかどうかを単にチェックするのではなく、バイトまたは永続化された値を検査します。

実際のスキーマと形式を検査して、署名された 32 ビット エポック フィールドを見つけます

概念的な修正は、その範囲に必要な日付 (通常はより広い符号付きカウントまたは適切な時間型) が含まれる表現です。ワークブックのカーネル、libc、およびフォーマット移行の説明は、これらのソース ファイルの外にあります。各システムには独自の互換性と展開作業があります。

調整された契約変更としてすべての境界を広げます。ワイヤー フィールドのないストレージ、または既存のデータのないライブラリを更新すると、狭いリンクが残ります。必要に応じてバージョン管理を追加し、古いリーダーを明示的にテストします。エポック定義自体を変更する必要はありません。コンテナはそうします。

移行計画には、ロールバックと混合バージョンの動作を含める必要があります。ワイド値を生成する新しいライターは、永続化された日付がカレンダーの境界に達する前に古いリーダーを破壊する可能性があります。

表現の幅を広げることが中心的な修正です。カーネルとフォーマットの移行はシステム固有です

2,147,483,647 を秒に変換して `2038-01-19T03:14:07.000Z` を取得します。 2,147,483,648 を変換して `2038-01-19T03:14:08.000Z` を取得します。スムーズな 1 秒のステップは、ToolAcre パスにその値で 32 ビットのクリフがないことを証明します。

ミリ秒と同じ数値を強制します。値はゼロから約 25 日後になるため、1 月 1970 になります。この比較により、単位の間違いが 2038 問題として誤ってラベル付けされるのを防ぎます。フィールド幅とスケールは独立した寸法です。

この比較は、コンバーターが脆弱ではなく診断的である理由も示しています。明示的な単位の選​​択によってスケールが決まりますが、ブラウザーの幅広い表現には両方の値が含まれます。

うまくいった例: JavaScript Date が 32 ビット秒で署名されていないため、コンバーターが境界を越えます

リポジトリは、4,294,967,295 秒を、符号なしの最大 32 ビット数である `2106-02-07T06:28:15.000Z` としてテストします。 GPS 週ロールオーバーのテストや、署名された 64 ビット ミリ秒クリフの指定は行わないため、これらの名前付きトピックは一般化されるのではなく省略されます。

境界解析は、使用中の正確なタイプに従う必要があります。署名付きから署名なしに切り替えると、一方向に拡張されますが、負の日付が削除され、依然として上端が作成されます。一般に、より幅広い署名表現では、消費者の日付範囲に応じて両方向が保持されます。

各崖には、幅、符号、単位から独自の導出が必要です。無関係なロールオーバーを「2038」の下にグループ化すると、実際に変更が必要なバイナリ フィールドがわかりにくくなります。

符号なしの 32 ビット境界がテストされます。他の名前付き崖はリポジトリの証拠の外にあります

コンバーターは、ソース コード、バイナリ、データベース スキーマ、またはデプロイされたデバイスを監査できません。候補番号の意味を示し、テスト用の具体的な治具を提供します。静的検索、型検査、シリアル化テスト、および移行リハーサルにより、製品が安全かどうかを確認する必要があります。

ブラウザは 2038 を正しく表示するため、監査を閉じないでください。これは、このブラウザーのパスのみを検証します。特に、暗黙的な絞り込みが発生する可能性がある言語バインディングや古い形式を通じて、値をエンドツーエンドで追跡します。

そのトレースに依存関係とベンダー インターフェイスを含めます。アプリケーション ソースはワイド型を使用する一方で、ネイティブ ライブラリまたはデバイス プロトコルは同じ値を目に見えないように狭める場合があります。

要点: エポックは問題ありませんが、整数幅が問題です。また、Unix タイムスタンプ コンバーターを使用して UTC と現地時間の境界値をチェックする方法についても説明します。

2038 年の問題は整数幅の境界であり、Unix エポック演算の欠陥ではありません。 ToolAcre が両側で変換に成功すると、その分離が目に見えるようになります。外部システムは、その表現の 1 つが次のカウントを保持できない場合にのみ失敗します。

2,147,483,647 および 2,147,483,648 を隣接するテスト ベクトルとして使用し、正確な永続性を検証し、単位と署名を文書化します。あらゆる境界における証拠は、おそらく脆弱であると思われるテクノロジーの一般的なチェックリストよりも価値があります。

隣接するベクトルは、メモリ内計算だけでなく、実際のシリアル化パスを通過する必要があります。これは、名目上広くなったアプリケーションで残っている狭い継ぎ目が明らかになる可能性がある場所です。