ページ内ジャンプ:

アレゲなニュースと雑談サイト

nabeshinによる 2007年10月29日 13時44分の掲載
カードは翌日から無効になる?部門より。

Anonymous Coward曰く、

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

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

関連ストーリー

この議論は賞味期限が過ぎたので、保存されている。 新たにコメントを書くことはできない。
表示オプション しきい値:
  • sladoslado (28918) : 2007年10月29日 16時31分 (#1241388)
    >「極めて単純なプログラムミス」と専門家が指摘

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

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

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

    • k 2 y (5354) : 2007年10月29日 23時39分 (#1241563)

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

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

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

    • marudiana (31904) : 2007年10月29日 23時41分 (#1241564)
      関連記事をちゃんと読んでる?

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

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

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


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

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

    私がこのコメントを

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

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

    Anonymous Coward : 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, 興味深い)

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

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

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

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

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

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

          switch720 (30495) : 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
        • 2個のコメント が現在のしきい値以下です。
    • 3個のコメント が現在のしきい値以下です。
  • 徐々に意訳された結果 (スコア:3, おもしろおかしい)

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

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

    こうして出てきた記事は、もはやなんだか
    • Anonymous Coward : 2007年10月29日 19時52分 (#1241482)
      話を少しでも大げさに見せかけたいのでしょう。
      「2」バイト よりも 日本語「1」文字 と書いた方が、
      より小さなミスであの大きな騒ぎが起こされたかのように印象づけることができます。
      そのビット数が日本語の文字を表現するかどうかという議論に意味などありません。
      • Anonymous Coward : 2007年10月29日 20時39分 (#1241502)
        全角ひらがなや漢字1文字分のデータ量だ

        この表現の意味って、タバコ1箱分とか東京ドーム何杯とか、一般人に説明するための概算での例えの意味だろ。
        文章として特定の事実を指すのに「分のデータ量」、分の量とは言わない。
    • 3個のコメント が現在のしきい値以下です。
  • TCP/IPみたくデータが一定サイズを超えると分割してそれぞれにヘッダを付ける仕様になっていたように見受けられますね。
    で、受信側が分割パケットを再構築する処理に問題があって変なところで切れるとうまく処理できなかったと。
    #という風に読めた
  • asahi.comの記事
    日本信号によると、期限切れなどの理由で使えなくなったカードをチェックするため、無効カードの情報(ネガデータ)が相互利用センターのサーバーから各駅の駅サーバーに送られてくる。駅サーバーはデータ処理に必要な情報を加えて、改札機や窓口処理機にネガデータの情報を送る。

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

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

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

    一定の条件に合致するものはローディングの対象とならないようになっているので大丈夫、とかデータ件数には想定があるのかな。
    --
    コタツ出したら負けかなと思ってる。 [twitter.com]
  • Anonymous Coward : 2007年10月29日 15時44分 (#1241357)
    1レコードとして扱ってるようには読めませんが。
    計算上は1レコードは12バイトでしょ。
  • Anonymous Coward : 2007年10月29日 16時23分 (#1241382)
    Re:以下、ニュース聞いた瞬間思い浮かべた原因を書き連ねるスレ [slashdot.jp]:
    特定のサイズのみか。バッファを確保するときにある単位で確保していて、ちょうど整数倍になったときにバッファオーバランしたとかかな?例えば、256[B]単位でバッファを確保するようになっていて、ちょうど65536[B]のデータを受信したときに65536 + 1[B]のバッファを確保するために(65536 + 1) % 256 = 257個分のバッファが必要なところ、65536 % 256 = 256個分のバッファ確保、とやったとか。

    このへんでしょうか。

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

    Anonymous Coward : 2007年10月29日 19時09分 (#1241462)
    カネを掛けたからといって、わずか1文字が消える保証はないですから。
  • Re:わずか1文字分? (スコア:4, おもしろおかしい)

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

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

    Anonymous Coward : 2007年10月29日 23時01分 (#1241549)
    法律の条文でも、「以上」と「以下」のわずか1文字を間違えるだけで、
    とんでもないことになると思います。
    わずか1文字だけと侮るなかれ。
  • 6個のコメント が現在のしきい値以下です。