首页 > 解决方案 > 如何确保 C 代码(Visual Studio 2013 express + WDK 8.1,WDM 内核驱动程序)中没有浮点运算?

问题描述

几年前,我遇到了一个修改过的 moufiltr 驱动程序(由 Povohat 制造),它允许用户设置自定义的鼠标加速。该驱动程序使用浮点运算。我在 WDK7 示例中找到了一个 mouclass 示例驱动程序,基于 povohat 的 moufiltr 驱动程序我已修改此示例以包括可调加速度(来自 Quake 3 cl_input.c 的方程),但使用放大的整数而不是双精度数,因此不需要 KeSaveFloatingPointState。这样做的目的是也为 Windows XP 提供一些东西。

如果在计算中只使用了 LONGLONG 类型的变量(+、/、*、%),那么假设没有使用浮点运算是否安全?

标签: cwindowsvisual-studiofloating-point

解决方案


即使您的代码没有浮点文字、浮点变量和浮点类型转换,在编译的机器代码级别假设它没有浮点操作也是不安全的。通常,在关闭优化的情况下,编译后的代码基本上是源代码的直接翻译,在这种情况下,如果源代码中没有浮点机制,那么编译代码中也不会出现这种情况。但是,编译器通常可以完全访问目标架构的指令集,并且打开优化后,它们会根据优化标准(通常是速度和/或大小)大量修改最终编译的输出。在这种情况下,如果编译器认为某些(或全部)浮点指令是必要的,那么即使您的源代码没有它们,它们也会出现在编译的机器代码中。如果您的编译器不支持限制它可以使用的机器代码(汇编程序)指令,而 VS 2013 Express 不支持,那么找出答案的唯一方法是反编译已编译的代码并自己查找浮点指令。


推荐阅读