VS-2019 程序在某些服务器上的第一条浮点指令上崩溃

VS-2019 program crashes on first floating point instruction on some servers

我有一个代码可以运行多年的服务。

现在使用 VS-2019 16.3.7/8/9 我得到 0xC000001D(线程试图执行无效指令。)在某些机器上服务启动阶段的第一个浮点算法异常.

安装使用 16.2.4/5 编译的相同代码库。

我有一台机器的完整内存故障转储。崩溃发生在调用 _dtol3.

我在汇编代码中可以看到这种情况。

0149477B 83 3D B4 AC 55 01 06 cmp         dword ptr [__isa_available (0155ACB4h)],6  
01494782 7C 15                jl          _dtol3_default (01494799h)  
01494784 C5 FA 7E C0          vmovq       xmm0,xmm0  
01494788 62 F1 FD 08 7A C0    vcvttpd2qq  xmm0,xmm0  <---- CRASH

__isa_available 的值为 6。在我的机器上,该值为 5。我们可以看到崩溃的一台机器是 XEON Silver 4110 运行 我们的软件虚拟化。相同的 exe 在 XEON E5-2620 上运行。相同的 exe 在我公司的所有客户端机器上运行没有任何问题(新旧英特尔机器的混合)。

查看调用的代码,我可以看到将它与大于或等于 1.0 的值进行比较时,有一个简单的差异和除法。

COleDateTime nowClient = COleDateTime::GetCurrentTime(),
nowDB = GetCurrentTime();
COleDateTimeSpan diff = nowDB-nowClient;
if (diff.GetTotalMinutes()>=1)  // <----- CRASH
    ...

有没有办法影响VS中的代码创建,避免调用这段代码? (任何垫片、兼容性设置)

自 VS 16.2.4 以来,VS-2019 是否有任何已知的影响浮动数学的变化,这可能会影响我的问题?

您可以在其 "Properties" sheet:

中为每个项目启用或禁用 [​​=32=] 指令的生成
  1. 在解决方案资源管理器中右键单击项目,然后从弹出菜单中 select "Properties"。
  2. Select/Open 左侧窗格中的 "C/C++" 选项卡,然后 select "Code Generation" 项。
  3. 然后在右侧窗格中显示的属性列表中,select "Not Set" 用于 "Enabled Enhanced Instruction Set" 属性(或任何一个选项将为您提供代码)与您的目标 PC 兼容)。

编译器使用 vmovq 意味着您(至少)启用了 "Advanced Vector Extensions";另外,我认为(不是 100% 确定)vcvttpd2qq 属于 "AVX2" 类别。

这是 Visual Studio 的 16.3.x 更新中的错误。这里是 link 到 bug report.

仔细阅读,它实际上发生在支持 AVX512 的机器上,而不是最初 post 描述的旧 CPU。在 Microsoft 修复之前,这还包含一些解决方法来避免此问题。