2007/05/23

VC6.0 最適化時の一時変数のバグか?

 
どうも! VC6.0 未だに現役のエンジニアです。
 
VC2005 もそれなりに使ってるんだけど、ライブラリの開発とかコンパイラの制作VC6
進めております( ´д`)
 
 
さて、今日はVC6 上の Release モード時のみで発生したバグのロジックを紹介します。
VC2005 では最適化時でも発生せず、今のところ VC6 上のみの確認です
 
 
 

 
class Test{
public:
    Test( int val ) : m_val(val){}
    ~Test(){}
     
     int getVal()const{ return m_val; }
 
private:
     int m_val;
};
 
int main( int argc, char* argv[] )
{
        Test test(100);
        const int& val = test.getVal();
        printf( "%d\n", val );
        return 0;
}

 

 

 

 

 

 

 

 

 

 

 
 
 
 
 
ロジック的には上記みたいな感じです。
 
上の const int& val が、トレースなどしてみると -1 になっちゃてるのですね。

 

しかし、実は上のソースでは問題は起きません。
 
 
基本的には、当たり前のようにうまくいくのです( 実際に当たり前ですが。。 )
 
うまくいかなかったのが、コンパイラ制作の際、1個所で起きただけで、今まで多数のWindowsアプリ
を作りましたが、今回が初めてなのです
 

ちなみに以下のようなコードにしても、値がおかしかったので最適化のバグだと思っております。


 
int tmp_val      = test.getVal();// 一旦ローカルにコピー
 
const int& val  = tmp_val;      // ローカル変数の参照。。
                                       // なのに、この次では val は期待外の値になっている。tmp_valは期待値。

 

VC2005 の最適化では正しく挙動したのと、VC6でも最適化無しならば、特定の個所も期待通りに動きました( ´д`)

 

とりあえずスタックぶっ壊したからとかじゃなくて、VC6のバグと信じていますw

 
 
どなたか、VC6 上で 最適化時の一時変数の寿命のバグ を知っている方がいましたら、ぜひ教えてください!

0 件のコメント:

コメントを投稿