作者: 邹铮
PREfast可以在编译代码的时候快速检测出潜在错误,其中主要包括以下几个方面:
内存
潜在的内存泄漏、非关联NULL指针、对未初始化内存的访问、对内核模式堆栈的过度使用以及对池标签使用不当
资源
未能释放资源:如锁、某函数持有的其不应该持有的资源以及函数未能持有的其应该持有的资源,
点评:PREfast代码检测能力
。函数用法
某些函数的不正确使用,可能不正确的函数参数、函数的参数类型不匹配(因为没有严格检查其类型)、可能使用某些过时的函数以及对可能不正确的中断请求(IRQL)的函数调用。
浮点状态
未能保护驱动中的浮点硬件状态以及将浮点状态保存在不同的IRQL后试图恢复浮点状态。
优先规则
因为优先规则C,代码不能按照程序员的要求执行
内核模式编码
编码做法也可能造成错误,如修改内存描述符表(MDL)结构、未能审查被调用函数的变量值、使用C运行时库字符串操作函数,而不是安全字符串(在Ntstrsafe.h中定义的)以及误用分页代码段,
电脑资料
《点评:PREfast代码检测能力》(https://www.unjs.com)。针对驱动的编码
具体操作通常是内核模式驱动程序的错误来源,例如复制整个I/O请求数据包(IRP)而并没有修改成员,或者向字符串或结构保存指针而不是将参数复制到DriverEntry例程。
重要性
PREfast能够高效检测出很多错误,并且它的报错方式通常能够帮助更加快速地解决问题,这是其他方法和工具无法企及的。这样就能够帮助用户将测试资源集中在寻找和修复更重大的bug上。然而,PREfast并不能找出所有可能的错误或者所有错误形式,因此通过PREfast检测并不一定意味着你的代码就是完全没有错误的。尽量使用所有可用工具来测试你的代码,包括Driver Verifier和Static Driver Verifier等。