KLEE for C ++代码使用pthreads

时间:2013-01-07 16:56:37

标签: llvm klee

我是初学者,试图使用KLEE。 我正在使用KLEE自包含的C ++程序 使用pthreads。 我已经生成了一个.o文件并使用了KLEE以及以下选项

klee --libc=uclibc --posix-runtime test.o

但我看到我收到警告

KLEE: NOTE: Using model:
/home/pgbovine/klee/Release+Asserts/lib/libkleeRuntimePOSIX.bca

KLEE: output directory = "klee-out-4"
KLEE: WARNING: undefined reference to function: klee_get_valuel
KLEE: WARNING: undefined reference to function: pthread_create
KLEE: WARNING: undefined reference to function: pthread_exit
KLEE: WARNING: undefined reference to function: pthread_join
KLEE: WARNING: executable has module level assembly (ignoring)
KLEE: WARNING: calling external: syscall(54, 0, 21505, 571522624)
KLEE: WARNING: calling __user_main with extra arguments.
KLEE: WARNING: calling external: pthread_create(571589384, 0, 563903904, 571574176)
0  klee 0x08965ab8
[pid  1846] +++ killed by SIGSEGV +++

+++ killed by SIGSEGV +++
Segmentation fault

在.bc文件上使用klee也会给我相同的结果。

我不确定为什么我得到未定义的pthread函数引用。我是 不确定是否正确使用了pthreads的库。是 有办法确保这个吗?使用llvm-ld也无济于事。

下面是我使用的llvm-ld命令

 llvm-ld tests.bc -l=/usr/lib/libpthread.a

我不确定为什么会出现Segmentation fault。该计划有效 当我正常使用g++编译程序并运行时,我很好 可执行文件。

有人能告诉我哪里出错了吗?

3 个答案:

答案 0 :(得分:3)

问题是Klee中没有现有的pthread支持。因此,当您致电pthread_create()时,Klee将不会回复它(这就是您看到KLEE: WARNING: calling external: pthread_create的原因)。在这种情况下,Klee将因此失败而崩溃。

答案 1 :(得分:1)

如果要在KLEE中使用pthread函数,可以修改KLEE源代码以模拟多线程的执行。
在KLEE中,有一个数据结构" ExecutionState",当你在用户代码中创建一个线程时,你可以相应地在KLEE中创建一个ExecutionState,并设置" pc"线程函数的ExecutionState。因此,您可以在KLEE中覆盖pthread函数,并在" executeInstruction"中拦截用户代码调用pthread函数。 executor.cpp中的函数。
要模拟多线程的执行,您应该修改KLEE的搜索器,该搜索器用于从所有ExecutionState向量中选择要执行的状态。
所以这是一项艰苦的工作。

答案 2 :(得分:0)

截至2010年,KLEE的基本版本不支持任何形式的并行,包括pthread。但Raimondas Sasnauskas(rwth-aachen)从EPFL获得有关dslab项目的信息:

https://mailman.cs.umd.edu/pipermail/otter-dev/2010-December/000435.html

  
    

KLEE的当前版本不支持任何类型的     并行性 - 您必须自己实现/建模。     尽管如此,EPFL的人已经实施了pthread
    支持作为KLEE的延伸并发表了一篇关于
的好文章     这个主题:

         

http://dslab.epfl.ch/pubs/esd

  

存档链接:http://web.archive.org/web/20100516044002/http://dslab.epfl.ch/pubs/esd “执行综合:自动软件调试技术”,Cristian Zamfir和George Candea。 PROC。第五届ACM SIGOPS / EuroSys计算机系统欧洲会议(EuroSys),法国巴黎,2010年4月

2013年,Cristian Cadar发布了另一篇帖子http://mailman.ic.ac.uk/pipermail/klee-dev/2013-January/000031.html,指出KLEE不支持pthreads,并且KLEE的Cloud9扩展可以处理pthreads:

  

目前,KLEE对C ++的支持有限,并且不支持   并行线程。但是,KLEE有一些扩展可以处理   这些方面,例如,KLOVER for C ++和Cloud9 for pthreads。拿一个   请查看http://klee.llvm.org/Publications.html以获取更多信息。