« プログラムでチェックしよう! | トップページ | XBOX360の明日は、どうなる! »

2006年2月18日 (土)

最適化に喰らいました!

デバッグ版で動作しているのに…
リリース版でハング?

と言うのは、たまに有る…。

今回のボケが喰らったのは
コンパイラの最適化による
ハングアップ…。

散々調べて結果がこれ…。

2642:             switch( Index )
2643:             {
004335AA   jmp         dword ptr [eax*4+4339E0h]
2644:             case 0: Option.A = TRUE;   break;
004335B1   mov         dword ptr [Option+14h (0048a5f4)],1
004335BB   jmp         $L48839+0Ah (004335eb)
2645:             case 1: Option.A = FALSE;  break;
004335BD   mov         dword ptr [Option+14h (0048a5f4)],0
004335C7   jmp         $L48839+0Ah (004335eb)
2646:             case 2: Option.B = 0;     break;
004335C9   mov         dword ptr [Option+18h (0048a5f8)],0
004335D3   jmp         $L48839+0Ah (004335eb)
2647:             case 3: Option.B = 1;     break;
004335D5   mov         dword ptr [Option+18h (0048a5f8)],1
004335DF   jmp         $L48839+0Ah (004335eb)
2648:             case 4: Option.B = 2;     break;
004335E1   mov         dword ptr [Option+18h (0048a5f8)],2
2649:             }

「Index=-1」の時に何処か遠い所に逝かれます…。<マジ

直前に「if」が有るので、最適化が
「Index=-1」は来ないと判断したのかもしれない…。

実は、それは正しい!

    if( ( Index <= 0 ) && ( Index <= 4 ) )<こんな風に間違え
//    if( ( Index >= 0 ) && ( Index <= 4 ) )<本当は、こう
    {
        switch( Index )
        {
        case 0: Option.A = TRUE;   break;
        case 1: Option.A = FALSE;  break;
        case 2: Option.B = 0;     break;
        case 3: Option.B = 1;     break;
        case 4: Option.B = 2;     break;
        }
        Function( );
    }

直前の判断ミス(バグ)で「Index=-1」が
来てしまった…。

だからって…
逝く事は無いでしょう!

しかし、めったに喰らわないバグなので
早速ネタに使わせてもらいます!

|

« プログラムでチェックしよう! | トップページ | XBOX360の明日は、どうなる! »

コメント

コメントを書く



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




トラックバック


この記事へのトラックバック一覧です: 最適化に喰らいました!:

« プログラムでチェックしよう! | トップページ | XBOX360の明日は、どうなる! »