-
-
[求助]浮点指令有没有可能运算失败,得到-1.#INF结果?
-
发表于:
2010-1-9 22:30
5133
-
[求助]浮点指令有没有可能运算失败,得到-1.#INF结果?
遇到一个非常奇怪的问题,大致是这样的:
1、我设计了一个运算函数,内部浮点运算量非常大,没有用rand之类的任何随机算法来人为制造随机结果。
2、该函数没有调用math库,用到sqrt、sin、cos之类的,都是直接用fsqrt、fsin、fcos等指令直接完成的。
3、该函数在入口处用fnstcw读取浮点控制寄存器后,用fldcw写入0x027F,在退出函数前,用fldcw还原之前保存的内容,以此保证每次调用时的舍入控制、精度控制相同。
4、该函数被编译为DLL的导出函数,之后测试没有重新编译过其代码。
个人认为,这样的一个函数应该已经成为了一个运算结果只与输入参数有关的黑盒子。经过多次测试,被不同的Exe调用也似乎都符合了要求。但是真正应用的时候却出现了一个很奇怪的问题,某些时候,运算结果中会出现-1.#INF(运算结果是多个浮点,中间可能会出现一个)这类无效浮点,而根据我的算法,应该是绝对不可能出现的。
我开始怀疑是否是我的算法有BUG,于是我在调用函数前保存所有参数值,在计算完成后如果发现结果中存在-1.#INF,则将调用参数写入文件。于是我得到了可能会出错的调用参数,然后自己调试这些参数调用,问题是运算结果又是正确的。我让那个出错的Exe强制用这几个参数调用,结果也是正确的。
这就奇怪了,那问题到底还可能发生在哪里呢?难道是FPU的一些状态控制不对,会导致运算过程中出现-1.#INF吗?
[课程]Linux pwn 探索篇!