[klee-dev] Transform cvc or pc queries into linear equation

Daniel Liew daniel.liew at imperial.ac.uk
Thu Apr 11 14:24:05 BST 2013


Perhaps you could do this. When running klee use the --write-pcs
option (there are similar options for SMT-LIBv2 as well) which will
write the constraints of a completely explored path for each test case
into the folder klee-last/

For example:
$ cat simple.c
int main()
{
  int a;
  klee_make_symbolic(&a,sizeof(a),"a");

  if(a > 10)
  {
     return 0;
  }
  else
  {
    return 1;
  }
}

$ llvm-gcc -emit-llvm -c simple.c
$ klee --write-pcs simple.o
...
$ cat klee-last/test000001.pc
array a[4] : w32 -> w8 = symbolic
(query [(Slt 10
             (ReadLSB w32 0 a))]
       false)

In the KQuery language the constraints are inside the square brackets.
Personally I don't like the KQuery language that much because it
queries for validity because I think querying for satisfiability is
easier to understand. The SMT-LIBv2 language works in terms of
satisfiability so you could use --write-smt2s instead. You would get
this instead for the example I have given.

(set-logic QF_AUFBV )
(declare-fun a () (Array (_ BitVec 32) (_ BitVec 8) ) )
(assert (and (bvslt  (_ bv10 32) (concat  (select  a (_ bv3 32) )
(concat  (select  a (_ bv2 32) ) (concat  (select  a (_ bv1 32) )
(select  a (_ bv0 32) ) ) ) ) ) true ) )
(check-sat)
(exit)

Each (assert ...) statement is a constraint for the path explored.
That long concatenation expression is required because a is an array
of bytes so 4 elements need to be concatenated to make up an integer
on the architecture I'm using.

I think these are the constraints you are after. You probably need to
write some sort of parser that converts the constraints into a format
you can work with. You could use the kQuery parser in KLEE as a
starting point and write your own printer that takes the built Expr
tree and prints it out as you wish. However I think it would be better
for you to work with SMT-LIBv2 files though as more work has been done
with this format (for example there is a parser for it at
https://es.fbk.eu/people/griggio/misc/smtlib2parser.html ). You can
find more SMT-LIBv2 tools at http://www.smtlib.org/

Hope that help,

Regards,
Dan Liew.

On 11 April 2013 11:11, varza victor <victor.varza at gmail.com> wrote:
> Hi Liew,
>
> Thank you for answering me. I want to use it for a 'hybrid fuzzer'. In this
> way I use KLEE to find all paths from a given application. After this I use
> PPL (Parma Polyedra Library) to generate random input for the input space
> described by the constraints generated by KLEE. I saw that KLEEcan olny
> output the query for a constraint solver, not the constaints, so I'm looking
> for a slution to resolve my issue. I think that I have to implement a small
> application for this.
>
> Regards,
> Victor Varza
>
>
> 2013/4/11 Daniel Liew <daniel.liew at imperial.ac.uk>
>>
>> Hi Varza,
>>
>> I'm not aware of KLEE having this capability. Out of curiosity what do
>> you want to use it for?
>>
>> This may not be useful to you but you can however convert .pc files
>> (kQuery language) into SMT-LIBv2 files. SMT-LIBv2 files are a more
>> "standard" format for SMT solvers which you might find more useful.
>>
>> To do this run
>>
>> $ kleaver --print-smtlib your-query.pc
>>
>> The options
>> --smtlib-display-constants=
>> --smtlib-human-readable
>> --smtlib-use-let-expressions
>>
>> may be useful to you when converting.
>>
>> It is worth noting that the SMT logic used is the QF_ABV (Quantifier
>> free arrays of bitvectors) so every symbolic variable is actually
>> represented by an array of bitvectors. Constants are also represented
>> as bitvectors. Consequently you will not see syntax like "x <= 10"
>> anywhere. The SMT-LIBv2 syntax would be something like...
>>
>> (set-logic QF_ABV )
>>
>> #Declare a function x that takes no arguments and is of type (Array (_
>> BitVec 32) (_ BitVec 8) ) , the index is 32-bit and indexes bytes
>> #This is the symbolic variable
>> (declare-fun x () (Array (_ BitVec 32) (_ BitVec 8) ) )
>>
>> # check first byte in x is less than or equal to 10 (as 8-byte
>> unsigned integer) where both bitvectors are assumed to be unsigned
>> integers.
>> assert( (bvule (select x (_ bv0 32)) (_ bv10 8) ) )
>> (check-sat)
>>
>> If you find the syntax confusing take a look the  The SMT-LIB v2
>> Language and Tools tutorial on http://www.smtlib.org/
>> Regards,
>> Dan Liew.
>>
>> On 10 April 2013 21:13, varza victor <victor.varza at gmail.com> wrote:
>> > Hi,
>> >
>> > I'm new in KLEE and I have some cvc and pc queries generated by klee and
>> > I
>> > want to transform it into linear equations such as x <= 10; x >= 2. Can
>> > I do
>> > this using klee?
>> >
>> > Best regards,
>> > Victor
>
>




More information about the klee-dev mailing list