次のコードでは、関数foo
は自分自身を再帰的に 1 回呼び出します。内部呼び出しにより、アクセス違反が発生します。外部呼び出しが例外をキャッチします。
#include <windows.h>
#include <stdio.h>
void foo(int cont)
{
__try
{
__try
{
__try
{
if (!cont)
*(int *)0 = 0;
foo(cont - 1);
}
__finally
{
printf("inner finally %d\n", cont);
}
}
__except (!cont? EXCEPTION_CONTINUE_SEARCH: EXCEPTION_EXECUTE_HANDLER)
{
printf("except %d\n", cont);
}
}
__finally
{
printf("outer finally %d\n", cont);
}
}
int main()
{
__try
{
foo(1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("main\n");
}
return 0;
}
ここで期待される出力は
inner finally 0
outer finally 0
inner finally 1
except 1
outer finally 1
ただし、outer finally 0
実際の出力からは著しく欠落しています。これはバグですか、それとも見落としている詳細がありますか?
完全を期すために、VS2015 で発生し、x64 用にコンパイルします。驚くべきことに、x86 では発生しないため、これは本当にバグだと思います。