あなたの時計は大丈夫?「想定外」だった日時の不具合 clu2c動態保存整備士      東平洋史
日時に関する不具合が起きる原因• オーバーフローによるもの 「想定外」の期間使用 – 桁数の制限  • n桁で処理→n+1桁目に達してオーバーフロー – 積算日時の制限  • n桁で処理→n+1桁目に達してオーバーフロー  • nビットで処理→...
オーバーフローによるもの(1)     桁数の制限
西暦2000年問題• 年を西暦下2桁で処理 1997 ⇒ 97 1998 ⇒ 98 1999 ⇒ 99 2000 ⇒ 00   →00は99より小さい   →2000年(00)は1900年(00)なので1999年(99)より前!   →誤作動⇒...
西暦2000年問題中途半端な対応下2桁で処理するまま残そうとしたが…• 西暦2030年問題        • 西暦2069年問題 – 00~29なら2000年代    – 00~68なら2000年代 – 30~99なら1900年代    – 6...
西暦2008年問題あるネットゲーム(Perl製)で実際に発生•年を西暦下2桁で処理•文字列として格納•先頭が0だと8進数として扱われる処理系 2007 ⇒ 07 … 8進数だとここが上限(00~07) 2008 ⇒ 08 … 08という8進数は...
西暦2010年問題•年を西暦下2桁で処理          • 発生した事例•2進化10進表現として格納        – シチズンの電波時計「ワ                        ールタイムドシリーズ」•「10」を0x10=16と...
元号の処理方法による問題• 昭和100年問題 – 年を昭和2桁で表現   • 平成以降も、内部的には昭和として扱う    – 「平成23年」は「昭和86年」   • 官公庁や金融機関などに存在 – 「昭和100年(2025年(平成37年))=昭...
もう一つの西暦2000年問題(閏年)• 閏年と算出できない 1. 4で割り切れる年は閏年  2000は4で割り切れる 2. 4でも100でも割り切れる年は閏年ではない  2000は4でも100でも割り切れる 3. 4でも100でも400でも割り...
オーバーフローによるもの(2)    積算日時の制限
西暦2036年問題(NTP)• 西暦2036年2月6日6時28分15秒(UTC)過ぎに  NTPが誤作動 – 西暦1990年1月1日0時0分0秒(UTC)からの経過秒   数で時間を表現 – 32ビット符号なしの整数で実装 – 西暦2036年2...
西暦2038年問題(C言語のtime_t型)• 西暦2038年1月19日3時14分7秒(UTC)過ぎにC言語のtime_t型  を使ったプログラムが誤作動  – 西暦1970年1月1日0時0分0秒(UTC)からの経過秒数で時間    を表現  ...
西暦2038年問題の亜種• 西暦2004年1月10日13時37分4秒(UTC)過ぎに誤作動  – 西暦1970年1月1日0時0分0秒(UTC)から2^30秒後  – 時間を2倍する処理が入っていた• 不具合が起きると判明した or 起きたシステ...
積算日時による問題一覧(一部)  問題箇所             誤作動の概要                 原因NTP         西暦2036年2月7日6時28分16秒⇒     西暦1990年1月1日からの            ...
ファイルのタイムスタンプの制限ファイルシステム             日付の範囲ext2、ext3、   西暦1901年12月14日~2038年1月18日ReiserFSHFS、HFS+      西暦1904年1月1日~2040年2月6日F...
大小関係の定義によるもの   辞書順で処理
西暦2001年9月9日問題2001年9月9日午前1時46分40秒(UTC)関連•原因 – 西暦1970年1月1日0時(UTC)からの秒数で処理 – ソートを文字列(辞書順)で行なっていたため、1,000,000,000   < 999,999,...
その他
西暦3000年問題• MSVCR80.DLL(64ビット版Microsoft Visual  C++ 8.0)で発生• 西暦3000年1月1日以降の時間引数を処理させ  るとアサーションエラーが発生。
まとめ• 耐用年数をきちんと考えて作りましょう• 耐用年数を超える場合は対策を施しましょう• テストは慎重に行いましょう
Upcoming SlideShare
Loading in …5
×

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

4,518 views

Published on

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

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

No Downloads
Views
Total views
4,518
On SlideShare
0
From Embeds
0
Number of Embeds
170
Actions
Shares
0
Downloads
17
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

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

  1. 1. あなたの時計は大丈夫?「想定外」だった日時の不具合 clu2c動態保存整備士 東平洋史
  2. 2. 日時に関する不具合が起きる原因• オーバーフローによるもの 「想定外」の期間使用 – 桁数の制限 • n桁で処理→n+1桁目に達してオーバーフロー – 積算日時の制限 • n桁で処理→n+1桁目に達してオーバーフロー • nビットで処理→n+1ビット目に達してオーバーフロー• 大小関係の定義ミスによるもの – 辞書順で処理• その他
  3. 3. オーバーフローによるもの(1) 桁数の制限
  4. 4. 西暦2000年問題• 年を西暦下2桁で処理 1997 ⇒ 97 1998 ⇒ 98 1999 ⇒ 99 2000 ⇒ 00 →00は99より小さい →2000年(00)は1900年(00)なので1999年(99)より前! →誤作動⇒年を西暦4桁で表現して対応
  5. 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. 6. 西暦2008年問題あるネットゲーム(Perl製)で実際に発生•年を西暦下2桁で処理•文字列として格納•先頭が0だと8進数として扱われる処理系 2007 ⇒ 07 … 8進数だとここが上限(00~07) 2008 ⇒ 08 … 08という8進数はない! 2009 ⇒ 09 … 実はここも該当
  7. 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. 8. 元号の処理方法による問題• 昭和100年問題 – 年を昭和2桁で表現 • 平成以降も、内部的には昭和として扱う – 「平成23年」は「昭和86年」 • 官公庁や金融機関などに存在 – 「昭和100年(2025年(平成37年))=昭和0年」と誤認• 平成100年問題 – 年を平成2桁で表現 – 「平成100年(2088年)=平成0年」と誤認
  9. 9. もう一つの西暦2000年問題(閏年)• 閏年と算出できない 1. 4で割り切れる年は閏年 2000は4で割り切れる 2. 4でも100でも割り切れる年は閏年ではない 2000は4でも100でも割り切れる 3. 4でも100でも400でも割り切れる年は閏年 2000は4でも100でも400でも割り切れる – 条件3を忘れ、西暦2000年を閏年と判定できない
  10. 10. オーバーフローによるもの(2) 積算日時の制限
  11. 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. 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. 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. 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. 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. 16. 大小関係の定義によるもの 辞書順で処理
  17. 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. 18. その他
  19. 19. 西暦3000年問題• MSVCR80.DLL(64ビット版Microsoft Visual C++ 8.0)で発生• 西暦3000年1月1日以降の時間引数を処理させ るとアサーションエラーが発生。
  20. 20. まとめ• 耐用年数をきちんと考えて作りましょう• 耐用年数を超える場合は対策を施しましょう• テストは慎重に行いましょう

×