← All posts tagged klee

Вот такой-то байды я точно не ждал. Я даже не представляю как это дебажить теперь.
$php 1.php
ab

<html></html>

$php -dextension=klee.so -dklee.enable=1 1.php
KLEE: output directory = "klee-out-5"
KLEE: WARNING: undefined reference to variable: _CurrentRuneLocale
KLEE: WARNING: undefined reference to function: __assert
KLEE: WARNING: undefined reference to function: __error
KLEE: WARNING: undefined reference to function: __isfinite
KLEE: WARNING: undefined reference to variable: __mb_sb_limit
KLEE: WARNING: undefined reference to variable: __stderrp
KLEE: WARNING: undefined reference to function: fclose
KLEE: WARNING: undefined reference to function: fprintf
KLEE: WARNING: undefined reference to function: getenv
KLEE: WARNING: undefined reference to function: mmap
KLEE: WARNING: undefined reference to function: munmap
KLEE: WARNING: undefined reference to function: printf
KLEE: WARNING: undefined reference to function: siglongjmp
KLEE: WARNING: undefined reference to function: sigsetjmp
KLEE: WARNING: undefined reference to function: sprintf
KLEE: WARNING: undefined reference to function: strcasecmp
KLEE: WARNING: calling external: getenv(34590422144)
KLEE: WARNING: calling external: printf(34720010656)
bb

KLEE: WARNING: unable to write output test case, losing it
<html></html>
KLEE: done: total instructions = 43589
KLEE: done: completed paths = 1
KLEE: done: generated tests = 1

Мне тут пришла интересная идея в голову. С помощью KLEE можно найти все множество путей выполнения в программе и для каждого пути схоронить ограничения на переменные.
После этого можно подставить конкретизировать эти наборы и захардкодить их в байткод. А потом слинковать нативный бинарник.
Т.е. мы получим набор бинарников одной программы, представляющий собой набор self-contained тестов для всех вариантов выполнения. Эти бинарники можно гонять в профилировщиках и смотреть как изменяется производительность.

// In newer versions of STP, a memory management mechanism has been
// introduced that automatically invalidates certain C interface
// pointers at vc_Destroy time.

FUUUUUUUUU~, я дебажил это два часа, пока не прочитал коммент.

Мне внезапнейшим образом пришла потрясающая идея в голову.
Написать плагин к KDevelop 4, который бы интегрировал в ИДЕ гуек для KLEE. Основной функционал гуйка — запускать KLEE на каждой отдельной функции, указывая ручками символьные переменные и ограничения. После этого жать кнопку и получать профит.
Эту красоту можно обмазать еще кучей всяких удобных фич и это будет просто омегавин. Блин, надо было это темой курсача брать, я бы тогда реально что-нибудь накодил.