« 八耐に行ってきました | トップページ | 世襲はなぁ… »

学生さんの面白いバグ

学生さんのバグコード見てると、たま~に面白いのがある。狙ってできることではないので、こういう情報は貴重である。まず、状況を疑似体験してもらうためにこれを見てもらいましょう。

実行時にバトル画面に入った瞬間にこのメッセージボックスが出てクラッシュしました。

Bug

この場合、慌てて「中止」を押したくなるが、それはお勧めしません。デバッグ中のアプリケーションが終了してしまい、追いかけられなくなってしまうからです。このメッセージが出た場合には「再試行」が正解ですね。

さて、再試行を押してみましょう。するともう一回メッセージボックスが出ますが、これは「中断」です。

すると

 if(::_CrtDbgReportW(_CRT_ASSERT, file, line, NULL, L"%ls", message)==1)

        {

           ::_CrtDbgBreak();

        }

こんな感じの箇所で中断していると思います。正直このままでは何がなんだか分かりません。こういう場合は「呼び出し履歴(コールスタック)」を見ます。

Callstack_2

一つ一つ遡っていくと、自分が書いたコードらしき呼び出しがありますので、そこでダブルクリックします。

そうすると、

void

Player::CreateAction(char direction, char button, Sequence seq) {

        _actions[InputId(direction, button)].push_back(seq);

}

こういうコードに飛んできます。

で、ここを見た時に、パッと見、間違いが見当たらなかった場合には色々と考えちゃいます。とりあえず、どの部分でぶっ飛んだのかだけ記憶に置いたまま、再び事故現場に戻ります。

コールスタックの戦闘の部分でダブルクリックしてみて、自動変数を見てください。

messageの部分に

+                                                     message    0x00a23b3c L"invalid comparator"      const wchar_t *

と書いてます。意味がわからないと思いますが、そこはカンです。

invalidは辞書で調べると「不正な」って事で、何かがオカシイってのはわかります。

次にcomparatorですが、通常の辞書では出てきませんが「英辞郎」では出てきました。

http://eow.alc.co.jp/search?q=comparator&ref=sa

うん。

コンパレーター、比較器実際の電圧値と論理値を比較する回路。

なんか違うっぽい…。でもここで勘所を働かせます。compareってのが「比較する」って意味なのよね…。

ということはcomparatorってのは「比較するやつ」って感じで取ってもらえばいい。

 

その比較するやつが不正ってことは、おそらくは比較演算子かなんかが不正ってこと。あれ?そういえばmap関連で引っかかってたよな?ということで、<演算子オペレータオーバーロード関数を今一度見直してみると

 

bool operator<(const InputId& lval, const InputId& rval) {

 return lval.direction | (lval.button << 4) <

                (rval.direction | (rval.button << 4));

}

こんな感じになってたわけです。

よく見てください。

 

何かおかしくないですか?

 

そう、比較の<よりも後に|論理和演算子が評価されているためにまともに大小比較ができなくなっていましたー。

 

ガッコーのセンセーやってると、こういう面白いことに出くわす確率は高いですねー。

|

« 八耐に行ってきました | トップページ | 世襲はなぁ… »

仕事」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/165749/65235672

この記事へのトラックバック一覧です: 学生さんの面白いバグ:

« 八耐に行ってきました | トップページ | 世襲はなぁ… »