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