2015-11-14 16 views
1

Недавно я играл с KLEE. Я выполнил документ «Building KLEE (LLVM 3.4)» и успешно выполнил все примеры в учебнике.KLEE: Неожиданная ошибка о встроенной сборке

Однако при выполнении моей собственной программы с помощью Клея:

$ klee -load=/usr/lib/x86_64-linux-gnu/libssl.so --libc=uclibc --posix-runtime -emit-all-errors -allow-external-sym-calls klee_client.bc 

произошли некоторые ошибки. (См. Следующий вывод консоли)

KLEE: NOTE: Using klee-uclibc : /home/testuser/Downloads/klee/Release+Asserts/lib/klee-uclibc.bca 
KLEE: NOTE: Using model: /home/testuser/Downloads/klee/Release+Asserts/lib/libkleeRuntimePOSIX.bca 
KLEE: output directory is "/home/testuser/Downloads/klee_test/klee-out-3" 
KLEE: WARNING ONCE: function "__libc_connect" has inline asm 
KLEE: WARNING ONCE: function "setsockopt" has inline asm 
KLEE: WARNING ONCE: function "shutdown" has inline asm 
KLEE: WARNING ONCE: function "socket" has inline asm 
KLEE: WARNING ONCE: function "__libc_recvfrom" has inline asm 
KLEE: WARNING ONCE: function "__libc_sendto" has inline asm 
KLEE: WARNING: undefined reference to function: ERR_clear_error 
KLEE: WARNING: undefined reference to function: ERR_error_string 
KLEE: WARNING: undefined reference to function: ERR_get_error 
KLEE: WARNING: undefined reference to function: OPENSSL_config 
KLEE: WARNING: undefined reference to function: SSL_CTX_ctrl 
KLEE: WARNING: undefined reference to function: SSL_CTX_free 
KLEE: WARNING: undefined reference to function: SSL_CTX_new 
KLEE: WARNING: undefined reference to function: SSL_CTX_set_next_proto_select_cb 
KLEE: WARNING: undefined reference to function: SSL_connect 
KLEE: WARNING: undefined reference to function: SSL_free 
KLEE: WARNING: undefined reference to function: SSL_get_error 
KLEE: WARNING: undefined reference to function: SSL_library_init 
KLEE: WARNING: undefined reference to function: SSL_load_error_strings 
KLEE: WARNING: undefined reference to function: SSL_new 
KLEE: WARNING: undefined reference to function: SSL_read 
KLEE: WARNING: undefined reference to function: SSL_set_fd 
KLEE: WARNING: undefined reference to function: SSL_shutdown 
KLEE: WARNING: undefined reference to function: SSL_write 
KLEE: WARNING: undefined reference to function: SSLv23_client_method 
KLEE: WARNING: undefined reference to function: klee_posix_prefer_cex 
... 
KLEE: WARNING ONCE: calling external: syscall(16, 0, 21505, 40876048) 
KLEE: WARNING ONCE: calling __user_main with extra arguments. 
KLEE: WARNING ONCE: __syscall_rt_sigaction: silently ignoring 
KLEE: WARNING ONCE: calling external: OPENSSL_config(0) 
KLEE: WARNING ONCE: calling external: SSL_load_error_strings() 
KLEE: WARNING ONCE: calling external: SSL_library_init() 
KLEE: WARNING ONCE: calling external: printf(35435072, 46338336) 
KLEE: ERROR: /home/testuser/Downloads/klee-uclibc/libc/inet/socketcalls.c:362: inline assembly is unsupported 

KLEE: done: total instructions = 99493 
KLEE: done: completed paths = 1 
KLEE: done: generated tests = 1 

Мне было любопытно, почему произошла ошибка, связанная с uclibc? Потому что я скомпилировал его как то, что сказал документ KLEE, и я не нашел никаких вариантов отключения кода ассемблера (например, no-asm), когда «configure» uclibc перед компиляцией.

Кроме того, я также заметил, что было много предупреждений о «неопределенной ссылке на функцию: ...». Должен ли я компилировать соответствующие библиотеки в битовый код llvm вместо использования существующих общих объектов?

Спасибо!

ответ

1

Для Q1: В основном документ KLEE обучает пользователей компиляции uClibc в архив LLVM IR. Многие функции внутри uClibc содержат встроенную сборку (или даже непосредственно разработаны с сборкой). Эти сборки не будут скомпилированы в LLVM IR, вместо этого они будут сохранены в IR без изменений. Перед выполнением IR функции из ucLibc KLEE проверяет, включена ли какая-либо сборка в IR. Если это так, вы увидите предупреждение как «функция XXX имеет встроенный asm». Нет возможности отключить сборку. Чтобы избавиться от этих сборок, вы должны найти способ перевести их в LLVM IR.

Для Q2: вам необходимо отделить процесс KLEE и тестируемую программу (например, klee_client.bc в вашем случае). Когда вы загружаете существующие общие объекты в KLEE, вы фактически связываете библиотеку с процессом KLEE, а не с тестируемой программой. Чтобы связать тестируемую программу с библиотекой, вам необходимо скомпилировать библиотеку в IR, а затем связать ее с тестируемой программой, изменив основную функцию в KLEE (или используя некоторые параметры, созданные в KLEE, о что я не ясно). Когда загружаемая программа загружается и связана с указанными библиотеками KLEE, KLEE проверяет наличие каждой требуемой функции (вызываемой некоторыми инструкциями). Если нет, вы увидите предупреждение. В вашем случае вы в основном не связывали тестируемую программу с LLVM IR LibSSL.

+0

Спасибо! Да ты прав. Я понял причины и решил вторую проблему. Кроме того, если я хочу протестировать программу с сетевой связью, KLEE все еще работает для такого рода программ? – h1994st

+0

В KLEE нет встроенной поддержки сети. В принципе, вы должны создать символическую сетевую модель для KLEE, так же как встроенную файловую систему. Предложение: вы можете обратиться к другому проекту SE CLOU9 для сетевой модели (http://cloud9.epfl.ch/). – Junxzm

+0

Большое спасибо! Я возьму добычу в этом проекте. – h1994st