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

Visaカードで 23,148,855,308,184,500ドルの請求発生、原因はプログラムエラー 100

ストーリー by soara
今月のお支払い金額は200京円になります 部門より

あるAnonymous Coward 曰く、

Visaカード所有者に誤って23,148,855,308,184,500ドルの請求が発生するという事態が何件か起きていたそうだ(CNN.com, CNN.co.jp)。

本家記事によると、この請求された金額からどのようなエラーが発生していたかを導き出せるとのこと。恐らく保存されている数字は「23,148,855,308,184,500.00」の100倍、すなわち「2314885530818450000」という数字になる。この数字を16進数で表すと「20 20 20 20 20 20 12 50」となる。C/C++を触っているプログラマーなら何が起きたか、お分かりだろう。16進数の「20」はスペースであり、2進数でゼロが入力されるべき箇所にスペースが入力されたため、世界の GDPを超えるような天文学的金額の請求が発生したのでないかと考えられるそうだ。

なお、Visaは問題のプログラムエラーは既に修正済みと説明しているとのことだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • マスターカードだと (スコア:5, おもしろおかしい)

    by stosh (4158) on 2009年07月19日 11時33分 (#1607427) 日記
    やっぱりマスターカードだと、こういう誤請求の時は、
    "Priceless"
    って印刷されてるんですかね?
  • むす人好きーさん (スコア:4, おもしろおかしい)

    by Anonymous Coward on 2009年07月18日 11時53分 (#1607052)

    ムスジンスキーさんは当初、あまりの超高額な数字に借金まみれの自分を想像、まだ生まれてもいない孫や、その孫の代までずっーっと返済が続くのかと恐れおののいたという。

    なんてお人好しな…

    • Re:むす人好きーさん (スコア:3, おもしろおかしい)

      by Anonymous Coward on 2009年07月18日 13時04分 (#1607087)
      おじいちゃんが残した借金のせいで、今年の僕のお年玉はたったの100円
      親コメント
    • by Anonymous Coward
      野暮つっこみだけど ムシンスキー か マジンスキー のどっちかじゃなかろうかね
  • by jtaka (2821) on 2009年07月18日 21時51分 (#1607263)

    FM Fukuokaのモーニングジャムでこのことが報じられたときに、請求された人とクレジット会社の間で電話で2時間ぐらい押し問答があったらしいことに、パーソナリティのなかじーが引っかかっていたのが印象に残っている。
    # 「押し問答しようがなかろうもん!」ってことで。

  • by iwakuralain (33086) on 2009年07月19日 3時55分 (#1607330)

    何を買ったか知らないがそれを返却してれば最高の金持ちになったかもしれない。
    というかもし気づかずに返済日が来ていたらバンクオブアメリカはいきなり凄まじい負債が増えて驚いたかもしれない。

  • プロセッサ速度 4294967295MHz (スコア:3, おもしろおかしい)

    by kmra (33703) on 2009年07月20日 0時11分 (#1607641) 日記

    LEXMARKのプリンタドライバさんには実力よりずいぶんと高く評価していただきました。
    でも、LEXMARKのプリンタドライバさんは周波数ではない何かを感じたらしく、「お使いのコンピュータシステムはシステムの最低必要条件を満たしていません。ソフトウェアをインストールすることはできますが、最適な使用環境ではありません」と伝えてきましたとさ。

  • <blockquote>
    2 進数でゼロが ………
    </blockquote>

    2 進数だろうが、10 進数だろうが 0 は 0 なんだよ 8-)
    • by Anonymous Coward

      20が0x20のスペースだったとして普段0が0x30として扱われてない不思議も気になります

      • 32bit整数ではこんな大きい数字は扱えないので、自前で作った何らかの多バイト長整数と、
        char型配列を用いて多バイト長整数の値を設定する関数があったとします。

        数字が10進数文字列で保存されていたとすれば、
        数字はちゃんと処理されてスペースが0x20のまま処理されたとしても、
        例えば、"123"の値は 1*100 + 2*10 + 3になるのだから、
        " 3"の値は 20*100 + 20*10 + 3になると考えるのが自然だが、
        20*256^2 + 20*256 + 3になっているように見える。

        数字が文字列でなくバイナリで保存されていてbyteごとに処理していたなら、0x20も妥当な数字として意味を持つはず。

        数字が16進文字列で保存されているならば、例えば頭に4つ連続したスペースが入ると、
        '0'から'f'には適切な処理が行われて、0x20はそのまま読み込まれるとしても
        0x20*0x1000 + 0x20*0x100 + 0x20*0x10 + 0x20 = 0x22220
        のように、頭に0x22が出てくるはず。

        なので、値を設定する関数の間違いではないと思うのです。
        つまり内部構造を理解せずに内部構造を直接いじったバカがいたのではないか、と。

        多バイト長整数が
        struct BigInt{
        unsigned char nums[BIGINT_LEN];
        };
        のような感じで実装されていて、整数がバイナリで入っているとしましょう。

        きっと、彼は、数字を右揃えで表示したかった。
        どうすればいいか考えていたら、多バイト整数型が(unsigned) charの配列で実現されていることを発見した。

        「そうか!数字は文字列として保存されてるんだ!」
        →配列の頭に' 'を入れる
        --
        1を聞いて0を知れ!
        親コメント
      • みんな、これをビッグエンディアンだと決めつけていないか?今、気づいたんだが「2314885530818450000」をリトルエンディアンで格納すると「50 12 20 20 20 20 20 20」というバイトオーダになる。そしてそれぞれのバイトに 0x20 を足すと 「70 32 40 40 40 40 40 40」 だ。これを特別なプログラムで処理する。

        #include <stdio.h>
        #include <stdlib.h>

        int main(void)
        {

                        int i;
                        char digit[8] = {0x70, 0x32, 0x40, 0x40, 0x40, 0x40, 0x40};

                        for (i = 0; i < 8; i++)
                                        putchar(digit[i]);

                        putchar('\n');

                        exit(EXIT_SUCCESS);
        }

        おい、ヤナワ実行してみてくれ。

        p2@@@@@

        ………
        親コメント
    • by Anonymous Coward
      しかし、C/C++ では 10 進数でゼロを表現できないのである。
  • by Anonymous Coward on 2009年07月18日 13時45分 (#1607109)

    HEXエディタ的なものでバイナリデータを直接いじっていて、修正箇所を0埋めにしたい時に誤ってスペースバーで消してしまい、0x20になってしまった、ということなら十分あり得るミスだと思うのだけれども(ASCIIダンプ上では空白になるので)
    プログラムのミスやバグで0x00を0x20で埋めてしまうようなことってあるのだろうか?
    もしタレコミの説が本当の原因だったとしたら、どうも人為的なデータの改竄ミスが起きていたのではないかと疑ってしまうのだが・・・

  • by Anonymous Coward on 2009年07月19日 3時08分 (#1607324)
    > 恐らく保存されている数字は「23,148,855,308,184,500.00」の100倍、すなわち「2314885530818450000」という数字になる。この数字を16進数で表すと「20 20 20 20 20 20 12 50」となる。

    16進数の内部表現を10進数に変換して表示しているいう前提から、スペースパディング説が出てくるのだ。
    なのでBCDだの文字列だのは本末転倒もいいところ。
    • by saitoh (10803) on 2009年07月19日 20時32分 (#1607546)
      まず最初にバイナリで100倍( 1100100倍)していることを忘れずに。 もし、BCDでセント単位の数値を持っていたとしたら、100倍しても 0x20 20 20 20 20 20 12 50というバイト列にはならんでしょ。 たとえばパックBCDだとすると、 +23148885530818450は、 0x02 31 48 88 55 30 81 84 50 0C 。しかし、セント単位のBCDで保持していたとすると、これをを100倍して 0x02 31 48 88 55 30 81 84 50 00 0C になるだけ。
      親コメント
  • by Anonymous Coward on 2009年07月19日 17時54分 (#1607508)

    リンク先を読んだだけですが

    A technical snafu left some Visa prepaid cardholders stunned and horrified Monday to see a $23,148,855,308,184,500 charge on their statements.

    複数人が同じ金額の被害にあっていることがわかります。タレコミも「何件か起きていた」と書いていますね。

    The company assured customers that the problem has been fixed and that all falsely issued fees have been voided. "Erroneous postings have been removed ... this incident had no financial impact on Visa prepaid cardholders."

    誤請求を削除していることから、金額に誤りがあったのではなく、請求自体が誤りであったことがわかります。

    つまり、本来の請求額がゼロパディングのミスで書き換わってしまったなどという推測は全て的外れです。

  • by Anonymous Coward on 2009年07月18日 11時55分 (#1607055)

    自殺した人間はいたのかどうか
    もしいたならVisaが責任を持つのか

  • by Anonymous Coward on 2009年07月18日 12時24分 (#1607067)

    > C/C++を触っているプログラマーなら

    じゃあ他の言語のプログラマーはEBCDICコードでも使ってるのでしょうか?
    ASCIIコードは言語に依存しないですよ。(ISO8859でも、Unicodeでも、
    16進数でいう20、10進数でいう32はスペースですからねえ)。

    • 他の言語というか, それなりに抽象化が進んだ高級言語なら同一のデータが多義的に取り扱われるってことはありませんから.

      そういう高級言語では文字はいかなる場合でも文字でしかありませんし, バイナリデータはバイナリデータとして取り扱われます. 共用体を使えば同一の記憶空間を複数のデータ種別で取り扱うことが可能ですが, これについても高級言語では共用体に格納されているデータ種別を管理していて誤操作を防ぐようになっていたりしますから. それに比べればCなんかだと共用体の型管理は無いし, それどころか型キャスト一発でどんなデータも変換できるとか, char型にしても根本的に文字ではなくて8bitのバイナリデータに過ぎないとか

      そういう意味からすれば, ASCIIだろうがEBCDICだろうが文字コードという発想に至るだけで, それなりにCの様な低級言語/システム記述用言語なりアセンブラなりに親しんでいると思ってよいでしょう.

      親コメント
    • by Anonymous Coward on 2009年07月18日 17時38分 (#1607182)
      ASCIIは思い切り言語依存です。
      American Standard Code for Information Interchangeの略称だって忘れちゃったんですか?
      親コメント
    • by Anonymous Coward on 2009年07月18日 19時08分 (#1607212)

      じゃぁC/C++プログラマーがEBCDICコードを使ってることはないのでしょうか?
      C/C++は文字コードに依存しないですよ。\0の値は0とは限らないですよ!
      あと、EBCDICコードって書くとコードコード。

      親コメント
    • by Anonymous Coward

      おれが16進数を覚えたのはMSX-BASICでスプライトのパターンを作るためだったはず。
      2進数の方が直感的だろうけど、かったるいし。
      ASCIIコードも、だいたい覚えてた。いまは忘れたけど。
      次に16進数を触ったのはマシン語をハンドアセンブルでやったときかな。
      Cを勉強したのはずっと後になってから。

    • by Anonymous Coward

      COBOLだと0x20は'0'で' 'は0x40だそうです。

      # もうやだこの会社

  • by Anonymous Coward on 2009年07月18日 14時00分 (#1607113)
    T/O
  • by Anonymous Coward on 2009年07月18日 14時05分 (#1607116)

    こんなはっきりした間違いが残ったということは全くテストされていないとしか思えない。
    レアケースだろうが、プログラムした範囲はテストするものじゃないのか。
    修正などで手が入った箇所ならなおさら。
    つまり、未テストのコードがあとどれ位あるか・・・

typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...