C++でプログラムを書いています。このプログラムは Win32 (x86) で問題なく動作しており、最近 x64 用にネイティブにコンパイルしてみました。もちろん、物事はすぐにはうまくいきませんでした。
問題をデバッグした後、次の簡単なコード スニペットで問題を再現できました。
class MyException { };
int main()
{
try {
for (;;) {
try {
std::cout << "Throwing" << std::endl;
throw MyException();
if (1 == 0) {
continue;
}
} catch (const MyException&) {
std::cout << "Catch 1" << std::endl;
}
}
} catch (const MyException&) {
std::cout << "Catch 2" << std::endl;
}
std::cout << "Done" << std::endl;
return 0;
}
(if (1==0)
すぐに条項を説明します)
MSVC for x86 (私は 2010 を使用しました) を使用してこのコードをコンパイルすると、結果は期待どおりになります。
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
...
など、無限ループで。
ただし、このコードを x64 用にコンパイルすると、次のようになります。
Throwing
Catch 2
Done
例外は内部の catch 句を完全にスキップします!
if (1 ==0)
これは、コードに句が存在する場合にのみ発生します。削除すると、予想どおり「Catch 1」で例外がキャッチされます。
私は他のコンパイラを使用してみました:
- このバグは VS 2012 でも発生します。
- MinGW と MinGW-w64 は期待どおりに動作します。
私の質問: これは MSVC のバグですか、それとも C++ の未定義の動作ですか? これが実際に MSVC のバグである場合は、原因についての洞察を聞きたいです。
ありがとう。