パスワードを忘れた? アカウント作成
16564 story

改札トラブルは境界処理のミスでハングアップ 77

ストーリー by nabeshin
カードは翌日から無効になる? 部門より

Anonymous Coward曰く、

asahi.comの記事によると、12日に起きた自動改札機の障害は、無効カードデータの情報送信時に、境界バイト処理に失敗することが原因だったそうだ。
よくわからないのは記者の解説。意訳が入っているらしく数字が理解できないのだが、「85件増すごとに5件の割合で、余った2バイトの処理を忘れる」という引用があるので、ここの数字だけは表現が正しいと思われる。ちなみに、開発(納品?)元の日本信号からは、10月15日付けで簡単な報告が公開されおり、朝日新聞の記事はその詳細をインタビューしたものと思われる。

このバグ、どういう話だと思われますか?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by sladoslado (28918) on 2007年10月29日 16時31分 (#1241388)
    >「極めて単純なプログラムミス」と専門家が指摘

    この専門家の名前が知りたいものですね。
    それとも専門家の言葉尻だけつまんでアサヒるかもしれませんが。

    解析の結果、ミスにあたる部分が数行で”単純に見える”事はあっても実態はそんなに単純ではない事の方が多いと思うのですが実際のところはどうなのだろう?
    #構造は単純でも工程は複雑

    あとコーディングミスと設計ミスと仕様記述書のミスは別物ですよね、専門家なら設計ミスなのか仕様書の書き方が曖昧で解釈が複数とれておきた事故なのかとかとか・・・位はご指導いただきたいものです。

    • Re:本当に専門家? (スコア:1, すばらしい洞察)

      by Anonymous Coward on 2007年10月29日 17時33分 (#1241409)
      バグとしては単純でしょう。それは間違いない。
      # だって「バグ」は「間違っている所」だけにフォーカスを当てるからね。
      # 「間違っている所を見つける」コストは無視される。

      テストが無かったのですから、「想定外」だったか「締め切りが来ちゃった」か最低限でもどちらか一方が起こったことは確実ですし、それらが起こった要因は…うーん。

      あとコーディングミスと設計ミスと仕様記述書のミスは別物ですよね

      いやいや。全部一度に作らざるを得ないぐらい突貫工事状態になれば、この3つは同じものです。

      「コーディングしたとおりに設計図を描き、仕様書を記述する。
          なぜなら、発注側が仕様書を書けないから。」
      なんてのは日本ではよくある話。
      親コメント
    • by Anonymous Coward
      「前工程に原因がある」なんて報告は出せないから、 「単純なプログラムミス」ってことで。

      あとは「コードが仕様ですから・・・」とか?
    • by Anonymous Coward
      問題が発生した場合、
      1.エラーログを見る
      2.そのエラーを出しうるコードを洗い出す
      3.そのコードの妥当性を検証する
      という過程で調べると思いますが、今回の場合、当日のうちに3の部分で不具合が見つかったわけで、本来ならコードレビューで潰されてしかるべきミスのはず。
      コードレビューをすり抜けたとしてもユニットテストでは絶対に潰されていないといけないミスです。
      • by k 2 y (5354) on 2007年10月29日 23時39分 (#1241563)

        問題が発生した場合、
        1.エラーログを見る
        2.そのエラーを出しうるコードを洗い出す
        3.そのコードの妥当性を検証する
        という過程で調べると思いますが、
        ログを見て分かるなら、設計/実装上は想定内の障害、ということで、1と2-3は明確に違いますね。
        # 逆に、2と3を明確に分けるポイントはなんでしょう?

        なんにせよ、しっかりvalidationのコードを書いていれば、実装~レビューの過程で考慮漏れとして見つかったでしょうね。
        validationをそれなりに実装しながらの考慮漏れとしたとき、ユニットテストを実装者本人がやっていたなら、ユニットテストで見つかる可能性は低い。まぁ、テストの帽子にかぶり替えていれば、見つかる可能性も少しは上がりますか。

        詳細なアルゴリズム/データ構造について、今の組み込みの現場では、どのくらいしっかりレビューするもんですかね?
        エンタプライズ系の受託な世界では、そこまで全件を第三者がレビューする現場って、多くはないと思う……。

        親コメント
      • by marudiana (31904) on 2007年10月29日 23時41分 (#1241564)
        関連記事をちゃんと読んでる?

        日本信号の発表では「データ数がある件数以上かつある条件下」で発生するバグだと言ってる。
        Cで通信プログラムを書いたことがあれば分かるけど、特定の条件でのみ発生するメモリ破壊系のバグはテストで叩き出すのが困難。
        この手のバグはコードレビューをすり抜けちゃうと、発覚する局面は事件になるときなんだよね。

        こういうバグに対抗するためにPurify、BoundsCheckerなんかのお高い検査ツールがあるんだけど、使ってたのかな。
        親コメント
        • by digl (19182) on 2007年10月30日 9時13分 (#1241676) 日記
          ちゃんと検査ツール使っている開発ってどのくらいあるのでしょうか。
          ウチも、客から
          「VS2005でコンパイルできるかどうか。動作するかどうかを検証してくれ」
          と言う依頼が来たことがありますが、もともとウチで作ったものではないので
          「ユーザマニュアルに従って、通る範囲内でのロジックの検証ならする。但し、ツール使うからその分払って(@はぁと」
          と言ってみたら、
          「誰が払うかボケっ」
          と、返事がきました。
          発注元はそれなりに有名な SIer だったので、「あんなところでもツールは使わないのか」と思ったのですが。
          --
          fj.jokes出身:
          親コメント
  • 心当たり (スコア:4, おもしろおかしい)

    by Anonymous Coward on 2007年10月29日 15時10分 (#1241336)
    期限切れなどの理由で使えなくなったカードをチェックするため、無効カードの情報(ネガデータ)が相互利用センターのサーバーから各駅の駅サーバーに送られてくる。駅サーバーはデータ処理に必要な情報を加えて、改札機や窓口処理機にネガデータの情報を送る。


    ちょうど前日に定期の期限が切れたので、当日継続で買ったオレのせいでしょうか?

  • by mgstyle (34119) on 2007年10月29日 18時43分 (#1241443) ホームページ 日記
    わかったことは

    私がこのコメントを

    『85レス増えることに 5件だけ理解できて
    余ったレス(理解できなかった80件)の、2行目以降読み飛ばす事だ』

    #私には高度過ぎる
    --
    [注意]コメント主は大変叩かれ弱い性質です。優しく接してあげて下さい
    ~おもしろおかしい以外に興味はありません~
  • 推測 (スコア:3, 興味深い)

    by Anonymous Coward on 2007年10月29日 14時10分 (#1241296)
    >5451件分(6万5518バイト)を一区切りとして処理される

    下位層のパケットが64Kバイト(ヘッダ17バイト+ペイロード65518バイト)単位で、そのペイロードの中に(12バイト*ネガティブデータ5451件+制御コード106バイト)があるという構造が見えてきます。

    >85件増すごとに5件の割合で、余った2バイトの処理を忘れる

    データが1件当たり12バイトなので、85件で1020バイト。おそらく、パケットをまたいだデータのバッファリング単位が1Kバイトなんでしょう。この時に何らかの原因でポインタの進め方を誤っていると想像されますが、「5件」てのがよくわかりませんねぇ。
    • Re:推測 (スコア:4, 興味深い)

      by Anonymous Coward on 2007年10月29日 14時25分 (#1241307)
      パケットを跨いだ後も必ず処理に失敗するわけじゃなくて、
      85件増える間にコケるパターンが5つある。
      それ以降も85件単位で同じパターンを繰り返す、てなとこじゃない?

      どちらかというとパケット云々の問題ではなく、
      内部のテーブルの初期サイズが 64KB
      溢れたら 1KB 単位で拡張、でも拡張するたびに特定の件数でエラー発生、
      てことのような気がする。
      親コメント
      • Re:推測 (スコア:3, 興味深い)

        by Anonymous Coward on 2007年10月29日 14時44分 (#1241318)
        僕もそう思います。
        誤る件数が85件につき5件なので、5*12=60、処理単位は64byteなんじゃないでしょうか。
        1KB拡張して64byteずつ処理するんだけれど、余りの分を考慮しようとして最後の64byteを捨ててしまうとか。

        もしくは64KBを越えた場合の件数のカウントが、本当は65536byte無い(65518byte区切り)のに65536/12=5461から始まってておかしくなるとか。
        親コメント
        • Re:推測 (スコア:2, 興味深い)

          by Anonymous Coward on 2007年10月29日 16時22分 (#1241380)
          捨ててるんなら気がつかずに動いちゃうんだろうけど、ないデータをあるものとして扱おうとして seg fault だかで落ちるという感じですかね。
          通信単位と処理単位のパケットサイズが違う場合って、動的に組み立ててカーソルをずらしていくようなものなので、バグが入りやすいところではあります。

          親コメント
        • Re:推測 (スコア:2, 興味深い)

          by switch720 (30495) on 2007年10月29日 23時55分 (#1241567) 日記
          こういうのはどうだろう。

          実は最後の 2byte は終了コードになっていて、
          開始ヘッダ 104byte + データ部 12N byte + 終了コード 2 byte
          みたいな構造になっていた。

          データが 5451件 に収まる場合には 65536byte 確保し、
          以後足りない場合には 64byte ずつ追加してメモリを補った。

          そのサイズの計算の際に、残り 2byte 分の容量の計算を忘れて、
          104 + 12N byte 確保すればいいものと勘違いしていた。

          そのために、
          5451 + 7 件のデータ => 65536 + 66byte 確保すべきところを 2byte 確保し忘れる。
          5451 + 23件のデータ => 65536 + 258byte 確保すべきところを 2byte 確保し忘れる。
          5451 + 38件のデータ => 65536 + 450byte 確保すべきところを 2byte 確保し忘れる。
          5451 + 54件のデータ => 65536 + 642byte 確保すべきところを 2byte 確保し忘れる。
          5451 + 70件のデータ => 65536 + 734byte 確保すべきところを 2byte 確保し忘れる。
          5451 + 86件のデータ => 65536 + 926byte 確保すべきところを 2byte 確保し忘れる。

          ... 以後 5458 + 16k ( k = 0, 1, 2,...) ごとに同様のことが起きる。

          その際に最後の(確保されていない)終了コードを読み書きする際に
          segmentation fault になって落ちる、という話ではないか。

          おそらく 12日のデータは丁度 5451 + 86 = 5537件のデータがあって、
          見事合致してしまった。
          それまでに同様の現象が 5 回起きる可能性があったのだが、
          見事合致しないで来ていた、ということでしょう。
          85件中5件という奇妙な数字はこの辺りから出てきたのであろうと。

          # なかの人ではないのでID
          親コメント
          • by switch720 (30495) on 2007年10月30日 0時35分 (#1241581) 日記
            しまった間違った。訂正。

              5451 + 7 件のデータ => 65536 + 66byte 確保すべき
              5451 + 23件のデータ => 65536 + 258byte 確保すべき
              5451 + 39件のデータ => 65536 + 450byte 確保すべき
              5451 + 55件のデータ => 65536 + 642byte 確保すべき
              5451 + 71件のデータ => 65536 + 734byte 確保すべき
              5451 + 87件のデータ => 65536 + 926byte 確保すべき

            12日のデータは 5451 + 87 = 5538件あったのでしょう。

            データが初めて 65536byte を越えるのは、5453件目(65542byte)で、
            ここから数えて 86 件目となります。
            それ以前の 85件の内の 5パターンにはたまたま合致しなかった、
            ということだと思います。違うかな。
            親コメント
    • by Anonymous Coward
      1件11バイトとすると、11の倍数じゃない大きさ(例: 1024)の入れ物から4バイトのレジスタで取出していくと、余り(端切れ)が奇数になる場合が5回あります。トレーラの処理に移る時に、余りが奇数だと死ぬとか?
      「2バイト」は不明。
  • 徐々に意訳された結果 (スコア:3, おもしろおかしい)

    by Anonymous Coward on 2007年10月29日 16時24分 (#1241383)
    最初、担当者が問題の仕組みを報告書にまとめます。
    次にそれを読んだ上司が専門用語だらけだから分かりやすく書き直せと指示されて新しい報告書ができます。
    それが上長に回ったとき、ここはこうじゃないだろう?!、更に報告書が改定されます。
    それが役員に回ったとき、ここはこうだろう?と更に報告書が改定されます。

    それを読んだ新聞社の担当は、一般の人には分かりにくいよねと自分なりの解釈が入ります。
    さらに編集長が校閲して、ここが・・・

    こうして出てきた記事は、もはやなんだか
    • 誰に読まれるか(読まれてしまうか)を考慮せずに報告書を作った担当者の「極めて単純なミス」です。
      過去に何度も同じ事象が発生してるでしょ?
  • by calc (16044) on 2007年10月29日 14時08分 (#1241293) ホームページ 日記
    TCP/IPみたくデータが一定サイズを超えると分割してそれぞれにヘッダを付ける仕様になっていたように見受けられますね。
    で、受信側が分割パケットを再構築する処理に問題があって変なところで切れるとうまく処理できなかったと。
    #という風に読めた
  • asahi.comの記事
    日本信号によると、期限切れなどの理由で使えなくなったカードをチェックするため、無効カードの情報(ネガデータ)が相互利用センターのサーバーから各駅の駅サーバーに送られてくる。駅サーバーはデータ処理に必要な情報を加えて、改札機や窓口処理機にネガデータの情報を送る。

      両機器は毎朝の立ち上げの際、ネガデータの最新版を取り込む。その際、窓口処理機は駅サーバーから直接データを受け取るが、改札機は監視盤という機器で書き換えられたデータを受け取る。

    以下、素人考えで申し訳ない。

    本論とは関係ないけど、毎朝の立ち上げの際、改札機や窓口処理機がネガデータの最新版を取り込む、とあるけれど、これではネガデータが増えたとき(稼動年月を経たとき、利用者が増えたとき)にデータのローディングで障害起きないかな。あるいはデータのローディングに時間がかかって、朝の立ち上げを早くしなくちゃいけないとか、夜のクロージング(あるのかそんな処理?)と朝の立ち上げがクロスするとか、朝の立ち上げに間に合わなくなるようなことにならないかな。

    一定の条件に合致するものはローディングの対象とならないようになっているので大丈夫、とかデータ件数には想定があるのかな。
  • by Anonymous Coward on 2007年10月29日 14時15分 (#1241301)
    中のヒトがヒントを書いてたのに、なんで前のストーリーにリンクしないの?
    俺も中のヒトに聞いたけど、口止めされたので既に出てる情報を元に話したい。
  • by Anonymous Coward on 2007年10月29日 15時31分 (#1241350)
    別の視点から回答。

    >このバグ、どういう話だと思われますか?
    6万5518バイトと言う膨大な値を1レコードとして扱うと言うのは
    ”設計のバグ”の話でしょうね。

    突っ込みはいらないですか、そうですか。
  • んと (スコア:0, 余計なもの)

    by Anonymous Coward on 2007年10月29日 16時11分 (#1241373)
    【自動改札障害】事故原因が判明,「データ分割時の特定量」で読み込めず
    http://itpro.nikkeibp.co.jp/article/NEWS/20071015/284540/ [nikkeibp.co.jp]

    JR東日本の自動改札機トラブル、16日までにプログラム改修を完了
    http://internet.watch.impress.co.jp/cda/news/2007/10/15/17180.html [impress.co.jp]

  • わずか1文字分? (スコア:0, すばらしい洞察)

    by Anonymous Coward on 2007年10月29日 16時21分 (#1241378)
    >プログラムがわずか日本語1文字分のデータの処理を誤ったためだったことがわかった。
    >「極めて単純なプログラムミス」と専門家が指摘する欠陥は、のべ727駅、260万人の足に影響する事態に発展した。

    わずか1文字分のデータの処理を誤っただけで260万人もの足に影響するんだから

    ・ソフトウェアの品質保証のための費用
    ・ソフトウェアの品質保証のためのソフトウェアエンジニアに対する人件費

    について政府を頭にまじめに考えるべきなんじゃないの?

    コードの量と拘束時間と納入期限を基準に評価して給料出してて質が落ちるのは偽装食品だけじゃないぜ
    • Re:わずか1文字分? (スコア:4, おもしろおかしい)

      by yamajaki (13288) on 2007年10月29日 21時45分 (#1241521)
      > わずか1文字分のデータの処理を誤っただけで260万人もの足に影響するんだから

      もし50文字分のデータ処理を間違ってたら全国民の足に影響してたかもしれないですね.
      親コメント
    • Re:わずか1文字分? (スコア:2, すばらしい洞察)

      by Anonymous Coward on 2007年10月29日 23時01分 (#1241549)
      法律の条文でも、「以上」と「以下」のわずか1文字を間違えるだけで、
      とんでもないことになると思います。
      わずか1文字だけと侮るなかれ。
      親コメント
    • Re:わずか1文字分? (スコア:1, すばらしい洞察)

      by Anonymous Coward on 2007年10月29日 19時09分 (#1241462)
      カネを掛けたからといって、わずか1文字が消える保証はないですから。
      親コメント
    • by Anonymous Coward
      > コードの量と拘束時間と納入期限を基準に評価して

      そうでもしないと多くの「ソフトウェアエンジニア」は給料をもらえないのではないか?
typodupeerror

私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike

読み込み中...