On 13/11/2013 09:40, Hongxu Chen wrote:
Thanks, Paul. I think I really missed it.
In klee-multisolver-cav-13 paper, it mentions that some strategies to
avoid non-determinisms:
1. use DFS search strategy
2. turned off address-space layout randomisation
3. implement a deterministic memory allocator
For the 2nd item, is there some command line option for it or I have to
change the source code?
This has nothing to do with KLEE, just google for something like "turn
off address-space layout randomization"
Also, I'm lost on why "concrete memory addresses" matters; is it because
of the memory error check?
(Sorry I didn't read the source code of KLEE carefully)
One reason is the way KLEE does object resolution (you need to take a
look at the code for details), but there are other implementation-level
issues.
KLEE could certainly be made more deterministic (although there are
fundamental limitations, due to way it times out constraint queries),
and this would be a great contribution to make, if anyone is interested.
Cristian
Many thanks!
Best Regards,
Hongxu Chen
On Wed, Nov 13, 2013 at 1:45 PM, Paul Marinescu
<[email protected] <mailto:[email protected]>>
wrote:
You may have missed a message sent to the list just a few days ago,
related to your non-determinism question
"You might want to take a look at our CAV'13 paper
(http://srg.doc.ic.ac.uk/publications/klee-multisolver-cav-13.html),
which discusses in more detail the constraint solving optimizations
in KLEE (and cex caching in particular) and also what we had to do
to get deterministic runs."
Paul
On 13 Nov 2013, at 04:48, Hongxu Chen <[email protected]
<mailto:[email protected]>> wrote:
BTW, since there are some non-determinisms in KLEE, can I totally
avoid them and let 2 executions of KLEE
comparable in general with certain options? Would you please share
some good practice?
Thanks in advance.
Best Regards,
Hongxu
On Wed, Nov 13, 2013 at 9:07 AM, Hongxu Chen
<[email protected] <mailto:[email protected]>> wrote:
Sorry that I forgot mentioning that we slightly modified KLEE
and just let it "exit on assert",
so the running time results are all generated under this
circumstance.
On Wed, Nov 13, 2013 at 12:10 AM, Hongxu Chen
<[email protected] <mailto:[email protected]>> wrote:
Dear all,
We are doing some experiments with some determinism.
I find that there was at least 2 threads about it before:
1. Non-determinism in
Klee(http://keeda.stanford.edu/pipermail/klee-dev/2010-September/000470.html)
2. computing the
coverage(http://keeda.stanford.edu/pipermail/klee-dev/2010-March/000251.html)
Unfortunately I failed to fully understand them.
So here is what we've done:
(1) We basically follow the options at "coreutils
experiments" page.
klee \
--simplify-sym-indices --write-cvcs --write-cov
--output-module \
--max-memory=1000 --disable-inlining --optimize
--use-forked-solver \
--use-cex-cache --libc=uclibc --posix-runtime \
--allow-external-sym-calls
--only-output-states-covering-new \
--environ=test.env --run-in=/tmp/sandbox \
--max-sym-array-size=4096 --max-instruction-time=30.
--max-time=3600. \
--watchdog --max-memory-inhibit=false
--max-static-fork-pct=1 \
--max-static-solve-pct=1 --max-static-cpfork-pct=1
--switch-type=internal \
*--randomize-fork* *--search=random-path
--search=nurs:covnew \ *
*--use-batching-search --batch-instructions=10000 \ *
./rm.bc --sym-args 0 1 10 --sym-args 0 2 2 --sym-files 1 8
--sym-stdout
Firstly, we change the search strategy to DFS, i.e.
*--search=dfs*
But when tested with a slightly /modified /_rm _case, we
found that there are
some HUGE differences for the running time: KLEE finds the
error within about
2400s for once, but about one day later it finds the exact
error within only 30s-50s!
*So is it a regular result*?
The only potential difference I can think out is: the
machine I ran KLEE on may be used
by other CPU-bound operations(but since I don't have
priviledge to know the
details of the machine I cannot make sure) when KLEE took
2400s to file the bug.
(2) Later in order to keep the results a bit more
determinist, we also
1. discard "*--randomize-fork*"
2. discard "*--use-batching-search
--batch-instructions=10000*"
So the final option we are using is
klee \
--simplify-sym-indices --write-cvcs --write-cov
--output-module \
--max-memory=1000 --disable-inlining --optimize
--use-forked-solver \
--use-cex-cache --libc=uclibc --posix-runtime \
--allow-external-sym-calls
--only-output-states-covering-new \
--environ=test.env --run-in=/tmp/sandbox \
--max-sym-array-size=4096 --max-instruction-time=30.
--max-time=3600. \
--watchdog --max-memory-inhibit=false
--max-static-fork-pct=1 \
--max-static-solve-pct=1 --max-static-cpfork-pct=1
--switch-type=internal \
*--search=dfs* \
./rm.bc --sym-args 0 1 10 --sym-args 0 2 2 --sym-files 1 8
--sym-stdout
However it seems that when running, there are still some
time difference
even on a SINGLE machine(still mainly about the time; but
it seems that
the time is still unstable. From what we observed,the
longest time may
be bigger than 10% than the shortest one).
And for 2 machines that almost have the same power and
system configurations,
the running time difference is even bigger.
The counter example path condition also has several
differences for
a simple test case(I only compared the diff of the xxx.pc
files and notice
there are several changes but didn't get a better
knowledge about the semantics).
*Is it reasonable?*
(3) Also I tested with a script by running with a simple case:
This case is taken from one of the previous issues on GITHUB:
https://github.com/ccadar/klee/issues/50
Only the "main" function's signature has been changed to
2-args' version.
#include <assert.h>
#include <klee/klee.h>
const char *const errmsg[2] = {0, };
const char *get_error_message(int err) {
char const *x = errmsg[err];
return x;
}
int main(int argc, char** argv) {
int err;
klee_make_symbolic(&err, sizeof(err), "err");
get_error_message(err);
}
I ran it with a script like below:
while [ 1 ]
do
klee --search=dfs test.bc
sleep 10
done
From the 306 results KLEE executed, the longest time is
76.88s(50.15%) and the
shortest is 41.89s(TSolver: 48.22%). *
So is it common?*
Also I notice that when using a zero-args version of
"main", the time will be
much less; is it because the function function call
"stack" or the
environment(but there is no posix-runtime here)?
Best regards,
Hongxu Chen
_______________________________________________
klee-dev mailing list
[email protected] <mailto:[email protected]>
https://mailman.ic.ac.uk/mailman/listinfo/klee-dev
_______________________________________________
klee-dev mailing list
[email protected]
https://mailman.ic.ac.uk/mailman/listinfo/klee-dev
_______________________________________________
klee-dev mailing list
[email protected]
https://mailman.ic.ac.uk/mailman/listinfo/klee-dev