連載
» 2019年10月08日 10時00分 公開

ソフトウェア技術者のためのバグ百科事典(1)うるう年山浦恒央の“くみこみ”な話(122)(2/3 ページ)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

4.第1回目のテーマ:うるう年のバグ

 初回は、超常連バグである「うるう年バグ」を取り上げます。うるう年の判定プログラムは、プログラミング入門者でも作成できる簡単なソフトウェアですが、うるう年関連のバグは、よく話題になります。うるう年のバグは、筆者も体験したことがあり、詳しく知りたい方は、「山浦恒央の”くみこみ”な話(64)」をご覧ください。

4.1 なぜうるう年が必要なのか

 うるう年とは、1年が366日ある年のことです。うるう年には、本来、存在しない2月29日が増え、これがバグの原因となります。うるう年バグの解説をする前に、なぜ、うるう年が必要か簡単に振り返ります。

 毎日の予定作成に、カレンダー使用することが多いでしょう。一般的なカレンダーには、1年分の月、日、曜日が割り振ってあり、ごみ出しの日や旅行の日などの目印となり大変便利です。何げなく使っているカレンダーですが、過去の偉人の多大な貢献でできたものです。特筆すべきは、1年の日数を定めたことでしょう。

 「1年は何日ですか?」と聞かれると、「365日です」と自動的に答えます。過去の研究者は、太陽や月の運行を長年観測して365日に決定しました。観測機器が今ほど発達していなかった時代に、これを決定したことは大変だったでしょう。その結果、私たちは、何の疑いもなく「1年=365日」と考えています。ただし、より正確な1年の日数は365日でないことが、うるう年バグを引き起こす原因です。

 紀元前46年から使っていたカレンダー(ユリウス暦)では、1年の日数を365.25日としていました。ただし、人間が0.25日を過ごせないので、4年に1回のうるう年を設けて調整しました。これでうまくいけばいいのですが、さらに正確な日数は365.2422日でした。長年積み重なると、「4年に1回のうるう年」では誤差が蓄積します。

 1582年、グレゴリオ13世が以下のルールをしたカレンダー(グレゴリオ暦)を作成しました。これが現在のうるう年の判定方法です。

  1. 4で割り切れる年はうるう年
  2. ただし、100で割り切れる年は平年
  3. 400で割り切れる年はうるう年

 これにより、(365.25日×400年+97日)/400日=365.2425日となり、より正確な日数となります(ごくわずかの誤差が残っていますが)。グレゴリオ暦のおかげで、プログラムの作成やテストが大変になりました。今後、カレンダーを今以上に正確な日数に変更することになった場合、世界中のうるう年判定ルーティンが変更になり、非常に大きな混乱が発生するはずです。

4.2 うるう年バグ

 上記で説明した「うるう年の条件式」を実装するのは簡単そうですが、「うるう年のバグが原因でソフトウェアが正しく動作をしない」という話をよく聞きます。例えば、参考文献[1]によると、過去に公衆電話機が起動しないバグが発生したようです。同文献からの引用を以下に示します。

 2008年1月31日に約3000台の公衆電話機が起動しない事態が起きました。電話機の保守作業に使う「自己診断プログラム」のバグが原因でした。このプログラムは月に1度だけ起動します。電話機に異常がないかを自己診断し、異常があれば監視センターに自動通知する機能を備えています。保守業務の効率化と、故障の早期発見を目指して実装した機能です。

 電話機によってプログラムの起動日は異なるのですが、問題があった3000台は月末に動作する設定でした。このプログラムは、起動直前に、次回起動日を自ら設定して終了します。1月31日に起動した際は、電話機内のカレンダー情報から、2月末日すなわち「2月29日」という日付を取得し、次回起動日として設定しました。ところが、自己診断プログラムにバグがあり、2月29日を「実在しない日付」と誤認してしまいました。

[1]なぜシステムがダウンするのか 知っておきたいシステム障害、信頼性の基礎知識((著)大和田尚孝、(監)日経コンピュータ、2009年、日経BP)、58ページを引用

 うるう年のバグの特徴は、「心霊現象」に似ている点です。普段は何事もなく動作しているソフトウェアが、ある時を境にまったく動作をしなくなります。不思議に思い、調査をすると、翌日には正常動作することがあります。エンジニアからすると、胃が痛くなるバグですね。さらに、混乱の原因は2月29日という、私生活とはあまり関係のないタイミングも関連しています。

Copyright © ITmedia, Inc. All Rights Reserved.