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

Like this? Share it with your network

Share

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

  • 3,932 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,932
On Slideshare
3,827
From Embeds
105
Number of Embeds
5

Actions

Shares
Downloads
14
Comments
0
Likes
5

Embeds 105

http://d.hatena.ne.jp 76
https://twitter.com 25
http://a0.twimg.com 2
http://twitter.com 1
http://paper.li 1

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. まとめ• 耐用年数をきちんと考えて作りましょう• 耐用年数を超える場合は対策を施しましょう• テストは慎重に行いましょう