VS2010中的浮点内省-如何在不中断的情况下进行检查
Floating Point introspection in VS2010 - how do I check without breaking?
我参观了这里的房子,我以为我找到了解决方案。它似乎确实正确地识别了我所知道的问题,但也导致了大约一半的系统测试用例中无法解释的崩溃。
问题是我们的代码需要将客户端代码作为dll调用。我们可以控制我们的代码,但不能控制客户的代码,经验表明他们的代码并不总是完美无瑕的。我通过退出程序并清楚地显示可能出现的问题来防止分段错误,但我也遇到了来自客户端代码的一些被零除的异常,我想识别这些异常,然后退出。
我一直想做的是:
- 就在运行客户端的dll之前,打开浮点反省
- 运行客户端代码
- 检查是否有任何问题
- 关闭对速度的反省
理论上有很多方法可以做到这一点,但许多方法似乎不适用于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"应仅在全局作用域或命名空间作用域
从表面上看,这是一个直接的矛盾。
所以我的问题是:
- 文档是正确的,还是警告(我打赌是警告)
- 有可靠和安全的方法吗
- 我应该这么做吗,还是太危险了
您尝试过
#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无法更改已编译的代码。
所以,答案是:
- 两者都是正确的
- 是,
_controlfp_s
- 您缺少SSE2状态,所以它至少不完整
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何在不中断的情况下正确使用C++中的切换用例语句中的Fallthrough
- 在不中断引用的情况下移动静态库的 *.pdb 文件 - LNK4099
- 如何在不中断整个循环的情况下跳过循环交互 - C++
- 如何在不中断剩余代码的情况下仅C++中输入整数
- 在不中断串行的情况下禁用Arduino上的定时器0中断
- VS2010中的浮点内省-如何在不中断的情况下进行检查
- 在不中断 IO 的情况下处理信号
- 如何在不中断移动和复制构造函数的情况下声明虚拟析构函数
- 使用sigaction()可以在没有全局变量的情况下中断C++中的无限循环
- 在没有用户输入输入的情况下中断while循环
- 我可以在不中断代码的情况下删除此警告吗?