VC++のデバッグビルドで動作するコードがリリースビルドで動作しない件

| コメント(0) | トラックバック(0)
VC++で、デバッグ構成でビルドしたプログラムでは動作するコードが
リリース構成でビルドすると動かないよ?ということが稀にある。

これはVC++の最適化によるものかもしれない。

例えば、次のコード。

void func() {
    int a;
    a = 100;
}

この関数内の変数 a に値が代入されているが、
この値は全く使用されていない。

このとき、コンパイラはこの代入文をなかったものとして扱う。

つまり、上記関数は

void func() {
}
(何も処理なし)

と同じってこと。

この場合は当然そうだけど、
例えばSという構造体にaというメンバがあるとして、
この値がfunc2という関数にポインタ渡しして使用する場合

void func() {
    S _s;
    _s.a = 100;
    func2(&_s);
}

となるけど、この場合も最適化によって、
_s.a に代入された値は使用されていないとみなされて

void func() {
    S _s;
    func2(&_s);
}
(_s.a = 100 という行がなかったことになる)

と同じ処理になってしまう(ことがある!)

こういうのを避けたい場合、
あえて最適化させないプラグマを埋め込む。

#pragma optimize("", off)
(ここに最適化させたくないコード)
#pragma optimize("", on)

こうすると コンパイルで C4748 警告が出るけど、
当該コードがバッファオーバーランしないことが確実なら無視すれば良い。


参考: [MSDN] コードの最適化
http://msdn.microsoft.com/ja-jp/library/xz7ttk5s%28v=vs.80%29.aspx

トラックバック(0)

トラックバックURL: http://sphere42.mlexp.com/mt5/mt-tb.cgi/213

コメントする

2017年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28        

アーカイブ

Powered by Movable Type 5.2.10