单元测试的遇到的问题以及收获

001:导入表:

在XP的user32.dll里边,加载的时候会加载3个导入表,顺序是GDI32.DLLKENNEL32.DLL,NTDLL.DLL,里边包含的函数数量为:118,119,73

Win7 64位下包含的是4个导入表,顺序是NTDLL.DLL,GDI32.DLL,KERNEL32.DLL,ADVAPI32.DLL,里边包含的函数数量为:91,117,125,1

Win7 32位下包含的是3个导入表,顺序是NTDLL.DLL,GDI32.DLL,KERNEL32.DLL,里边包含的函数数量为:88,117,125

Win8下格局比较不解,跟之前的版本完全不一样了,有很多的api-ms-win,很奇怪

002:

int nFlg = 0;
int n = *(int*)nFlg;
prinf("n = %d\n",n);

看出来了吗?这个肯定会崩溃,继续写一个:

int nFlg = 0;
int n = *(int*)(nFlg+0xffff);
prinf("n = %d\n",n);

这个依然崩溃,再写一个:

int nFlg = 0;
int n = *(int*)(nFlg+0x10000);
prinf("n = %d\n",n);

这个就可以通过,还是那个知识点,0x0000 0000~0x0000 ffff属于内存保护非法访问区,也有人说是空指针赋值分区,这个区域的数值是不允许获取,一点资料:

1)空指针赋值分区

范围:0x0000 0000~0x0000 FFFF

为了帮助程序员捕获对空指针的赋值。

分配内存时,如果由于某种原因分配不成功,则返回空指针0x0000 0000。当用户继续使用比如改写数据时,系统将因为发生访问违规而退出。

2)用户模式分区

范围:0x0001 0000~0x7FFE FFFF

进程只能读取或访问这个范围的虚拟地址,超越这个范围的行为都会产生违规退出。

所有.exe和动态链接库(DLL文件)都载入到这一区域,进程的大部分数据也都保存在这一分区。每个进程该分区空间是独享的。

3)64KB禁入分区

范围:0x7FFF 0000~0x7FFF FFFF

没有了解

4)共享内核分区

范围:0x8000 0000~0xFFFF FFFF

这个空间是供操作系统内核代码、设备驱动程序代码、设备I/O高速缓存、非分页缓冲池分配表、进程页面表等。这段地址各进程是共享的,但进程不能读取或者访问这一分区。    

转自: http://blog.csdn.net/anye3000/article/details/6674176

003:一点经验总结:当遇到使用 try {}结构都不能try住的话,有可能是想访问0x 0000 ffff以及一下地址的内容,出现这种情况有可能是类析构重复导致地址已经为空,有可能是将0xffff一下数值作为地址使用,总之是这类,仔细看一下。

004:扯了那么多,还没说关于单元测试本身的东西呢,具体的:

玩转Google开源C++单元测试框架Google Test系列(gtest)(总)

 
  
 
  
 
  
 
  
 
 

你可能感兴趣的:(计算机知识库,C/C++)