gpt4 book ai didi

c++ - VS2010 中的浮点自省(introspection) - 如何在不中断的情况下进行检查?

转载 作者:行者123 更新时间:2023-11-30 04:10:40 24 4
gpt4 key购买 nike

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

问题是我们的代码需要以dll的形式调用客户端代码。我们可以控制我们的代码,但不能控制客户的代码,经验表明他们的代码并不总是完美无缺的。我已经通过退出程序并发出可能出了什么问题的明确消息来防止段错误,但我也有一些来自客户代码的被零除异常,我想识别并然后退出。

我一直想做的是:

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

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

我一直在尝试使用 floating_point pragma:

#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:

"The /fp:precise, /fp:fast, /fp:strict and /fp:except switches control floating-point semantics on a file-by-file basis. The float_control pragma provides such control on a function-by-function basis."

但是,在编译期间我收到警告:

warning C4177: #pragma 'float_control' should only be used at global scope or namespace scope

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

所以我的问题是:

  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 状态,所以它至少是不完整的

关于c++ - VS2010 中的浮点自省(introspection) - 如何在不中断的情况下进行检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20542699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com