在驱动程序开发中使用静态分析工具.ppt
《在驱动程序开发中使用静态分析工具.ppt》由会员分享,可在线阅读,更多相关《在驱动程序开发中使用静态分析工具.ppt(36页珍藏版)》请在三一文库上搜索。
1、 在驱动程序开发中 使用静态分析工具 Adam Shapiro Senior Program Manager US-Networking Core PM 议程 静态分析工具 什么是静态分析? 静态分析工具的优点 下一版Windows将有哪些更新? PREfast for Drivers (PFD) 核心的PREfast代码注解(annotations) Static Driver Verifier (SDV) RoleTypes 总结 什么是静态分析? 源代码的编译期间分析 类似于代码走查, 但由工具来完成 一个简单的例子就是编译期间的类型检查 检查对定义完善的限制条件的违反 过程调用约定和A
2、PI约定 由静态检查工具发现的代码错误 示例 f()要求p不为NULL: 重复结束同一个IRP: IoCompleteRequestIoCompleteRequest ( (IrpIrp); ); . . IoCompleteRequestIoCompleteRequest ( (IrpIrp);); p = NULL;p = NULL; f(p);f(p); 为什么使用静态分析? 低级代码错误低级代码错误! ! 经验法则经验法则 “ “如果有一个缺陷在程序员的桌面上修正要花如果有一个缺陷在程序员的桌面上修正要花1 1美元,美元, 那么一旦这个缺陷已经被集成到完成的程序中,将那么一旦这个缺陷已
3、经被集成到完成的程序中,将 需要需要100100美元来修正,如果在软件被应用部署之后美元来修正,如果在软件被应用部署之后 才发现这一缺陷,代价将达到数万美元。才发现这一缺陷,代价将达到数万美元。” ” “Building a Better Bug Trap” The Economist June 2003“Building a Better Bug Trap” The Economist June 2003 工具可以提高你的效率 按钮技术 100%的路径覆盖率 成本低(让计算机帮你做) 快速 (计算机在几分钟或几小时内完成几个星期的人力工作) 尽早发现缺陷 甚至在拿到硬件设备之前 在设计测试用
4、例之前 在平常写代码的时候 缺陷报告容易使用 在源代码中直接给出缺陷路径(或者是关键点),降低调试代码的成 本 静态分析 如何工作? 建立一个驱动的抽象模型,沿着所有路径完整检查执行代码 抽象模型更简单:被简化了 简化到能够完整检查(模拟)的程度 跟驱动程序近似 控制部分保持一致 保留所有路径并同等对待 数据状态是近似的 如果参数x无约束条件, 假定一切值都是可能的。 如果(x0)在测试点是成立的, 维护布尔值(x0), 而不是x的整数值:布尔值比整数值更简单 If (x 0) IoCompleteRequest (Irp); 静态检查工具 不是银弹 不是替代功能测试 针对违反定义良好的约束条
5、件 局限性 不可能知道所有会发生错误 算法是基于源代码的抽象和启发 结果可能是错误的肯定和错误否定 是个好用的工具 静态分析工具比较 PREPREf fast for Driversast for DriversStatic Driver VerifierStatic Driver Verifier 驱动模型驱动模型 任意任意WDMWDM KMDFKMDF NDISNDIS 语言语言 C C和和C+C+只支持只支持C C 发现的问题发现的问题 本地的缺陷本地的缺陷 易于修正易于修正 大规模大规模 全局的缺陷全局的缺陷 难以修正难以修正 小规模小规模 范围范围 进程级进程级 本地的违例本地的违例
6、 进程间进程间 发现深层错误发现深层错误 开发周期开发周期 早期使用早期使用: : “ “编译驱动的时候编译驱动的时候” ” 运行仅需几分钟,所以请经运行仅需几分钟,所以请经 常运行常运行 后期使用后期使用: : “ “驱动基本结构成形的时候驱动基本结构成形的时候” ” 定期运行定期运行, , 修正错误后运行修正错误后运行 KMDFKMDF验证平均需时验证平均需时 = 20 min = 20 min WDMWDM验证平均需时验证平均需时= 40 min= 40 min 两种静态分析工具并用 WDK中提供的两种互补技术 PREfast for Drivers: 在每个进程中深度分析可能的违例 S
7、tatic Driver Verifier: 延执行路径,跨进程间的边界 ReadFoo ( PIRP ReadFoo ( PIRP IrpIrp ) ) . . status = Bar ( status = Bar (IrpIrp);); if (status) if (status) IoCompleteRequestIoCompleteRequest( (IrpIrp);); Bar ( PIRP Bar ( PIRP IrpIrp ) ) . . IoCompleteRequestIoCompleteRequest( (IrpIrp);); return STATUS_SUCCESS
8、; return STATUS_SUCCESS; 两种静态分析工具并用 示例 ReadFoo ( PIRP ReadFoo ( PIRP IrpIrp ) ) PIRP p = NULL; PIRP p = NULL; . . if (status) if (status) IoCompleteRequestIoCompleteRequest(p);(p); X X X X PFD有什么更新? 微软内部推动 “PFD Clean” Windows 7 Microsoft拥有的内置驱动和WDK范例完全通过PFD 微软的驱动和WDK的公共头文件都有注解 内部引擎的改进 表达式的范围更广 支持常量,
9、 成员名字, 无副作用的C表达式 更好的注解错误检查 WDK中包含部分微软自动代码检查(OACR) SDV有什么更新 内置驱动和 WDK KMDF, WDM范例通过SDV 针对NDIS的SDV 和NDIS组无缝的合作 为NDIS驱动新增39个新规则 针对WDM和KMDF的扩展规则集 可靠性, 安全性, IRQL, 同步, 正确的对象创建规则 WDM, KMDF, 和NDIS驱动的角色类型 先决条件规则 进入前验证 引擎改进 改进性能,伸缩性和准确性 特别地,所有规则都减少NUR (无用结果) 驱动的PREfast 快速(典型情况是25倍的编译耗时) 发现大量的“疏忽” 错误和“硬” 错误 应用
10、于可编译的代码; 无需运行 PREfast for Drivers PREfast无法发现的一些错误 Null指针, 未初始化的变量 (延非常规路径) 本地的泄漏 (内存, 资源) 不匹配的参数 未检查返回值 格式/列表不匹配 一些IRQL的误用 容易忽略的各种特殊情况 例如,取消IRQL 回调/函数指针的恰当使用 问题: 驱动特有的资源泄露 void LeakSample(BOOLEAN Option1)void LeakSample(BOOLEAN Option1) NTSTATUS Status; NTSTATUS Status; KIRQL OldIrql; KIRQL OldIrql
11、; BufInfo *pBufInfo; BufInfo *pBufInfo; KeAcquireSpinLock(MyLock, KeAcquireSpinLock(MyLock, /. /. if (Option1) if (Option1) pBufInfo = ExAllocatePoolWithTag(NonPagedPool, sizeof(BufInfo), pBufInfo = ExAllocatePoolWithTag(NonPagedPool, sizeof(BufInfo), fuB_);fuB_); if (NULL=pBufInfo) if (NULL=pBufInf
12、o) return STATUS_NO_MEMORY; return STATUS_NO_MEMORY; /. /. KeReleaseSpinLock(MyLock, OldIrql); KeReleaseSpinLock(MyLock, OldIrql); return STATUS_SUCCESS; return STATUS_SUCCESS; / #include #include PKSPIN_LOCK PKSPIN_LOCK MyLockMyLock; ; typedef typedef structstruct char buff100; char buff100; BufInf
13、oBufInfo; ; 应用PFD: 驱动特有的资源泄露 void void LeakSampleLeakSample(BOOLEAN Option1)(BOOLEAN Option1) NTSTATUS Status; NTSTATUS Status; KIRQL KIRQL OldIrqlOldIrql; ; BufInfoBufInfo * *pBufInfopBufInfo; ; KeAcquireSpinLockKeAcquireSpinLock( (MyLock,); /. /. if (Option1) if (Option1) pBufInfopBufInfo = = ExAl
14、locatePoolWithTagExAllocatePoolWithTag( (NonPagedPoolNonPagedPool, , sizeofsizeof( (BufInfoBufInfo), ), fuBfuB_);_); if (NULL= if (NULL=pBufInfopBufInfo) ) return STATUS_NO_MEMORY; return STATUS_NO_MEMORY; /. /. KeReleaseSpinLockKeReleaseSpinLock( (MyLockMyLock, , OldIrqlOldIrql);); return STATUS_SU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 驱动程序 开发 使用 静态 分析 工具
链接地址:https://www.31doc.com/p-2735160.html