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