プログラマyasuhoの隠れ家

某ソフトウェア企業に勤務するおじさんプログラマyasuhoです

今日の障害は明日の自分かもしれない


ちょっと前に起きたJRの自動改札が朝起動しなくなった件について:

 日本信号によると、現時点で判明しているのはこうだ。原因は自動改札機のICカード判定部の不具合。判定部には毎朝、サーバから起動用データの1 つとして、「ネガデータ」(ネガティブデータ)と呼ぶ、旧式カードや不正カードなど、改札を通過できないカードを認識するためのデータを送信している。この朝もネガデータを送信したところ、判定部がネガデータをメモリに読み込む際に不具合が発生。処理がそこでストップし、起動しなかったという。

 調べたところ、ネガデータに「ある長さ、ある件数」といった条件が重なった時、データが読み込めなくなるプログラム不具合が判定部側にあることが判明。このため、判定部はエラーを返しながらネガデータ読み込みのリトライをひたすら繰り返す状態に陥り、起動処理が止まった。

260万人の朝の足を直撃 プログラムに潜んだ“魔物” - ITmedia ニュース


ああ、あれってプログラムのミスだったんだ。その時はそう思って忘れてたんだけど、先日そのバグの技術解説がasahi.comに:

 障害の引き金になったのが、2バイト(2進法で16けた)のデータだった。例えば改札機の場合、ネガデータは5451件分(6万5518バイト)を一区切りとして処理される。処理は4バイトずつ進めるため、最後に2バイト余る。全角ひらがなや漢字1文字分のデータ量だ。

 半端な2バイトも、件数がこの一区切りまでなら正常に処理されていた。だが、5452件以上になると「85件増すごとに5件の割合で、余った2バイトの処理を忘れる」(同社)というプログラムの欠陥があった。

 相互利用が始まった3月から9月下旬まで、ネガデータは障害が発生する件数に達していなかった。以後もたまたま障害の条件をすり抜けていたが、10月12日のデータは「5件」に合致して2バイトが欠落し、改札機が立ち上がらなくなった。

朝日新聞デジタル:どんなコンテンツをお探しですか?


すいません。何を言っているのか、全然分かりません。^^;


一応yasuhoもプログラム書いてお金をもらっておりますんで、プログラミングに関しては、ある程度分かるつもりだったんですけど、これについては何度読んでも理解できませんでした。前述のITmediaさんの記事はなんとなく理解できたので、どなたか分かりやすく解説していただけると嬉しいです。>他人任せ


さて、私が注目したのはITmediaさんの以下の文章:

判定部はエラーを返しながらネガデータ読み込みのリトライをひたすら繰り返す

繰り返しますが、私はこのエラーの概要を正しく理解できているわけではないので、的外れなことを言っているかもしれません。その点はどうかご容赦を。

エラー処理の難しさ


プログラミングの中でもエラーが発生した時の事後処理は難しいです。特に今回のような「停止せず動くことが求められる」組み込み機器の場合、その処理はさらに難しくなります。


例としてみなさんがよく使うWebブラウザを考えてみましょう。Webブラウザは言うまでもなくInternet上にあるWebサイトをPCなどで見るためのソフトウェア。WebサイトはHTMLを基本として、CSS/JavaScript/Flashなど、様々な技術を使って構築されています。


Webブラウザをエラー処理なしで仕様に従って作ることは可能でしょうが、現実にはそういったブラウザは実用に耐えません。それにはHTMLなどの仕様に曖昧な部分があったりブラウザ製作者による解釈の違いなどもあるのですが、そもそも人間は間違うものという前提に立つ必要があるからです。


ちょっとしたタグの誤り、文字エンコーディングの間違いなどがあったとしても、やっぱりある程度は見たいじゃないですか。何でもエラーにすることはプログラムとしては簡単ですが、ユーザにとっては使いづらいものになります。ある程度の例外を予測し、可能な限りリカバリーを行うことがよいソフトウェアには不可欠です。


ユーザが介在することの少ない組み込み機器では、エラー処理は特に重要です。こういった機器では制約が多いわりにデータ量も予測がつかない場合が多いです。パケットを失っても途中から再開できるようにする。リトライにはリミットを設ける。そして、どうしても回復が出来ない場合はなるべく分かりやすい形でLogを残す。ウォッチドックを設ける、といった工夫が必要になります。


プログラムのバグを直すことはもちろん大事なのですが、全てのバグを修正することは不可能なのです。なので、あらかじめ不測の事態に備えてエラー処理を施しておくことの方が大事なのではないかとyasuhoは考えます。

明日は我が身


今回はJR自動改札機のトラブルでしたが、これは何も特別な状況ではありません。パソコンやコンピュータは私たちのまわりの見えないところに数多く存在しています。あなたの作ったプログラムは知らず知らずにあなたの知らないところで使われているかもしれません。


エラー処理は作るのも面倒でテストも複雑になりがち。でもソフトウェアの安定度を決めるといっても過言ではありません。セキュリティホールや脆弱性と言われる部分も「例外処理」 が関連していることが多い。「もし万が一ここで意図しないデータが来たら」プログラマならば常にそんな緊張感を持ちながらコードを書くべきではないかとyasuhoは思うのです。


あなたのプログラムのエラー処理はどうですか!?