软件调试笔记36 - 栈和函数调用: 变量检查和Cookie
变量检查原理:
1. 在分配局部变量时编译器会为每个局部变量多分配8个字节的额外空间(前后各4个),用作屏障字段,在填充局部变量区域时,这些屏障字段以及变量尾部的因为内存对齐而分配的补足字节都会被INT3的机器码0xCC所填充。这些0XCC字节称为栅栏字节。
2. 为了在运行期仍能够准确知道每个变量的长度,位置和名称,编译器会产生一个变量描述表,用来记录局部变量的详细信息。
3. 在函数返回前,调用_RTC_CheckStackVars函数,根据变量描述表逐一检查其中包含的每个变量,如果发现变量前后的栅栏字节发生变化则报告检查失败。
基于Cookie的安全检查:
变量检查开销比较大,所以一般只用于调试版本。
报告安全检查失败:
编写安全的代码: