VS2010中的浮点内省-如何在不中断的情况下进行检查

Floating Point introspection in VS2010 - how do I check without breaking?

本文关键字:中断 情况下 进行检查 内省 VS2010      更新时间:2023-10-16

我参观了这里的房子,我以为我找到了解决方案。它似乎确实正确地识别了我所知道的问题,但也导致了大约一半的系统测试用例中无法解释的崩溃。

问题是我们的代码需要将客户端代码作为dll调用。我们可以控制我们的代码,但不能控制客户的代码,经验表明他们的代码并不总是完美无瑕的。我通过退出程序并清楚地显示可能出现的问题来防止分段错误,但我也遇到了来自客户端代码的一些被零除的异常,我想识别这些异常,然后退出。

我一直想做的是:

  1. 就在运行客户端的dll之前,打开浮点反省
  2. 运行客户端代码
  3. 检查是否有任何问题
  4. 关闭对速度的反省

理论上有很多方法可以做到这一点,但许多方法似乎不适用于VS2010。

我一直在尝试使用floating_point杂注:

#pragma float_control(except, on, push)
// run client code
#pragma float_control(pop)
__asm fwait;    // This forces the floating point unit to synchronise
if (_statusfp() & _SW_ZERODIVIDE)
{
    // abort the program
}

这在理论上应该是可以的,在实践中50%的时间都很好。

我认为问题可能是floating_point控件保持不变,并导致代码中其他地方出现问题。

据microsoft.com报道:

"/fp:precise、/fp:fast、/fp:strict和/fp:except开关控制逐文件的浮点语义。float_controlpragma在逐个函数的基础上提供这样的控制。"

然而,在编译过程中,我收到了警告:

警告C4177:#pragma"float_control"应仅在全局作用域或命名空间作用域

从表面上看,这是一个直接的矛盾。

所以我的问题是:

  1. 文档是正确的,还是警告(我打赌是警告)
  2. 有可靠和安全的方法吗
  3. 我应该这么做吗,还是太危险了

您尝试过

#pragma float_control(except, on, push)
// run client code
#pragma float_control(pop)

这不是它的工作方式。这是一个编译器指令,意思是

#pragma float_control(except, on, push)
// This entire function is compiled with float_control exceptions on.
// Therefore, the pragma has to appear outside the function, at global scope.
#pragma float_control(pop)

当然,这个设置只影响正在编译的函数,不影响它们可能调用的任何函数,比如你的客户端。#pragma无法更改已编译的代码。

所以,答案是:

  1. 两者都是正确的
  2. 是,_controlfp_s
  3. 您缺少SSE2状态,所以它至少不完整