我是初学者,试图使用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++
编译程序并运行时,我很好
可执行文件。
有人能告诉我哪里出错了吗?
答案 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://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以获取更多信息。