[Visual C++] デバッグビルドで動作するコードがリリースビルドで動作しない件

この記事は3年以上前に書かれた記事です。情報が古い可能性があります。

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

タイトルとURLをコピーしました