過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

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 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。