【发布时间】:2015-09-27 08:11:03
【问题描述】:
在以下代码中,函数foo 递归调用自身一次。内部调用会引发访问冲突。外部调用捕获异常。
#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 上发生,这让我相信这确实是一个错误。
【问题讨论】:
-
嗯,不好。这不是一个新问题,VS2013 的行为方式相同。看起来像 /SAFESEH 对我的结构限制,特定于递归,它在非递归情况下工作正常。很怀疑这里的任何人都可以解决这个问题,最好ping connect.microsoft.com。
-
@IInspectable 是编译器而不是平台使这个定义很好。
-
@IInspectable 不,是编译器决定发出代码。它可以发出代码来对 null 取消引用做一些不同的事情。没有编译器。
-
@DavidHeffernan:编译器不会发出任何特殊的东西。
*(int*)0=0;产生指令mov dword ptr [0],0。 SEH 是一种系统服务,操作系统可以很好地定义结果。 -
@IInspectable 除非编译器决定在取消引用 nullptr 时发出代码以执行不同的操作
标签: c++ winapi seh structured-exception