KLEE-之函数调用
关于函数的调用在klee使用中的体现
klee -libc=uclibc -posix-runtime *.bc
在executeInstrucion()中
通过判断instruction的类型,区分了call,和invoke
然后通过判断是不是直接的函数调用(是否为函数指针??)
如果是直接的函数调用,则调用函数executeCall(),如果是非直接,则做进一步处理,待考证
executeCall()
{
if(f->isDeclaration())//////////如果函数仅仅有函数头, 即函数是外部函数,则调用
callExternFunction();
{
在这里面判断是否为定义的特殊函数例如klee_make_symbolic是,间接调用相应的函数
否,则使用系统调用相应的函数
}
else
{
函数的定义包含在module中,注意,这里的定义包含其实分为两种情况
1.函数为自己定义的函数,这样刚开始的时候函数即在里面
2.函数是外部函数,例如puts之类,但是因为我们使用klee的时候,加上了参数uclibc,和runPosixTime,所以在原module和
库函数链接 的时候,就把定义链接了进去(经过实验,不知道为嘛printf没有被链接进去???)
注意klee::main.cpp中链接的顺序,先是链接uclibc,将fopen之类的函数展开,在这里是展开为open
然后链接PosixRuntime库,在runTime/Fd_32.c中有open的定义,调用了
fd.c中的__fd_open函数,在这里面就判断了文件名参数path是否为symbolic
是,则使用klee定义的symbolic 模块
否,则调用真正的系统调用
}
}
这样大概解释了pthread_create的调用过程
因为uclibc中的libc库没有pthread_create的定义,而且specialHanlder也没有,就直接进入了symtem调用最直接的 pthread_create