WM_CREATE 引起的 bug 一则

今天在维护一个 Windows 程序时,发现一个 bug ,记录一下。

这是一个简单的 Windows 程序,在注册给窗口的 WinProc 回调函数中处理了 WM_CREATEWM_PAINT WM_TIMER 等消息。

bug 的现象是,WM_CREATE 的流程没有走完就开始处理 WM_TIMER 等消息了。表现起来仿佛 WinProc 被重入了。

仔细排查后发现,不知道什么奇怪的原因,我的 Win7 系统在处理 WM_CREATE 消息时,默认捕获了异常。导致消息处理的流程没有走完,但进程却没有崩溃,窗口也被正确创建出来了。然后这个窗口可以继续接收 WM_TIMER 等消息。

我在不同的机器上测试了一下,确认是 Windows 的问题。貌似过去没有碰到过。目前我用的是 Windows 7 的 64 位版本,使用 mingw32 生成的 32bit 程序。

有兴趣的同学可以一试,在

WinProc 里加几行:

case  WM_CREATE: {
    int *p = NULL;
    *p = 0;
    break;
}

这个非法地址写指令不会让进程崩溃。

google 了一下,似乎没有人反应类似问题。

评论