Diablo III の所持金増殖バグ、原因は整数値のオーバーフロー 36
ストーリー by reo
バグレン 部門より
バグレン 部門より
hylom 曰く、
人気オンラインゲーム「Diablo III」で 5 月 7 日にゲーム内貨幣を増殖させることができるバグの存在が明らかになり、波紋を広げている (Game*Spark の記事より) 。
通常のオンラインゲームではこのようなバグが発見された場合、バグによって生成されたゲーム内貨幣を没収したり、サーバーデータのロールバックを行うことで対策を取ることが多いのだが、Diablo III ではゲーム内のアイテムをリアルマネーで売買できる「リアルマネーオークションハウス」というシステムが存在するためこのような対策を取りにくい点も騒動に拍車をかけている。
さて、5 月 10 日時点で問題は解決され、オークションハウスも現在では復旧しているのだが、この問題の原因は「整数値のオーバーフロー」にあったことも明らかになった (本家 /. 記事より) 。
問題のバグはリアルマネーオークションで一定額以上のゲーム貨幣 (ゴールド) を出品してキャンセルすると、出品した金額以上のゴールドが戻ってくるというもの。具体的には、2 の 31 乗 (2,147,483,648 ゴールド) 以上の金額を出品すると「出品金額を 2 の 31 乗で割った余り」が手持ちのゴールドから引かれるにもかかわらず、キャンセルすると出品金額全額が戻ってくるということらしい。2 の 31 乗という数字から、出品金額関連の処理途中のどこかで 32 ビット整数型の変数が使われており、オーバーフローが発生していると推測できるとのこと。
お金はたくさんある所にさらに集まる法則 (スコア:2)
Re: (スコア:0)
スラド運営はこのスコアチート野郎取り締まれよ
Re:お金はたくさんある所にさらに集まる法則 (スコア:1)
「カルマボーナスを使わない」にチェックがついてないと、デフォルトで2になります。
システムの仕様どおりですよ。
Re: (スコア:0)
つまるところ、誰の話?が重要であり、内容は問わない
という思想の持ち主だって事
Re: (スコア:0)
「一定額以上のゲーム貨幣 (ゴールド) を出品してキャンセルする」
て書いてあるから、お金ができなくてもできるでしょ
お金持ちになれるかは、気づけるか気付けないかの差じゃないかな
Re: (スコア:0)
このゲームやったことないけど、2,147,483,648 ゴールドって多分、
RMTなしで集めるのは相当大変な額じゃないのかな。
Re:お金はたくさんある所にさらに集まる法則 (スコア:2, 参考になる)
度重なる調整の結果ゲームの難易度が初期より劇的に下がり、
ゲーム内通貨であるゴールドを含む戦利品を入手しやすくなった一方で
ゲーム内で流通する通貨を回収する手段が貧弱なため、
Diablo3経済はインフレの真っ最中です。公式がシステム面で想定しているレート下限をぶっちぎるレベルで。
このバグに必要な額も、そこそこ長いこと遊んでいるか転売しまくるか運が良ければ
RMTなんぞしなくても届く数字です。RMにしても数千円の小遣い銭レベルですし。
・・・まあ普通に遊んでいたら手にしないし、手にする必要のない額なのは確かですが。
ラスボスを倒せる程度の装備ならオークションハウスで本当にお安く手に入るし、
拾ったものは基本的に使えないし売れないので・・・
Re: (スコア:0)
オンラインゲーム、オフラインゲームを問わず、ゲーム内で1億すら稼いだ試しがない。
Re: (スコア:0)
今すぐ桃鉄をやるんだ
Re: (スコア:0)
マイナス1億になりました。
Re:お金はたくさんある所にさらに集まる法則 (スコア:1)
えっ、桃鉄ならマイナス30億とか普通じゃないの?
オーバーフローしてプラスになったりしないかなぁ
ドラクエ4を思い出した (スコア:2)
カジノのコインを買う時にゴールド計算が桁あふれして、
大量のコインを安価に買えちゃうバグがあったなぁ。
あと、こないだあった
http://it.srad.jp/story/13/02/14/0814239/ [srad.jp]
32768両編成とか。
#所持金32ビット整数でも足りないのか……
Re:ドラクエ4を思い出した (スコア:2)
このバグが直ったとして、次は 2^63 乗(9,223,372,036,854,775,808ゴールド?)で試す人がいそうですね。
Re: (スコア:0)
もう、浮動小数点数でいいんじゃないの、拡張倍精度なら精度も変わらないし、
浮動小数点も無限ではない (スコア:2)
浮動小数点でも指数部を溢れさせれば或いは、、、
Re:浮動小数点も無限ではない (スコア:2)
じゃあ、いっそBCDで…。
データ量が増える上に演算コストがかなり高くつきそうだな。
Re: (スコア:0)
所持金がInfiniteに…。
Re:ドラクエ4を思い出した (スコア:1)
浮動少数の加減算。なんと恐ろしい。
#精度が…精度が…
Re:ドラクエ4を思い出した (スコア:1)
a-b>0 と a>b の違いでバグを作ってしまったことがある
Re: (スコア:0)
(-1 > 1UL) みたいなこともあるし、数字は苦手です。
Re: (スコア:0)
同じく。838861という数字は、きっと死ぬかボケるまで頭から離れません。
838861 x 20 = 1000004h だと気が付いたのは、それからずっと先の話でしたが。
Re: (スコア:0)
ドラクエ4といえば、「8逃げ」も逃走回数のカウンタを溢れさせてパルプンテの「力がみなぎってきた」効果ビットを強制的に立てるという原理だっけ。
未定義動作 (スコア:1)
Re:未定義動作 (スコア:1)
新キャラクター「鼻から出る悪魔」ですか。
# 討伐は最終クエスト
Re:未定義動作 (スコア:1)
C99は符号付きのオーバーフローも未定義動作じゃないよ。
実装定義の値が得られるか実装定義のシグナルが起きる。
C++は実装定義の値。
C11はどっちだったかな?
Re: (スコア:0)
自キャラが画面外に消えたり、崩れた背景を突き進んだり、壁に向かって歩き続けたりしながら
メモリやレジスタを書き換えつつ、気付いたらスタッフロールが呼び出されているわけですね。
TASさんがやってるのをよく見ます。
signed 整数扱い (スコア:0)
で、「-1 * 2^31」とかにならなくて良かったっすね。
Re: (スコア:0)
それは出品時にお金がもらえてキャンセル時にもお金がもらえるとゆー。
運営的にはどっちでも変わらんし、ユーザー的にはそっちの方が良いな。
問題は (スコア:0)
なぜこんな中途半端な数値で折り返したのか。
ぴったり20000000じゃだめだったのか。
この謎の数値に製作者からのメッセージが隠れている気がする。
Re: (スコア:0)
2,147,483,648(2の31乗)はコンピューターの世界では中途半端どころか実に区切りのいい数字ですけどね
Re:問題は (スコア:1)
ええい!まどろっこしい!
およそ3!およそ3だ!もうそれでいいじゃないか!!(バンバン
// 沈めてー(:>^
Re: (スコア:0)
むしろ20000000の何が「ぴったり」なのか聞きたい
Re: (スコア:0)
ちゃんとギビバイトって言わないとね
Re:問題は (スコア:1)
関係ないけどMicrosoftはGiBが使えません
Why does Explorer use the term KB instead of KiB? [msdn.com]
ハイパーインフレ (スコア:0)
このバグによる被害者は一般ユーザー全員で、損害はゲーム内通貨のインフレによる資産の目減りってことになるのかな?
タレコミ文の通りだと、出品→キャンセルを繰り返すごとに 2^31 を超えた分が倍々ゲームで増えてくってことですよね。
ゴールドの換金レートも、あっと言う間に落ち込んだんじゃないのかな。
Re:ハイパーインフレ (スコア:2)
> タレコミ文の通りだと、出品→キャンセルを繰り返すごとに 2^31 を超えた分が倍々ゲームで増えてくってことですよね。
2,147,483,648+1ゴールドを出品すると、所持金から1ゴールドしか引かれず、キャンセルすると2,147,483,648+1ゴールド戻ってくる、って話だと思います。