Allocate/Free Pair validation

May072010
0 评论

前面学习webkit曾经提过alloc/free校验的问题,当时跳过了,今日看云风大牛的文章<给你的模块设防>,重新想了一下,这种技术,结合gdb简单分析就很明白了,我个人看到的主要是假设有type* ptr,那么ptr+1,取决于type的类型。比如:

struct cookie {

size_t sz;

int tag;

};

那么struct cookie* ptr,ptr+1的地址是&ptr+16,因为sizeof(struct cookie)==16。下面是code和gdb跟踪结果:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <assert.h>

 

#define DOGTAG_VALID 0xbadf00d

#define DOGTAG_FREE 0x900dca7e

#define DOGTAG_TAIL 0xd097a90

 

struct cookie {

size_t sz;

int tag;

};

 

void *

my_malloc(size_t sz)

{

if (sz == 0)

sz = 1;

struct cookie * c = malloc(sizeof(struct cookie)

+ sz + sizeof(int));

assert(c != NULL);

c->sz = sz;

c->tag = DOGTAG_VALID;

int * tail = (int *)((char *)(c+1) + sz);

*tail = DOGTAG_TAIL;

 

memset(c+1, 0xCC, sz);

 

return c+1;

}

 

void

my_free(void *p)

{

if (p==NULL)

return;

struct cookie * c = p;

--c;

assert(c->tag != DOGTAG_FREE);

assert(c->tag == DOGTAG_VALID);

int *tail = (int *)((char *)p + c->sz);

assert(*tail == DOGTAG_TAIL);

c->tag = DOGTAG_FREE;

memset(p, 0xCC , c->sz);

free(c);

}

 

int main() {

int* PtrInt = (int*)my_malloc(10);

*PtrInt = 10;

*(PtrInt+1) = 20;

my_free(PtrInt);

return0;

}

 

//Starting program: /Users/zhilihu/code/memoryManage/customMallocFree

//

//Breakpoint 1, main () at customMallocFree.c:50

//50 int* PtrInt = (int*)my_malloc(10);

//(gdb) n

//

//Breakpoint 2, my_malloc (sz=10) at customMallocFree.c:21

//21 + sz + sizeof(int));

//(gdb) n

//22 assert(c != NULL);

//(gdb) n

//23 c->sz = sz;

//(gdb) p c

//$3 = (struct cookie *) 0x100300080

//(gdb) p c+1

//$4 = (struct cookie *) 0x100300090

//(gdb) p (char*)(c+1)

//$5 = 0x100300090 ""

//(gdb) p sz

//$6 = 10

//(gdb) p (c+2)

//$7 = (struct cookie *) 0x1003000a0

//(gdb) p sizeof(struct cookie)

//$8 = 16

//



 

 

 

Scala Trais

May022010
0 评论

怎么scala的trais和java的interface这么像呢?不过scala的也有奇特的地方,它可以在trait里面进行实现,还有进行堆栈式的接口修改。scala的trait对比class来说有

  • 1.不可以有类型参数
  • 2.class中super是静态绑定的,而在trait中是动态绑定的。
    scala的trait也比较有趣,比如定义一个抽象类
    abstract class IntQueue {
    def get():Int
    def put(x:Int)
    }
    我们可以在trait中覆盖并且调用父类的put方法,而这在普通class中是不行的。
    trait Doubing extends IntQueue {
    abstract override def put(x:Int) {super.put(2*x)}
    }
    嗯,当然如果一个trait是继承某个类的,那么只有同是继承了这个类的class可以使用这个trait.

  • 集中精神

    May012010
    0 评论

    刚才集中精神commit那些自学scala的例子的时候很有去年在软件公司实习的时候的感觉,轻快而高效,水到渠成,卧槽。其实scala很灵活,果然是支持多种编程范式的语言,可扩展性十分强。现在人们写代码提倡测试优先,所以也给对照书本写的简单例子找了一个scala的测试工具Specs,其实这个还没有完全弄清楚其内涵特性的,但是既然想快点完成测试以便帮助自己了解scala这门语言的特征,也就快快的下载了lib,然后和sbt组合下来,万幸,果然好使。在短时间了解scala测试framework期间,找到了github的一个twiiter公司出的json scala库,待把那本入门的书看完后,必定要去checkout看看:)