我有一项运行了多年的代码的服务。
现在使用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可以在我公司的所有客户端计算机上运行,而不会出现任何问题(新旧Intel机器混合使用)。
看看被调用的代码,我发现将值与大于或等于1.0的值进行比较将值加倍是简单的区别和除法。
COleDateTime nowClient = COleDateTime::getcurrentTime(),nowDB = getcurrentTime();
COleDateTimeSpan diff = nowDB-nowClient;
if (diff.GetTotalMinutes()>=1) // <----- CRASH
...
是否有任何方法可以影响VS中的代码创建,从而避免调用此代码? (任何垫片,兼容性设置)
自VS 16.2.4以来,VS-2019中是否存在任何影响浮动数学的已知变化,可能会影响我的问题?