プログラマyasuhoの隠れ家

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

コードを読むのって好きなんです

 この障害の原因については「データ分割時のバグ」と報道されています。

* 【自動改札障害】事故原因が判明、「データ分割時の特定量」で読み込めず:ITpro

 で、今日の放送中に原因箇所のコードが出てきました。

クローズアップ現代「ソフトウエア危機〜誤作動相次ぐハイテク製品〜」 - かぶろぐ。


以前JRの自動改札機トラブルの解説記事をネットで見た時「これって、どんなバグだったんだろうなあ」なんて思っていたんだけど、先日NHKで解説番組が放映されたそうで、よりプログラミング的な観点から鏑矢正伝さんが記事を書かれています。ありがとうございます。私なら仮に見ていたとしても、ソースの詳細は見ることが出来なかったでしょう。^^;


これはなかなか興味深いですね。sizeを算出する時にoffsetを足し忘れていたというミスだったんだ。「たったそれだけ」というけれど、分かってみればbugなんて大抵そんなもの。どんなにテストをしても、バグは思いがけない時にやってくる。

あとyasuhoが気になった点とか

無限ループ解除対応


もうこのコメントだけで泣けますね。詳細は分からないけど、何があったかは想像に難くない。こういう組み込み機器だと特にエラーハンドリングには気を使いますよね。

cash?cache?


上記Blogのコメントにもあったんだけど、ぼくもこれが気になりました。たぶんcacheのような気がするんだけど、モノが自動改札機だけにcashの可能性もあるよなあ。どっちなんだろ。

BANK切替


これっていわゆる「BANK切替」なんでしょーか!?もしそうなら、いかにもこういう機器ならではという感じがします。いろいろと制約も多いんでしょうね。

memset


バッファをオールFでクリアしてますね。もしかすると0クリアするよりも未使用部分が分かりやすかったりするのかな(もちろん全くの想像)

pCmdAddrはvolatile?


pCmdAddrって、たぶんI/O空間だよね。キャストする時(volatile long *)なんて書く必要はないんだろうなあ、きっと。


そういえば、まだCにvolatileキーワードがなかった頃は「こういう書き方をすれば最適化されない」みたいな方法を見つけたりしてたこともあったっけ。あまりに危ないので、ドライバをコンパイルする時は最適化をしないようにしたり、インラインアセンブラで書いたり。


おじさんの昔話ですいません。:)

割り込み解除してるってことは


単純に割り込みハンドラでI/O空間見てるからか、複数タスク(スレッド?)で動いてるからか。どうなんでしょ。


確実なのは最初から最後までロックしておくことだけど、性能改善やタイミングがシビアな場合だと禁止区間を限定したり。そうすると再現の難しい問題が増えちゃったりするんで、なかなか難しいところです。

野次馬のツッコミすいません


このソフトウェアを書いた方が見られたら、気を悪くするかもしれない。もしそうだったら、ごめんなさい。


他人の書いた(自分の書いたものでも)コード読むのって、好きなんです。どんな気持ちでこれを書いてたんだろうな。この処理の理由は何なんだろう。ここは苦労したんだろうな。そんなことを想像しながら読むのが好き。日記を読むような感覚かなあ。


もしかすると明日は自分の書いたプログラムにバグが発見されるかもしれない。ソフトウェアのバグを0にすることは現在の技術では不可能だから、これは誰にでも起こりえること。


だから、時間がある時ぼくはよくコードを眺める。過去にそれを書いた時を思い出したいという気持ちもあるんだけど、コードを見返すって大事なことじゃないかってyasuhoは思うから。




今日の障害は明日の自分かもしれない - yasuhoの隠れ家