0

昨日、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 をコンパイルし、次に objectfileklee 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

この問題を解決するにはどうすればよいですか? ありがとう!

4

1 に答える 1

0

http://www.delorie.com/gnu/docs/glibc/libc_445.htmlsleepに示されているように、クレーは予想よりも早く復帰できるシグナルを使用しているようです。. このリファレンスには、制限を回避する方法も記載されています。

于 2014-03-07T03:29:31.340 に答える