Your SlideShare is downloading. ×
0
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

あなたの時計は大丈夫? 「想定外」だった日時の不具合(原本)

3,636

Published on

NTPについて調べて2036年問題を知り、さらに2038年問題を知り、芋づる式に年問題がたくさんあることを知りました。このスライドは年問題について簡単にまとめたものです。

NTPについて調べて2036年問題を知り、さらに2038年問題を知り、芋づる式に年問題がたくさんあることを知りました。このスライドは年問題について簡単にまとめたものです。

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,636
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
5
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. あなたの時計は大丈夫?「想定外」だった日時の不具合 clu2c動態保存整備士 東平洋史
  • 2. 日時に関する不具合が起きる原因• オーバーフローによるもの 「想定外」の期間使用 – 桁数の制限 • n桁で処理→n+1桁目に達してオーバーフロー – 積算日時の制限 • n桁で処理→n+1桁目に達してオーバーフロー • nビットで処理→n+1ビット目に達してオーバーフロー• 大小関係の定義ミスによるもの – 辞書順で処理• その他
  • 3. オーバーフローによるもの(1) 桁数の制限
  • 4. 西暦2000年問題• 年を西暦下2桁で処理 1997 ⇒ 97 1998 ⇒ 98 1999 ⇒ 99 2000 ⇒ 00 →00は99より小さい →2000年(00)は1900年(00)なので1999年(99)より前! →誤作動⇒年を西暦4桁で表現して対応
  • 5. 西暦2000年問題中途半端な対応下2桁で処理するまま残そうとしたが…• 西暦2030年問題 • 西暦2069年問題 – 00~29なら2000年代 – 00~68なら2000年代 – 30~99なら1900年代 – 69~99なら1900年代• 西暦2050年問題 • 西暦2070年問題 – 00~49なら2000年代 – 00~69なら2000年代 – 50~99なら1900年代 – 70~99なら1900年代 • 西暦2100年問題 – 00~99なら2000年代
  • 6. 西暦2008年問題あるネットゲーム(Perl製)で実際に発生•年を西暦下2桁で処理•文字列として格納•先頭が0だと8進数として扱われる処理系 2007 ⇒ 07 … 8進数だとここが上限(00~07) 2008 ⇒ 08 … 08という8進数はない! 2009 ⇒ 09 … 実はここも該当
  • 7. 西暦2010年問題•年を西暦下2桁で処理 • 発生した事例•2進化10進表現として格納 – シチズンの電波時計「ワ ールタイムドシリーズ」•「10」を0x10=16と誤認! (2008年に発覚) 2009 ⇒ 09 – オーストラリアクイーンズ 2010 ⇒ 16 ランド銀行の金融システ 2011 ⇒ 17 実際より ム(2010年) … 6年後と – ドイツジェムアルト社のIC 2018 ⇒ 24 誤認 カード使用不能 2019 ⇒ 25 – PlayStation3で2010年を閏 2020 ⇒ 32 実際より 年と誤判定(3月1日に2月 29日と表示して発覚) … 12年後と 2029 ⇒ 41 誤認
  • 8. 元号の処理方法による問題• 昭和100年問題 – 年を昭和2桁で表現 • 平成以降も、内部的には昭和として扱う – 「平成23年」は「昭和86年」 • 官公庁や金融機関などに存在 – 「昭和100年(2025年(平成37年))=昭和0年」と誤認• 平成100年問題 – 年を平成2桁で表現 – 「平成100年(2088年)=平成0年」と誤認
  • 9. もう一つの西暦2000年問題(閏年)• 閏年と算出できない 1. 4で割り切れる年は閏年 2000は4で割り切れる 2. 4でも100でも割り切れる年は閏年ではない 2000は4でも100でも割り切れる 3. 4でも100でも400でも割り切れる年は閏年 2000は4でも100でも400でも割り切れる – 条件3を忘れ、西暦2000年を閏年と判定できない
  • 10. オーバーフローによるもの(2) 積算日時の制限
  • 11. 西暦2036年問題(NTP)• 西暦2036年2月6日6時28分15秒(UTC)過ぎに NTPが誤作動 – 西暦1990年1月1日0時0分0秒(UTC)からの経過秒 数で時間を表現 – 32ビット符号なしの整数で実装 – 西暦2036年2月7日6時28分15秒(UTC) = 西暦1990年1月1日0時(UTC) •2^32 まで進むと0と認識 – 2^32 = 100000000000000000000000000000000 – 2^32 – 1 = 11111111111111111111111111111111 32ビット
  • 12. 西暦2038年問題(C言語のtime_t型)• 西暦2038年1月19日3時14分7秒(UTC)過ぎにC言語のtime_t型 を使ったプログラムが誤作動 – 西暦1970年1月1日0時0分0秒(UTC)からの経過秒数で時間 を表現 – 32ビット符号つきの整数で実装した場合に問題発生 – 西暦2038年1月19日3時14分7秒(UTC) ⇒西暦1901年12月13日20時45分7(UTC) •2^31 – 1 = 2147483647 の次を -2^31 = -2147483648 と認識 0 1111111111111111111111111111111 = 2^31 - 1 1 0000000000000000000000000000000 = -2^31 1 1111111111111111111111111111111 = -1 先頭のビットが1の時はマイナスの数になる
  • 13. 西暦2038年問題の亜種• 西暦2004年1月10日13時37分4秒(UTC)過ぎに誤作動 – 西暦1970年1月1日0時0分0秒(UTC)から2^30秒後 – 時間を2倍する処理が入っていた• 不具合が起きると判明した or 起きたシステム – IIJのルータ「SEIL/neu」シリーズ一部機種 • NTPサーバから時刻を取得する設定にすると誤作動 • ファームウェアの修正で事前に対処 – 日本IBM製ATM • 日本IBM製ソフト「FINEACE/6000」関連の不具合 – KDDI課金システム • 国内電話サービスの料金を誤請求
  • 14. 積算日時による問題一覧(一部) 問題箇所 誤作動の概要 原因NTP 西暦2036年2月7日6時28分16秒⇒ 西暦1990年1月1日からの 西暦1900年1月1日0時0分0秒 秒数が32ビット整数C言語の 西暦2038年1月19日3時14分8秒⇒ 西暦1970年1月1日 西暦1901年12月13日20時45分52秒 からの秒数が32ビット符号time_t型 付き整数GPS 西暦1999年8月21日の週は 西暦1980年1月6日からの 1980年1月6日と同じ週 週が10ビットの整数System zの 西暦2042年9月17日23時53分46秒⇒ 西暦1990年1月1日からのSTCK命令で取 西暦1900年1月1日0時0分0秒 μ秒数が限界を超える得する64ビットのTODクロックMacOS 6.X 西暦2019年12月31日⇒ 西暦1920年1月1日 西暦1920年1月1日 からの年数が2桁の整数Macintosh 西暦2040年2月6日18時28分16秒⇒ 西暦1904年1月1日からの 西暦1904年1月1日0時0分0秒 秒数が32ビット符号付き整128K 数
  • 15. ファイルのタイムスタンプの制限ファイルシステム 日付の範囲ext2、ext3、 西暦1901年12月14日~2038年1月18日ReiserFSHFS、HFS+ 西暦1904年1月1日~2040年2月6日FAT 西暦1980年1月1日~2107年12月31日ext4 西暦1901年12月14日~2514年4月25日NTFS 西暦1601年1月1日~60056年5月28日
  • 16. 大小関係の定義によるもの 辞書順で処理
  • 17. 西暦2001年9月9日問題2001年9月9日午前1時46分40秒(UTC)関連•原因 – 西暦1970年1月1日0時(UTC)からの秒数で処理 – ソートを文字列(辞書順)で行なっていたため、1,000,000,000 < 999,999,999 と判定 – 2001年9月9日 1:46:40秒以降のデータを「古い!」と判断•問題が起きたプログラムおよびシステム – Yahoo! 掲示板 – Gnus – Windows Meの「システムの復元」 – Sun Directory Service(Solaris用)
  • 18. その他
  • 19. 西暦3000年問題• MSVCR80.DLL(64ビット版Microsoft Visual C++ 8.0)で発生• 西暦3000年1月1日以降の時間引数を処理させ るとアサーションエラーが発生。
  • 20. まとめ• 耐用年数をきちんと考えて作りましょう• 耐用年数を超える場合は対策を施しましょう• テストは慎重に行いましょう

×