Вчера я задал вопрос о stackoverflow, но я не описал его четко, поэтому я изменяю способ спросить, может быть, проблема становится понятной. Во-первых, я изменяю пример get_sign.c, который предоставляет klee, я включаю 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
Что я могу сделать для решения этой проблемы? Спасибо!
Похоже, klee использует сигналы, которые могут сделать возвращение sleep
раньше, чем ожидалось, как указано в http://www.delorie.com/gnu/docs/glibc/libc_445.html , Эта ссылка также дает способы обойти ограничение.