摘要 | 第5-6页 |
ABSTRACT | 第6页 |
第1章 绪论 | 第12-18页 |
1.1 背景介绍 | 第12-13页 |
1.2 本文工作 | 第13-14页 |
1.3 相关工作与比较 | 第14-15页 |
1.4 章节安排 | 第15-18页 |
第2章 工具框架 | 第18-24页 |
2.1 ShapeChecker简介 | 第18页 |
2.2 符号执行 | 第18-20页 |
2.3 执行状态 | 第20-21页 |
2.4 函数行为系统 | 第21-22页 |
2.5 LLVM编译器框架 | 第22-24页 |
第3章 分析C++的面向对象特性 | 第24-48页 |
3.1 基本概念与工作思路 | 第24-26页 |
3.2 从元信息中获取类型定义 | 第26-31页 |
3.3 类型标签与类型断言 | 第31-34页 |
3.3.1 类型信息和类型标签 | 第31页 |
3.3.2 类型标签的存放和操作 | 第31-33页 |
3.3.3 类型断言 | 第33-34页 |
3.4 虚函数调用 | 第34-36页 |
3.5 RTTI与dynamic_cast操作符 | 第36-39页 |
3.6 类型信息的特殊处理 | 第39-41页 |
3.6.1 构造函数的嵌套调用 | 第39-40页 |
3.6.2 析构函数的嵌套调用 | 第40-41页 |
3.7 内存管理机制 | 第41-47页 |
3.7.1 检测内存操作的错配 | 第42-43页 |
3.7.2 new[]/delete[]操作符和其行为的编写 | 第43-46页 |
3.7.3 与内存管理相关的函数行为 | 第46页 |
3.7.4 杂项 | 第46-47页 |
3.8 本章小结 | 第47-48页 |
第4章 分析C++的异常处理特性 | 第48-60页 |
4.1 异常的抛出 | 第49-51页 |
4.1.1 异常抛出场景的IR模式 | 第49页 |
4.1.2 对异常抛出的符号执行 | 第49-51页 |
4.2 异常的捕获 | 第51-54页 |
4.2.1 异常捕获场景的IR模式 | 第51-53页 |
4.2.2 landingpad指令及对其模拟执行的算法 | 第53页 |
4.2.3 catch语句的边界 | 第53-54页 |
4.3 函数行为中的异常 | 第54-56页 |
4.3.1 跨函数的异常处理和异常断言 | 第54-55页 |
4.3.2 异常断言 | 第55页 |
4.3.3 使用异常断言更新状态 | 第55-56页 |
4.4 函数异常规范 | 第56-58页 |
4.5 本章小结 | 第58-60页 |
第5章 实验结果 | 第60-66页 |
5.1 测试对面向对象特性的支持效果 | 第60-62页 |
5.2 测试对动态内存分配的支持效果 | 第62-63页 |
5.3 测试对异常处理特性的支持效果 | 第63-64页 |
5.4 实验结果 | 第64页 |
5.5 对结果的分析 | 第64-66页 |
第6章 总结与展望 | 第66-70页 |
6.1 本文工作总结 | 第66-67页 |
6.2 创新之处 | 第67页 |
6.3 工作展望 | 第67-68页 |
6.4 工作的扩展可能 | 第68-70页 |
6.4.1 Native语言 | 第68页 |
6.4.2 类似Java的语言 | 第68-70页 |
参考文献 | 第70-72页 |
附录A 对C++面向对象编程代码的分析示例 | 第72-76页 |
致谢 | 第76页 |