- 22
- 0
- 约5.8万字
- 约 49页
- 2017-08-26 发布于湖北
- 举报
第五章Memory Corruption
第一部分:堆栈
有两个原因导致内存破坏成为最棘手的程序出错类型之一。首先,破坏的源头和现象可能相隔很远,很难将原因和结果关联起来。其次是由于只有在比较罕见的条件下症状才显露出来,使得要一致的重现错误比较困难。
原则上只要满足以下两个条件中的任意一个,就会发生内存破坏。
线程对一块不属于它的内存进行写操作。
线程对属于它自己的内存进行写操作时,破坏了该内存的状态。
这里有个小程序可以作为展示第一个条件的例子。
#include windows.h
#define BAD_ADDRESS 0xBAADF00D
int __cdecl wmain (int argc, wchar_t* pArgs[])
{
char* p =(char*)BAD_ADDRESS;
*p = ’A’;
return 0;
}
上面的小程序先声明了一个char型指针,然后对其初始化,赋给其一个不可访问的地址(0xBAADF00D)。运行该程序的最终结果就是程序崩溃,紧接着弹出可怕的Dr.Watson(译注)。很明显这是因为这个小程序中执行了一次无效的内存访问导致,但是在很复杂的系统中要指出错误很麻烦。例如应用程序分配了一块内存,并且计划了其生命周期。如果过早的释放了它,失效的指针访问就会导致内存破坏。应用程序对不属于自己的内存进行写访问会
原创力文档

文档评论(0)