当klee执行Objectfile时,为什么函数sleep()不能工作?

时间:2014-03-07 02:03:19

标签: c++ c uclibc klee

昨天我问了关于stackoverflow的问题,但是我没有清楚地描述它,所以我改变了问题的方式,也许让问题清楚。 首先,我修改klee提供的示例get_sign.c,我在程序中包含unistd.h,并调用函数sleep()以使线程暂停,如下所示

/*
 * First KLEE tutorial: testing a small function
 */
#include <unistd.h>

int get_sign(int x) {
  if (x == 0)
     return 0;

  if (x < 0)
     return -1;
  else 
     return 1;
} 

int main() {
  int a;
  klee_make_symbolic(&a, sizeof(a), "a");
  sleep(10);
  return get_sign(a);
} 

我使用“llvm-gcc”编译get_sign.c,然后使用klee get_sign.o执行目标文件,线程不暂停,意味着sleep()不起作用。 所以当我执行get_sign.o时添加一个参数,就像这个klee --libc=uclibc get_sign.o一样,不幸的是,线程仍然没有挂起,而且,klee报告错误,

KLEE: ERROR: /home/lab/work/klee-uclibc/libc/signal/sigaction.c:58: failed external call: __syscall_rt_sigaction

KLEE: NOTE: now ignoring this error at this location

我该怎么做才能解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

http://www.delorie.com/gnu/docs/glibc/libc_445.html 所示,看起来klee使用可使sleep早于预期返回的信号。该参考文献还提供了绕过限制的方法。