尽管在ARC中,野指针出现的频率已经大大降低了,但是仍然会有野指针困扰着我们。
在模拟器调试中,我们可以开启scribble或者zombieObject来将已经释放的内存填充无意义的内容,能够将一些非必现的野指针变成必现。但是,这只能在模拟器中,但是给测试的包并不能这么做。测试是非常需要这个功能的。
为了给测试支持上这个功能,那么我们不得不自己来实现这个功能。
我首先介绍下我用到的库,来自于Facebook的fishhook
下载地址https://github.com/facebook/fishhook
这是一个c语言的用来实现钩子的函数库,当然你可以选择其他的库。
我所要做的,就是在调用c语言的free函数时,将内存空间破坏掉,也就是用钩子插了一段破坏代码,来实现scribble的功能。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import "fishhook.h"
#include <malloc/malloc.h>
static void (*orig_free)(void* t);
void scribble_free(void* ptr){
size_t memSizie = malloc_size(ptr);
memset(ptr, 0x00, memSizie);
orig_free(ptr);
return;
}
int main(int argc, char * argv[]) {
@autoreleasepool {
#if DEBUG
rebind_symbols((struct rebinding[1]){{"free", scribble_free, (void *)&orig_free}}, 1);
#endif
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));;
}
}
我就直接上代码了,就是在main函数执行时,hook系统的free函数。
malloc_size获取被free的指针的指向的区域的大小。
memset是将ptr指向的内存的前memSizie设置成0x00,也就是全部置0,这样这块区域,再访问的话,那么一定会crash。