C程序内存安全错误的运行时检测技术研究与实现
| 摘要 | 第4-5页 |
| abstract | 第5页 |
| 注释表 | 第11-12页 |
| 第一章 绪论 | 第12-15页 |
| 1.1 课题研究背景和意义 | 第12-13页 |
| 1.2 课题研究现状和选题依据 | 第13-14页 |
| 1.3 论文研究内容 | 第14-15页 |
| 第二章 相关知识 | 第15-26页 |
| 2.1 内存安全错误的分类 | 第15-17页 |
| 2.2 内存安全错误的动态检测技术 | 第17-22页 |
| 2.2.1 基于对象技术 | 第17-18页 |
| 2.2.2 值验证技术 | 第18-20页 |
| 2.2.3 影子内存技术 | 第20-21页 |
| 2.2.4 扩展指针技术 | 第21页 |
| 2.2.5 基于指针技术 | 第21-22页 |
| 2.3 LLVM/Clang编译器介绍 | 第22-25页 |
| 2.3.1 LLVM编译框架 | 第22-23页 |
| 2.3.2 Clang前端和抽象语法树 | 第23-25页 |
| 2.4 本章总结 | 第25-26页 |
| 第三章 内存安全错误的检测机制 | 第26-38页 |
| 3.1 指针元数据 | 第26页 |
| 3.2 对象创建和初始化 | 第26-28页 |
| 3.2.1 指针变量的创建和初始化 | 第27页 |
| 3.2.2 结构体变量的创建和初始化 | 第27-28页 |
| 3.3 对象赋值 | 第28-30页 |
| 3.3.1 指针对象赋值 | 第29-30页 |
| 3.3.2 结构体对象赋值 | 第30页 |
| 3.4 函数调用 | 第30-34页 |
| 3.4.1 函数元数据 | 第31页 |
| 3.4.2 定参函数 | 第31-33页 |
| 3.4.3 变参函数 | 第33-34页 |
| 3.5 对象释放 | 第34-35页 |
| 3.5.1 栈对象释放 | 第34页 |
| 3.5.2 堆对象释放 | 第34-35页 |
| 3.6 检测指针安全性 | 第35-37页 |
| 3.6.1 数组下标 | 第35页 |
| 3.6.2 指针解引用 | 第35-36页 |
| 3.6.3 结构体成员访问 | 第36-37页 |
| 3.7 本章总结 | 第37-38页 |
| 第四章 内存安全错误检测工具的实现 | 第38-64页 |
| 4.1 数据结构设计 | 第38-40页 |
| 4.2 对象创建和初始化插桩实现 | 第40-45页 |
| 4.2.1 指针变量创建和初始化 | 第40-43页 |
| 4.2.2 结构体变量的创建和初始化 | 第43-45页 |
| 4.3 对象赋值插桩实现 | 第45-47页 |
| 4.3.1 指针变量赋值 | 第45-46页 |
| 4.3.2 结构体变量赋值 | 第46-47页 |
| 4.4 函数调用插桩实现 | 第47-55页 |
| 4.4.1 定参函数 | 第48-55页 |
| 4.4.2 变参函数 | 第55页 |
| 4.5 对象释放插桩实现 | 第55-58页 |
| 4.5.1 栈对象释放 | 第55-57页 |
| 4.5.2 堆对象释放 | 第57-58页 |
| 4.6 指针安全性检测插桩实现 | 第58-63页 |
| 4.6.1 数组下标访问插桩 | 第58-60页 |
| 4.6.2 指针解引用插桩 | 第60-62页 |
| 4.6.3 结构体成员访问插桩 | 第62-63页 |
| 4.7 本章总结 | 第63-64页 |
| 第五章 实验对比与案例分析 | 第64-71页 |
| 5.1 有效性实验与对比 | 第64-66页 |
| 5.2 运行时性能对比 | 第66-68页 |
| 5.3 μC/OS-Ⅱ案例分析 | 第68-70页 |
| 5.4 本章总结 | 第70-71页 |
| 第六章 总结与展望 | 第71-73页 |
| 6.1 论文总结 | 第71-72页 |
| 6.2 工作展望 | 第72-73页 |
| 参考文献 | 第73-78页 |
| 致谢 | 第78-79页 |
| 在学期间的研究成果及发表的学术论文 | 第79页 |