首先,我扩展了klee以支持多个线程,并在klee中实现了pthread.h的一些函数。
现在,我使用llvm-gcc编译c源文件test.c,生成Objectfile test.o,然后使用klee test.o
执行.o文件。函数printf
可以在屏幕上打印字符串,但函数sleep()
不起作用,程序执行速度非常快,不会暂停。 klee网站说我可以使用uclibc链接c lib,但是当我添加参数--libc=uclibc
时,就像klee --libc=uclibc test.o
一样,结果是错误和奇怪的,就像klee没有执行测试一样。 o,而是执行klee本身!如何使函数sleep()工作?
C源是遵循
#define OS_GLOBALS
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
//#include "record_monitor.h"
int num;
int global;
void * fun1(void *arg)
{
printf("1fun1 num = %d\n",num);
printf("fun1 gol = %d\n",global);
num = 8;
printf("2fun1 num = %d\n",num);
sleep(10);
printf("over fun1\n");
return 0;
}
void *fun2(void *arg)
{
printf("1fun2 num =%d\n",num);
global++;
num = 5;
printf("2fun2 glo = %d\n",global);
sleep(6);
printf("over fun2\n");
return 0;
}
int main()
{
pthread_t npid1,npid2;
num = 1;
pthread_create(&npid1,NULL,fun1,NULL);
pthread_create(&npid2,NULL,fun2,NULL);
sleep(5);
printf("1main num = %d\n",num);
global = 7;
num++;
printf("2main num = %d\n",num);
pthread_join(npid1,NULL);
pthread_join(npid2,NULL);
return 0;
}