連載
» 2019年11月07日 11時00分 公開

山浦恒央の“くみこみ”な話(123):ソフトウェア技術者のためのバグ百科事典(2)まだあるぞ、うるう年バグ (1/3)

ソフトウェア技術者に向けて、バグに関する基礎知識をまとめていく新シリーズ「バグ百科事典」が始まります。第2回は、前回に続き「うるう年バグ」について解説します。

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

⇒連載「山浦恒央の“くみこみ”な話」バックナンバー

1.はじめに

 2年に渡った旧シリーズの「バグ検出ドリル」は、将棋、チェス、囲碁でいえば「次の一手問題」でした。ソースコードを読み、バグをピンポイントで見つけて修正しました。長手数の詰将棋を解くように、実践力の養成、バグを見つける嗅覚、必ず解く強靭な精神力を鍛えるものでした。

将棋 ※写真はイメージです

 新シリーズの「バグ百科事典」では、「うるう年のバグ」「デッドロックの発生」「メモリ破壊のバグ」など、バグの種類別に原因や対策法を詳しく解説します。将棋なら「角換わり」「四間飛車」みたいな戦略ごとに解説するのと同じです。

 「バグ検出ドリル」は実践力を鍛え、「バグ百科事典」は基礎知識の習得を目的にしています。両方を読めば、バグを未然に防ぎ、バグを作らない能力が高くなります。

 今回は、前回のうるう年バグの詳細ポイントの続きを紹介します。

2.うるう年の復習

 ソフトウェアを作成する際、時刻と連動した機能を作成することが多くあります。例えば、携帯電話機のカレンダーアプリでは、ユーザーが日時を設定すると、その時間に通知する機能がありますね。ただし、エンジニアが時刻を取り扱う場合にはいくつかのルールがあり、正しく処理出来ない場合、プログラムが日付を誤認識し、その間、ソフトウェアの動作に大きな影響を与えます。その代表例が、うるう年のバグです。

 うるう年とは、ある年の1年間の日数が、2月29日を追加し、366日になる年のことです。グレゴリオ暦のカレンダーでは、以下の年はうるう年としています。

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

 うるう年の判定処理は、プログラミング初学者でもできるものですが、「うるう年のバグが見つかった」と話題になることがあり、上級者にも意外にくせ者です。

 うるう年のバグは、昔からの常連バグの一つであり、プログラムの主機能に影響を与える可能性があるため、バグの影響度は高く、製品が使えなくなる場合があります。例えば、データベース系ソフトで発生すると、データ破壊が起き、入退出管理システムの場合、誰も入退出できなくなります。

3.Excelのうるう年バグ

 うるう年バグの一例を紹介します。Excelを持っている方は、アプリケーションを起動し、セルの書式設定を「日付」に変更してください。次に、「1900/1/1」と入力し、掃引し、1900/3/1まで続けます。すると、1900/2/29が存在します(図1)。

図1 図1 Excelの実行結果例

 図1は、1900年2月25日〜1900年3月3日までの入力例です。1900年は、4で割り切れても100で割り切れてしまうため、うるう年ではないはずですが、Excelでは1900年2月29日を平年として考えるようです。

 もちろん、Excelの開発元であるマイクロソフトも認識しているはずですが、「大人の事情」や「1900年のスケジュール管理をするユーザーはいない」と考えているためか、現在もそのままとなっています。ある種、「バグが仕様になった状態」ですね。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.