You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows 11 24H2下SEH处理浮点下溢异常失效问题求助

Windows 11 24H2浮点异常SEH处理失效问题分析

问题背景

我们的Fortran系统依赖一套已使用20年的Win32结构化异常处理(SEH)逻辑,用于捕获浮点下溢异常并将下溢值强制置零。但在Windows 11 24H2版本中,这套逻辑完全失效——触发下溢后会无限循环调用异常处理函数,无法恢复正常执行。

以下是简化的C语言测试代码,在24H2之前的Windows版本可正常运行,但在24H2中会无限打印handler:

#include "stdafx.h"
#include "float.h"
#include "windows.h"

LONG WINAPI handler(_EXCEPTION_POINTERS * ExceptionInfo)
{
    if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_FLT_UNDERFLOW)
    {
        puts("handler");
        // clear exception bits
        ExceptionInfo->ContextRecord->FloatSave.StatusWord &= 0x7f00;
        DWORD* p = (DWORD*)ExceptionInfo->ContextRecord->FloatSave.DataOffset;
        // store 0 (not actually needed for this test)
        if (p) *p = 0;
        return EXCEPTION_CONTINUE_EXECUTION;
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

int _tmain(int argc, _TCHAR * argv[])
{
    float x, y;
    unsigned int control_word;
    int ctrl;
    short sw;
    PVOID exh = AddVectoredExceptionHandler(TRUE, handler);
    // enable underflow exception
    ctrl = _controlfp_s(&control_word, 0, 0);
    ctrl = _controlfp_s(&control_word, ~_EM_UNDERFLOW, _MCW_EM);
    x = FLT_MIN;
    y = 20;
    // create an underflow
    _asm {
        fld x
        fld y
        fdiv
        fstp x
        wait // boom
        fnstsw sw // what sw do we have
    }
    printf("Finished: %20.7e %20.7e\n", x, y);
    return 0;
}

问题分析

核心可能原因

Windows 11 24H2对x87浮点异常的处理逻辑存在未公开的变更,主要可能涉及以下几点:

  • 异常状态位清除机制失效:原代码直接修改ContextRecord->FloatSave.StatusWord清除异常位的方式,在24H2中可能不再被系统认可——恢复执行前,系统可能会重新设置异常标志,导致下一条指令再次触发异常,形成无限循环。
  • FPU上下文同步逻辑调整:旧版本中修改上下文的FPU状态后,系统会正确同步到硬件FPU,但24H2可能改变了上下文恢复流程,导致修改的状态未被硬件应用,异常状态持续存在。
  • 指令集优先级变更:微软可能在24H2中强化了对SSE/AVX等现代浮点指令集的支持,弱化了对传统x87 FPU异常处理的兼容,导致旧SEH逻辑失效。

验证与修复方向

  • 验证FPU上下文结构变化:打印ExceptionInfo->ContextRecord->FloatSave的所有字段,对比Windows 11 24H2与旧版本的差异,确认状态位的偏移或含义是否改变。
  • 更换异常清除方式:放弃直接修改StatusWord,改用标准API或硬件指令清除FPU异常状态。例如在处理函数中调用_clearfp(),或在汇编中插入fnclex指令(需注意上下文切换的影响)。
  • 切换到现代浮点指令集:尝试使用SSE指令(如_mm_div_ss)触发浮点下溢,测试SEH逻辑是否正常工作,判断问题是否仅局限于x87 FPU。

关于微软改动性质的判断

目前微软未公开说明Windows 11 24H2对x87 FPU SEH处理的刻意变更,该问题更倾向于回归缺陷,但也不排除是系统优化过程中引入的未记录行为变化。由于官方支持渠道受阻,可尝试:

  • 在微软开发者社区提交详细问题报告,附上可复现代码、环境信息及版本对比测试结果。
  • 排查Windows 11 24H2的更新日志,查找与浮点处理、SEH相关的条目。

内容的提问来源于stack exchange,提问作者Rob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:27:35