SlideShare a Scribd company logo
1 of 20
Download to read offline
あなたの時計は大丈夫?
「想定外」だった日時の不具合




 clu2c動態保存整備士
      東平洋史
日時に関する不具合が起きる原因

• オーバーフローによるもの
 「想定外」の期間使用
 – 桁数の制限
  • n桁で処理→n+1桁目に達してオーバーフロー
 – 積算日時の制限
  • n桁で処理→n+1桁目に達してオーバーフロー
  • nビットで処理→n+1ビット目に達してオーバーフロー
• 大小関係の定義ミスによるもの
 – 辞書順で処理
• その他
オーバーフローによるもの(1)

     桁数の制限
西暦2000年問題

• 年を西暦下2桁で処理
 1997 ⇒ 97
 1998 ⇒ 98
 1999 ⇒ 99
 2000 ⇒ 00
   →00は99より小さい
   →2000年(00)は1900年(00)なので1999年(99)より前!
   →誤作動
⇒年を西暦4桁で表現して対応
西暦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年代
西暦2008年問題

あるネットゲーム(Perl製)で実際に発生
•年を西暦下2桁で処理
•文字列として格納
•先頭が0だと8進数として扱われる処理系
 2007 ⇒ 07 … 8進数だとここが上限(00~07)
 2008 ⇒ 08 … 08という8進数はない!
 2009 ⇒ 09 … 実はここも該当
西暦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   誤認
元号の処理方法による問題
• 昭和100年問題
 – 年を昭和2桁で表現
   • 平成以降も、内部的には昭和として扱う
    – 「平成23年」は「昭和86年」
   • 官公庁や金融機関などに存在
 – 「昭和100年(2025年(平成37年))=昭和0年」と誤認
• 平成100年問題
 – 年を平成2桁で表現
 – 「平成100年(2088年)=平成0年」と誤認
もう一つの西暦2000年問題(閏年)

• 閏年と算出できない
 1. 4で割り切れる年は閏年
  2000は4で割り切れる
 2. 4でも100でも割り切れる年は閏年ではない
  2000は4でも100でも割り切れる
 3. 4でも100でも400でも割り切れる年は閏年
  2000は4でも100でも400でも割り切れる
 – 条件3を忘れ、西暦2000年を閏年と判定できない
オーバーフローによるもの(2)

    積算日時の制限
西暦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ビット
西暦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の時はマイナスの数になる
西暦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課金システム
      • 国内電話サービスの料金を誤請求
積算日時による問題一覧(一部)
  問題箇所             誤作動の概要                 原因
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                                 数
ファイルのタイムスタンプの制限
ファイルシステム             日付の範囲
ext2、ext3、   西暦1901年12月14日~2038年1月18日
ReiserFS
HFS、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日
大小関係の定義によるもの

   辞書順で処理
西暦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用)
その他
西暦3000年問題
• MSVCR80.DLL(64ビット版Microsoft Visual
  C++ 8.0)で発生
• 西暦3000年1月1日以降の時間引数を処理させ
  るとアサーションエラーが発生。
まとめ
• 耐用年数をきちんと考えて作りましょう
• 耐用年数を超える場合は対策を施しましょう
• テストは慎重に行いましょう

More Related Content

More from 洋史 東平

大人の事情が自販機に 超自然現象を起こした Xライダー編
大人の事情が自販機に 超自然現象を起こした Xライダー編大人の事情が自販機に 超自然現象を起こした Xライダー編
大人の事情が自販機に 超自然現象を起こした Xライダー編洋史 東平
 
大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン
大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン
大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン洋史 東平
 
大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)
大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)
大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)洋史 東平
 
大人の事情が自販機に超自然現象を起こした その2
大人の事情が自販機に超自然現象を起こした その2大人の事情が自販機に超自然現象を起こした その2
大人の事情が自販機に超自然現象を起こした その2洋史 東平
 
大人の事情が自販機に超自然現象を起こした
大人の事情が自販機に超自然現象を起こした大人の事情が自販機に超自然現象を起こした
大人の事情が自販機に超自然現象を起こした洋史 東平
 
自販機の超自然現象 果たして収まるか?
自販機の超自然現象 果たして収まるか?自販機の超自然現象 果たして収まるか?
自販機の超自然現象 果たして収まるか?洋史 東平
 
続・自動販売機の大人の事情をテストした
続・自動販売機の大人の事情をテストした続・自動販売機の大人の事情をテストした
続・自動販売機の大人の事情をテストした洋史 東平
 
自動販売機の大人の事情をテストした
自動販売機の大人の事情をテストした自動販売機の大人の事情をテストした
自動販売機の大人の事情をテストした洋史 東平
 
PowerShellでWebブラウザ(Selenium Webdriver)を動かした話
PowerShellでWebブラウザ(Selenium Webdriver)を動かした話PowerShellでWebブラウザ(Selenium Webdriver)を動かした話
PowerShellでWebブラウザ(Selenium Webdriver)を動かした話洋史 東平
 
bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話洋史 東平
 
Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行
Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行
Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行洋史 東平
 
FreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみた
FreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみたFreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみた
FreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみた洋史 東平
 
Solaris 11.3(x86)でSelenium WebDriverを動かしてみた
Solaris 11.3(x86)でSelenium WebDriverを動かしてみたSolaris 11.3(x86)でSelenium WebDriverを動かしてみた
Solaris 11.3(x86)でSelenium WebDriverを動かしてみた洋史 東平
 
Google Chrome on Android を自動実行
Google Chrome on Android を自動実行Google Chrome on Android を自動実行
Google Chrome on Android を自動実行洋史 東平
 
Selenium Gridで遊ぼう
Selenium Gridで遊ぼうSelenium Gridで遊ぼう
Selenium Gridで遊ぼう洋史 東平
 
WebDriverで遊ぼう
WebDriverで遊ぼうWebDriverで遊ぼう
WebDriverで遊ぼう洋史 東平
 
サルから進化(?) Selenium WebDriverの 自動実行プログラム
サルから進化(?)Selenium WebDriverの自動実行プログラムサルから進化(?)Selenium WebDriverの自動実行プログラム
サルから進化(?) Selenium WebDriverの 自動実行プログラム 洋史 東平
 

More from 洋史 東平 (20)

大人の事情が自販機に 超自然現象を起こした Xライダー編
大人の事情が自販機に 超自然現象を起こした Xライダー編大人の事情が自販機に 超自然現象を起こした Xライダー編
大人の事情が自販機に 超自然現象を起こした Xライダー編
 
大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン
大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン
大人の事情は自販機に超自然現象を起こさなかったのか? ライダーマン
 
大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)
大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)
大人の事情が自販機に超自然現象を起こした V3(ヴイスリャー)
 
大人の事情が自販機に超自然現象を起こした その2
大人の事情が自販機に超自然現象を起こした その2大人の事情が自販機に超自然現象を起こした その2
大人の事情が自販機に超自然現象を起こした その2
 
大人の事情が自販機に超自然現象を起こした
大人の事情が自販機に超自然現象を起こした大人の事情が自販機に超自然現象を起こした
大人の事情が自販機に超自然現象を起こした
 
自販機の超自然現象 果たして収まるか?
自販機の超自然現象 果たして収まるか?自販機の超自然現象 果たして収まるか?
自販機の超自然現象 果たして収まるか?
 
続・自動販売機の大人の事情をテストした
続・自動販売機の大人の事情をテストした続・自動販売機の大人の事情をテストした
続・自動販売機の大人の事情をテストした
 
自動販売機の大人の事情をテストした
自動販売機の大人の事情をテストした自動販売機の大人の事情をテストした
自動販売機の大人の事情をテストした
 
PowerShellでWebブラウザ(Selenium Webdriver)を動かした話
PowerShellでWebブラウザ(Selenium Webdriver)を動かした話PowerShellでWebブラウザ(Selenium Webdriver)を動かした話
PowerShellでWebブラウザ(Selenium Webdriver)を動かした話
 
bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話bashでWebブラウザ(Selenium WebDriver)を動かした話
bashでWebブラウザ(Selenium WebDriver)を動かした話
 
OSUnC川越2016
OSUnC川越2016OSUnC川越2016
OSUnC川越2016
 
Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行
Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行
Selenium WebDriverでFreeBSD 10.2のGoogle Chromeを自動実行
 
FreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみた
FreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみたFreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみた
FreeBSD 10.2(amd64)でSelenium WebDriverを動かしてみた
 
Solaris 11.3(x86)でSelenium WebDriverを動かしてみた
Solaris 11.3(x86)でSelenium WebDriverを動かしてみたSolaris 11.3(x86)でSelenium WebDriverを動かしてみた
Solaris 11.3(x86)でSelenium WebDriverを動かしてみた
 
OSCで何したの?
OSCで何したの?OSCで何したの?
OSCで何したの?
 
Google Chrome on Android を自動実行
Google Chrome on Android を自動実行Google Chrome on Android を自動実行
Google Chrome on Android を自動実行
 
Selenium Gridで遊ぼう
Selenium Gridで遊ぼうSelenium Gridで遊ぼう
Selenium Gridで遊ぼう
 
WebDriverで遊ぼう
WebDriverで遊ぼうWebDriverで遊ぼう
WebDriverで遊ぼう
 
おまけ
おまけおまけ
おまけ
 
サルから進化(?) Selenium WebDriverの 自動実行プログラム
サルから進化(?)Selenium WebDriverの自動実行プログラムサルから進化(?)Selenium WebDriverの自動実行プログラム
サルから進化(?) Selenium WebDriverの 自動実行プログラム
 

Recently uploaded

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (8)

新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

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